blob: 71c7ca201ca4edd3148a1b87718feee9fa3f4c43 [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
11
Daniel Dunbara2aedc62009-03-18 10:01:51 +000012#include "clang/Driver/Action.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000013#include "clang/Driver/Arg.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000014#include "clang/Driver/ArgList.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000015#include "clang/Driver/Driver.h"
16#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000017#include "clang/Driver/Compilation.h"
18#include "clang/Driver/Job.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000019#include "clang/Driver/Option.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000020#include "clang/Driver/Options.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000021#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Util.h"
John McCall5fb5df92012-06-20 06:18:46 +000023#include "clang/Basic/ObjCRuntime.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000024
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000025#include "llvm/ADT/SmallString.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000026#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000027#include "llvm/ADT/Twine.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000028#include "llvm/Support/FileSystem.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000029#include "llvm/Support/Format.h"
30#include "llvm/Support/raw_ostream.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000031#include "llvm/Support/Host.h"
32#include "llvm/Support/Process.h"
John McCall31168b02011-06-15 23:02:42 +000033#include "llvm/Support/ErrorHandling.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000034
35#include "InputInfo.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000036#include "ToolChains.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000037
Daniel Dunbar1a093d22009-03-18 06:00:36 +000038using namespace clang::driver;
39using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000040using namespace clang;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000041
Daniel Dunbar64198ef2009-09-10 01:21:05 +000042/// CheckPreprocessingOptions - Perform some validation of preprocessing
43/// arguments that is shared with gcc.
44static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
45 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
Joerg Sonnenbergerb86f5f42011-03-06 23:31:01 +000046 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP)
Chris Lattner0e62c1c2011-07-23 10:55:15 +000047 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar64198ef2009-09-10 01:21:05 +000048 << A->getAsString(Args) << "-E";
49}
50
Daniel Dunbar4eadb602009-09-10 01:21:12 +000051/// CheckCodeGenerationOptions - Perform some validation of code generation
52/// arguments that is shared with gcc.
53static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
54 // In gcc, only ARM checks this, but it seems reasonable to check universally.
55 if (Args.hasArg(options::OPT_static))
56 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
57 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000058 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000059 << A->getAsString(Args) << "-static";
60}
61
Chris Lattnerbf2803f2010-03-29 17:55:58 +000062// Quote target names for inclusion in GNU Make dependency files.
63// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000064static void QuoteTarget(StringRef Target,
65 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +000066 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
67 switch (Target[i]) {
68 case ' ':
69 case '\t':
70 // Escape the preceding backslashes
71 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
72 Res.push_back('\\');
73
74 // Escape the space/tab
75 Res.push_back('\\');
76 break;
77 case '$':
78 Res.push_back('$');
79 break;
80 case '#':
81 Res.push_back('\\');
82 break;
83 default:
84 break;
85 }
86
87 Res.push_back(Target[i]);
88 }
89}
90
Bill Wendlingc0938f32012-03-12 22:10:06 +000091static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +000092 ArgStringList &CmdArgs,
93 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +000094 const char *EnvVar) {
95 const char *DirList = ::getenv(EnvVar);
Bill Wendling281ca292012-03-12 21:22:35 +000096 if (!DirList)
97 return; // Nothing to do.
98
99 StringRef Dirs(DirList);
100 if (Dirs.empty()) // Empty string should not add '.'.
101 return;
102
103 StringRef::size_type Delim;
104 while ((Delim = Dirs.find(llvm::sys::PathSeparator)) != StringRef::npos) {
105 if (Delim == 0) { // Leading colon.
106 CmdArgs.push_back(ArgName);
107 CmdArgs.push_back(".");
108 } else {
109 CmdArgs.push_back(ArgName);
Nico Weber89355782012-03-19 15:00:03 +0000110 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
Bill Wendling281ca292012-03-12 21:22:35 +0000111 }
Nico Weber89355782012-03-19 15:00:03 +0000112 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000113 }
114
115 if (Dirs.empty()) { // Trailing colon.
116 CmdArgs.push_back(ArgName);
117 CmdArgs.push_back(".");
118 } else { // Add the last path.
119 CmdArgs.push_back(ArgName);
120 CmdArgs.push_back(Args.MakeArgString(Dirs));
121 }
122}
123
Daniel Dunbar54423b22010-09-17 00:24:54 +0000124static void AddLinkerInputs(const ToolChain &TC,
125 const InputInfoList &Inputs, const ArgList &Args,
126 ArgStringList &CmdArgs) {
127 const Driver &D = TC.getDriver();
128
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000129 // Add extra linker input arguments which are not treated as inputs
130 // (constructed via -Xarch_).
131 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
132
Daniel Dunbar54423b22010-09-17 00:24:54 +0000133 for (InputInfoList::const_iterator
134 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
135 const InputInfo &II = *it;
136
137 if (!TC.HasNativeLLVMSupport()) {
138 // Don't try to pass LLVM inputs unless we have native support.
139 if (II.getType() == types::TY_LLVM_IR ||
140 II.getType() == types::TY_LTO_IR ||
141 II.getType() == types::TY_LLVM_BC ||
142 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000143 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000144 << TC.getTripleString();
145 }
146
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000147 // Add filenames immediately.
148 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000149 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000150 continue;
151 }
152
153 // Otherwise, this is a linker input argument.
154 const Arg &A = II.getInputArg();
155
156 // Handle reserved library options.
157 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000158 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Senafeb03b2010-09-17 18:39:08 +0000159 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
160 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000161 } else
162 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar54423b22010-09-17 00:24:54 +0000163 }
Bill Wendling281ca292012-03-12 21:22:35 +0000164
165 // LIBRARY_PATH - included following the user specified library paths.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000166 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000167}
168
John McCall31168b02011-06-15 23:02:42 +0000169/// \brief Determine whether Objective-C automated reference counting is
170/// enabled.
171static bool isObjCAutoRefCount(const ArgList &Args) {
172 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
173}
174
Ted Kremeneke65b0862012-03-06 20:05:56 +0000175/// \brief Determine whether we are linking the ObjC runtime.
176static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000177 if (isObjCAutoRefCount(Args)) {
178 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000179 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000180 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000181 return Args.hasArg(options::OPT_fobjc_link_runtime);
182}
183
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000184static void addProfileRT(const ToolChain &TC, const ArgList &Args,
Bill Wendling08760582011-06-27 19:15:03 +0000185 ArgStringList &CmdArgs,
186 llvm::Triple Triple) {
187 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
188 Args.hasArg(options::OPT_fprofile_generate) ||
189 Args.hasArg(options::OPT_fcreate_profile) ||
190 Args.hasArg(options::OPT_coverage)))
191 return;
192
193 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
194 // the link line. We cannot do the same thing because unlike gcov there is a
195 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
196 // not supported by old linkers.
Benjamin Kramerf5fbe432011-11-07 16:02:25 +0000197 std::string ProfileRT =
198 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
Bill Wendling08760582011-06-27 19:15:03 +0000199
Bill Wendling08760582011-06-27 19:15:03 +0000200 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000201}
202
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000203void Clang::AddPreprocessingOptions(Compilation &C,
204 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000205 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000206 ArgStringList &CmdArgs,
207 const InputInfo &Output,
208 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000209 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000210
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000211 CheckPreprocessingOptions(D, Args);
212
213 Args.AddLastArg(CmdArgs, options::OPT_C);
214 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000215
216 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000217 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000218 (A = Args.getLastArg(options::OPT_MD)) ||
219 (A = Args.getLastArg(options::OPT_MMD))) {
220 // Determine the output location.
221 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000222 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000223 DepFile = MF->getValue(Args);
Peter Collingbourne119cfaa2011-11-21 00:01:05 +0000224 C.addFailureResultFile(DepFile);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000225 } else if (Output.getType() == types::TY_Dependencies) {
226 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000227 } else if (A->getOption().matches(options::OPT_M) ||
228 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000229 DepFile = "-";
230 } else {
231 DepFile = darwin::CC1::getDependencyFileName(Args, Inputs);
Peter Collingbourne119cfaa2011-11-21 00:01:05 +0000232 C.addFailureResultFile(DepFile);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000233 }
234 CmdArgs.push_back("-dependency-file");
235 CmdArgs.push_back(DepFile);
236
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000237 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000238 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
239 const char *DepTarget;
240
241 // If user provided -o, that is the dependency target, except
242 // when we are only generating a dependency file.
243 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
244 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
245 DepTarget = OutputOpt->getValue(Args);
246 } else {
247 // Otherwise derive from the base input.
248 //
249 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000250 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000251 llvm::sys::path::replace_extension(P, "o");
252 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000253 }
254
255 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000256 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000257 QuoteTarget(DepTarget, Quoted);
258 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000259 }
260
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000261 if (A->getOption().matches(options::OPT_M) ||
262 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000263 CmdArgs.push_back("-sys-header-deps");
264 }
265
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000266 if (Args.hasArg(options::OPT_MG)) {
267 if (!A || A->getOption().matches(options::OPT_MD) ||
268 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000269 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000270 CmdArgs.push_back("-MG");
271 }
272
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000273 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000274
275 // Convert all -MQ <target> args to -MT <quoted target>
276 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
277 options::OPT_MQ),
278 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000279 const Arg *A = *it;
280 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000281
Daniel Dunbara442fd52010-06-11 22:00:13 +0000282 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000283 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000284 SmallString<128> Quoted;
Daniel Dunbara442fd52010-06-11 22:00:13 +0000285 QuoteTarget(A->getValue(Args), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000286 CmdArgs.push_back(Args.MakeArgString(Quoted));
287
288 // -MT flag - no change
289 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000290 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000291 }
292 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293
Douglas Gregor111af7d2009-04-18 00:34:01 +0000294 // Add -i* options, and automatically translate to
295 // -include-pch/-include-pth for transparent PCH support. It's
296 // wonky, but we include looking for .gch so we can support seamless
297 // replacement into a build system already set up to be generating
298 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000299 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000300 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
301 ie = Args.filtered_end(); it != ie; ++it) {
302 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000303
304 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000305 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
306 RenderedImplicitInclude = true;
307
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000308 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000309 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000310
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000311 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000312 bool FoundPCH = false;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000313 llvm::sys::Path P(A->getValue(Args));
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000314 bool Exists;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000315 if (UsePCH) {
Douglas Gregor111af7d2009-04-18 00:34:01 +0000316 P.appendSuffix("pch");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000317 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregor111af7d2009-04-18 00:34:01 +0000318 FoundPCH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000319 else
Douglas Gregor111af7d2009-04-18 00:34:01 +0000320 P.eraseSuffix();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321 }
322
Douglas Gregor111af7d2009-04-18 00:34:01 +0000323 if (!FoundPCH) {
324 P.appendSuffix("pth");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000325 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregor111af7d2009-04-18 00:34:01 +0000326 FoundPTH = true;
327 else
328 P.eraseSuffix();
Mike Stump11289f42009-09-09 15:08:12 +0000329 }
330
Douglas Gregor111af7d2009-04-18 00:34:01 +0000331 if (!FoundPCH && !FoundPTH) {
332 P.appendSuffix("gch");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000333 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000334 FoundPCH = UsePCH;
335 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000336 }
Mike Stump11289f42009-09-09 15:08:12 +0000337 else
Douglas Gregor111af7d2009-04-18 00:34:01 +0000338 P.eraseSuffix();
339 }
340
341 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000342 if (IsFirstImplicitInclude) {
343 A->claim();
344 if (UsePCH)
345 CmdArgs.push_back("-include-pch");
346 else
347 CmdArgs.push_back("-include-pth");
348 CmdArgs.push_back(Args.MakeArgString(P.str()));
349 continue;
350 } else {
351 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000352 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000353 << P.str() << A->getAsString(Args);
354 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000355 }
356 }
357
358 // Not translated, render as usual.
359 A->claim();
360 A->render(Args, CmdArgs);
361 }
362
363 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000364 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
365 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000366
367 // Add -Wp, and -Xassembler if using the preprocessor.
368
369 // FIXME: There is a very unfortunate problem here, some troubled
370 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
371 // really support that we would have to parse and then translate
372 // those options. :(
373 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
374 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000375
376 // -I- is a deprecated GCC feature, reject it.
377 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000378 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000379
380 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
381 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000382 StringRef sysroot = C.getSysRoot();
383 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000384 if (!Args.hasArg(options::OPT_isysroot)) {
385 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000386 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000387 }
388 }
Douglas Gregorf936f782011-09-14 20:28:46 +0000389
390 // If a module path was provided, pass it along. Otherwise, use a temporary
391 // directory.
392 if (Arg *A = Args.getLastArg(options::OPT_fmodule_cache_path)) {
Douglas Gregorf936f782011-09-14 20:28:46 +0000393 A->claim();
394 A->render(Args, CmdArgs);
395 } else {
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000396 SmallString<128> DefaultModuleCache;
Douglas Gregorf936f782011-09-14 20:28:46 +0000397 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
398 DefaultModuleCache);
399 llvm::sys::path::append(DefaultModuleCache, "clang-module-cache");
400 CmdArgs.push_back("-fmodule-cache-path");
401 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
402 }
Douglas Gregor97eec242011-09-15 22:00:41 +0000403
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000404 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000405 // FIXME: We should probably sink the logic for handling these from the
406 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000407 // CPATH - included following the user specified includes (but prior to
408 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000409 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000410 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000411 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000412 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000413 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000414 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000415 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000416 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000417 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000418
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000419 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000420 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000421 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000422
423 // Add system include arguments.
424 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000425}
426
Daniel Dunbarf492c922009-09-10 22:59:51 +0000427/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000428/// CPU.
429//
430// FIXME: This is redundant with -mcpu, why does LLVM use this.
431// FIXME: tblgen this, or kill it!
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000432static const char *getLLVMArchSuffixForARM(StringRef CPU) {
Chad Rosier9ac84512011-10-07 17:48:56 +0000433 return llvm::StringSwitch<const char *>(CPU)
434 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
435 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
436 .Cases("arm920", "arm920t", "arm922t", "v4t")
437 .Cases("arm940t", "ep9312","v4t")
438 .Cases("arm10tdmi", "arm1020t", "v5")
439 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
440 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
441 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
442 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
443 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
444 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Silviu Baranga157f7c62012-09-13 15:06:00 +0000445 .Cases("cortex-a8", "cortex-a9", "cortex-a15", "v7")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000446 .Case("cortex-m3", "v7m")
Jim Grosbach903e63f2012-03-29 19:53:34 +0000447 .Case("cortex-m4", "v7m")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000448 .Case("cortex-m0", "v6m")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000449 .Case("cortex-a9-mp", "v7f")
450 .Case("swift", "v7s")
Chad Rosier9ac84512011-10-07 17:48:56 +0000451 .Default("");
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000452}
453
Benjamin Kramer09811c72012-06-26 22:20:06 +0000454/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
455//
456// FIXME: tblgen this.
457static std::string getARMTargetCPU(const ArgList &Args,
458 const llvm::Triple &Triple) {
459 // FIXME: Warn on inconsistent use of -mcpu and -march.
460
461 // If we have -mcpu=, use that.
462 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
463 StringRef MCPU = A->getValue(Args);
464 // Handle -mcpu=native.
465 if (MCPU == "native")
466 return llvm::sys::getHostCPUName();
467 else
468 return MCPU;
469 }
470
471 StringRef MArch;
472 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
473 // Otherwise, if we have -march= choose the base CPU for that arch.
474 MArch = A->getValue(Args);
475 } else {
476 // Otherwise, use the Arch from the triple.
477 MArch = Triple.getArchName();
478 }
479
480 // Handle -march=native.
481 std::string NativeMArch;
482 if (MArch == "native") {
483 std::string CPU = llvm::sys::getHostCPUName();
484 if (CPU != "generic") {
485 // Translate the native cpu into the architecture. The switch below will
486 // then chose the minimum cpu for that arch.
487 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
488 MArch = NativeMArch;
489 }
490 }
491
492 return llvm::StringSwitch<const char *>(MArch)
493 .Cases("armv2", "armv2a","arm2")
494 .Case("armv3", "arm6")
495 .Case("armv3m", "arm7m")
496 .Cases("armv4", "armv4t", "arm7tdmi")
497 .Cases("armv5", "armv5t", "arm10tdmi")
498 .Cases("armv5e", "armv5te", "arm1022e")
499 .Case("armv5tej", "arm926ej-s")
500 .Cases("armv6", "armv6k", "arm1136jf-s")
501 .Case("armv6j", "arm1136j-s")
502 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
503 .Case("armv6t2", "arm1156t2-s")
504 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000505 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
506 .Cases("armv7s", "armv7-s", "swift")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000507 .Cases("armv7r", "armv7-r", "cortex-r4")
508 .Cases("armv7m", "armv7-m", "cortex-m3")
509 .Case("ep9312", "ep9312")
510 .Case("iwmmxt", "iwmmxt")
511 .Case("xscale", "xscale")
512 .Cases("armv6m", "armv6-m", "cortex-m0")
513 // If all else failed, return the most base CPU LLVM supports.
514 .Default("arm7tdmi");
515}
516
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000517// FIXME: Move to target hook.
518static bool isSignedCharDefault(const llvm::Triple &Triple) {
519 switch (Triple.getArch()) {
520 default:
521 return true;
522
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000523 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000524 case llvm::Triple::ppc:
525 case llvm::Triple::ppc64:
Bob Wilson6524dd32011-10-14 05:03:44 +0000526 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000527 return true;
528 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000529 }
530}
531
Chad Rosiercfbfc582012-04-04 20:51:35 +0000532// Handle -mfpu=.
533//
534// FIXME: Centralize feature selection, defaulting shouldn't be also in the
535// frontend target.
536static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
537 ArgStringList &CmdArgs) {
538 StringRef FPU = A->getValue(Args);
539
540 // Set the target features based on the FPU.
541 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
542 // Disable any default FPU support.
543 CmdArgs.push_back("-target-feature");
544 CmdArgs.push_back("-vfp2");
545 CmdArgs.push_back("-target-feature");
546 CmdArgs.push_back("-vfp3");
547 CmdArgs.push_back("-target-feature");
548 CmdArgs.push_back("-neon");
549 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
550 CmdArgs.push_back("-target-feature");
551 CmdArgs.push_back("+vfp3");
552 CmdArgs.push_back("-target-feature");
553 CmdArgs.push_back("+d16");
554 CmdArgs.push_back("-target-feature");
555 CmdArgs.push_back("-neon");
556 } else if (FPU == "vfp") {
557 CmdArgs.push_back("-target-feature");
558 CmdArgs.push_back("+vfp2");
559 CmdArgs.push_back("-target-feature");
560 CmdArgs.push_back("-neon");
561 } else if (FPU == "vfp3" || FPU == "vfpv3") {
562 CmdArgs.push_back("-target-feature");
563 CmdArgs.push_back("+vfp3");
564 CmdArgs.push_back("-target-feature");
565 CmdArgs.push_back("-neon");
566 } else if (FPU == "neon") {
567 CmdArgs.push_back("-target-feature");
568 CmdArgs.push_back("+neon");
569 } else
570 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
571}
572
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000573// Handle -mfpmath=.
574static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
Chad Rosier45619cb2012-04-04 22:13:40 +0000575 ArgStringList &CmdArgs, StringRef CPU) {
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000576 StringRef FPMath = A->getValue(Args);
577
578 // Set the target features based on the FPMath.
579 if (FPMath == "neon") {
580 CmdArgs.push_back("-target-feature");
581 CmdArgs.push_back("+neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000582
Silviu Baranga157f7c62012-09-13 15:06:00 +0000583 if (CPU != "cortex-a8" && CPU != "cortex-a9" && CPU != "cortex-a9-mp" &&
584 CPU != "cortex-a15")
Chad Rosier45619cb2012-04-04 22:13:40 +0000585 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
586
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000587 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
588 FPMath == "vfp4") {
589 CmdArgs.push_back("-target-feature");
590 CmdArgs.push_back("-neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000591
592 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000593 } else
594 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
595}
596
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000597// Select the float ABI as determined by -msoft-float, -mhard-float, and
598// -mfloat-abi=.
599static StringRef getARMFloatABI(const Driver &D,
600 const ArgList &Args,
601 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000602 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000603 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
604 options::OPT_mhard_float,
605 options::OPT_mfloat_abi_EQ)) {
606 if (A->getOption().matches(options::OPT_msoft_float))
607 FloatABI = "soft";
608 else if (A->getOption().matches(options::OPT_mhard_float))
609 FloatABI = "hard";
610 else {
611 FloatABI = A->getValue(Args);
612 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000613 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000614 << A->getAsString(Args);
615 FloatABI = "soft";
616 }
617 }
618 }
619
620 // If unspecified, choose the default based on the platform.
621 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000622 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000623 case llvm::Triple::Darwin:
624 case llvm::Triple::MacOSX:
625 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000626 // Darwin defaults to "softfp" for v6 and v7.
627 //
628 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000629 std::string ArchName =
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000630 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000631 if (StringRef(ArchName).startswith("v6") ||
632 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000633 FloatABI = "softfp";
634 else
635 FloatABI = "soft";
636 break;
637 }
638
639 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000640 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000641 case llvm::Triple::GNUEABIHF:
642 FloatABI = "hard";
643 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000644 case llvm::Triple::GNUEABI:
645 FloatABI = "softfp";
646 break;
647 case llvm::Triple::EABI:
648 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
649 FloatABI = "softfp";
650 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000651 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000652 std::string ArchName =
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000653 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000654 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000655 FloatABI = "softfp";
656 else
657 FloatABI = "soft";
658 break;
659 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000660 default:
661 // Assume "soft", but warn the user we are guessing.
662 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000663 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000664 break;
665 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000666 }
667 }
668
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000669 return FloatABI;
670}
671
672
673void Clang::AddARMTargetArgs(const ArgList &Args,
674 ArgStringList &CmdArgs,
675 bool KernelOrKext) const {
676 const Driver &D = getToolChain().getDriver();
Bob Wilson2afa0112012-09-29 23:52:58 +0000677 // Get the effective triple, which takes into account the deployment target.
678 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
679 llvm::Triple Triple(TripleStr);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000680
681 // Select the ABI to use.
682 //
683 // FIXME: Support -meabi.
684 const char *ABIName = 0;
685 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
686 ABIName = A->getValue(Args);
687 } else {
688 // Select the default based on the platform.
689 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000690 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000691 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000692 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000693 ABIName = "aapcs-linux";
694 break;
695 case llvm::Triple::EABI:
696 ABIName = "aapcs";
697 break;
698 default:
699 ABIName = "apcs-gnu";
700 }
701 }
702 CmdArgs.push_back("-target-abi");
703 CmdArgs.push_back(ABIName);
704
705 // Set the CPU based on -march= and -mcpu=.
706 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +0000707 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000708
709 // Determine floating point ABI from the options & target defaults.
710 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000711 if (FloatABI == "soft") {
712 // Floating point operations and argument passing are soft.
713 //
714 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000715 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000716 CmdArgs.push_back("-mfloat-abi");
717 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000718 } else if (FloatABI == "softfp") {
719 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000720 CmdArgs.push_back("-mfloat-abi");
721 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000722 } else {
723 // Floating point operations and argument passing are hard.
724 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000725 CmdArgs.push_back("-mfloat-abi");
726 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000727 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000728
729 // Set appropriate target features for floating point mode.
730 //
731 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
732 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
733 // stripped out by the ARM target.
734
735 // Use software floating point operations?
736 if (FloatABI == "soft") {
737 CmdArgs.push_back("-target-feature");
738 CmdArgs.push_back("+soft-float");
739 }
740
741 // Use software floating point argument passing?
742 if (FloatABI != "hard") {
743 CmdArgs.push_back("-target-feature");
744 CmdArgs.push_back("+soft-float-abi");
745 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +0000746
747 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +0000748 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +0000749 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000750
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000751 // Honor -mfpmath=.
752 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +0000753 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000754
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000755 // Setting -msoft-float effectively disables NEON because of the GCC
756 // implementation, although the same isn't true of VFP or VFP3.
757 if (FloatABI == "soft") {
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000758 CmdArgs.push_back("-target-feature");
759 CmdArgs.push_back("-neon");
760 }
761
762 // Kernel code has more strict alignment requirements.
763 if (KernelOrKext) {
Bob Wilson2afa0112012-09-29 23:52:58 +0000764 if (Triple.getOS() != llvm::Triple::IOS || Triple.isOSVersionLT(6)) {
765 CmdArgs.push_back("-backend-option");
766 CmdArgs.push_back("-arm-long-calls");
767 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000768
Daniel Dunbar12100e22011-03-22 16:48:17 +0000769 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000770 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000771
772 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000773 CmdArgs.push_back("-backend-option");
774 CmdArgs.push_back("-arm-darwin-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000775 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000776
777 // Setting -mno-global-merge disables the codegen global merge pass. Setting
778 // -mglobal-merge has no effect as the pass is enabled by default.
779 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
780 options::OPT_mno_global_merge)) {
781 if (A->getOption().matches(options::OPT_mno_global_merge))
782 CmdArgs.push_back("-mno-global-merge");
783 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000784
Chad Rosierc14ded72012-05-16 21:19:55 +0000785 if (Args.hasArg(options::OPT_mno_implicit_float))
Chad Rosierf1985d22012-05-16 20:40:09 +0000786 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000787}
788
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000789// Translate MIPS CPU name alias option to CPU name.
790static StringRef getMipsCPUFromAlias(const Arg &A) {
791 if (A.getOption().matches(options::OPT_mips32))
792 return "mips32";
793 if (A.getOption().matches(options::OPT_mips32r2))
794 return "mips32r2";
795 if (A.getOption().matches(options::OPT_mips64))
796 return "mips64";
797 if (A.getOption().matches(options::OPT_mips64r2))
798 return "mips64r2";
799 llvm_unreachable("Unexpected option");
800 return "";
801}
802
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000803// Get CPU and ABI names. They are not independent
804// so we have to calculate them together.
805static void getMipsCPUAndABI(const ArgList &Args,
806 const ToolChain &TC,
807 StringRef &CPUName,
808 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000809 const char *DefMips32CPU = "mips32";
810 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000811
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000812 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000813 options::OPT_mcpu_EQ,
814 options::OPT_mips_CPUs_Group)) {
815 if (A->getOption().matches(options::OPT_mips_CPUs_Group))
816 CPUName = getMipsCPUFromAlias(*A);
817 else
818 CPUName = A->getValue(Args);
819 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000820
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000821 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
Eric Christopher0b26a612010-03-02 02:41:08 +0000822 ABIName = A->getValue(Args);
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000823
824 // Setup default CPU and ABI names.
825 if (CPUName.empty() && ABIName.empty()) {
826 switch (TC.getTriple().getArch()) {
827 default:
828 llvm_unreachable("Unexpected triple arch name");
829 case llvm::Triple::mips:
830 case llvm::Triple::mipsel:
831 CPUName = DefMips32CPU;
832 break;
833 case llvm::Triple::mips64:
834 case llvm::Triple::mips64el:
835 CPUName = DefMips64CPU;
836 break;
837 }
838 }
839
840 if (!ABIName.empty()) {
841 // Deduce CPU name from ABI name.
842 CPUName = llvm::StringSwitch<const char *>(ABIName)
843 .Cases("o32", "eabi", DefMips32CPU)
844 .Cases("n32", "n64", DefMips64CPU)
845 .Default("");
846 }
847 else if (!CPUName.empty()) {
848 // Deduce ABI name from CPU name.
849 ABIName = llvm::StringSwitch<const char *>(CPUName)
850 .Cases("mips32", "mips32r2", "o32")
851 .Cases("mips64", "mips64r2", "n64")
852 .Default("");
853 }
854
855 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000856}
857
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000858// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
859// and -mfloat-abi=.
860static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000861 // Select the float ABI as determined by -msoft-float, -mhard-float,
862 // and -mfloat-abi=.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000863 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000864 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000865 options::OPT_mhard_float,
866 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000867 if (A->getOption().matches(options::OPT_msoft_float))
868 FloatABI = "soft";
869 else if (A->getOption().matches(options::OPT_mhard_float))
870 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000871 else {
872 FloatABI = A->getValue(Args);
873 if (FloatABI != "soft" && FloatABI != "single" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000874 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000875 FloatABI = "hard";
876 }
877 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000878 }
879
880 // If unspecified, choose the default based on the platform.
881 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000882 // Assume "hard", because it's a default value used by gcc.
883 // When we start to recognize specific target MIPS processors,
884 // we will be able to select the default more correctly.
885 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000886 }
887
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000888 return FloatABI;
889}
890
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000891static void AddTargetFeature(const ArgList &Args,
892 ArgStringList &CmdArgs,
893 OptSpecifier OnOpt,
894 OptSpecifier OffOpt,
895 StringRef FeatureName) {
896 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
897 CmdArgs.push_back("-target-feature");
898 if (A->getOption().matches(OnOpt))
899 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
900 else
901 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
902 }
903}
904
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000905void Clang::AddMIPSTargetArgs(const ArgList &Args,
906 ArgStringList &CmdArgs) const {
907 const Driver &D = getToolChain().getDriver();
908 StringRef CPUName;
909 StringRef ABIName;
910 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
911
912 CmdArgs.push_back("-target-cpu");
913 CmdArgs.push_back(CPUName.data());
914
915 CmdArgs.push_back("-target-abi");
916 CmdArgs.push_back(ABIName.data());
917
918 StringRef FloatABI = getMipsFloatABI(D, Args);
919
Eric Christopher0b26a612010-03-02 02:41:08 +0000920 if (FloatABI == "soft") {
921 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +0000922 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000923 CmdArgs.push_back("-mfloat-abi");
924 CmdArgs.push_back("soft");
925
926 // FIXME: Note, this is a hack. We need to pass the selected float
927 // mode to the MipsTargetInfoBase to define appropriate macros there.
928 // Now it is the only method.
929 CmdArgs.push_back("-target-feature");
930 CmdArgs.push_back("+soft-float");
931 }
932 else if (FloatABI == "single") {
933 // Restrict the use of hardware floating-point
934 // instructions to 32-bit operations.
935 CmdArgs.push_back("-target-feature");
936 CmdArgs.push_back("+single-float");
937 }
938 else {
939 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +0000940 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000941 CmdArgs.push_back("-mfloat-abi");
942 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +0000943 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +0000944
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000945 AddTargetFeature(Args, CmdArgs,
946 options::OPT_mips16, options::OPT_mno_mips16,
947 "mips16");
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +0000948 AddTargetFeature(Args, CmdArgs,
949 options::OPT_mdsp, options::OPT_mno_dsp,
950 "dsp");
951 AddTargetFeature(Args, CmdArgs,
952 options::OPT_mdspr2, options::OPT_mno_dspr2,
953 "dspr2");
Simon Atanasyanec4b1c12012-08-27 20:55:56 +0000954
955 if (Arg *A = Args.getLastArg(options::OPT_G)) {
956 StringRef v = A->getValue(Args);
957 CmdArgs.push_back("-mllvm");
958 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
959 A->claim();
960 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000961}
962
Hal Finkel8eb59282012-06-11 22:35:19 +0000963/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
964static std::string getPPCTargetCPU(const ArgList &Args) {
965 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
966 StringRef CPUName = A->getValue(Args);
967
968 if (CPUName == "native") {
969 std::string CPU = llvm::sys::getHostCPUName();
970 if (!CPU.empty() && CPU != "generic")
971 return CPU;
972 else
973 return "";
974 }
975
976 return llvm::StringSwitch<const char *>(CPUName)
977 .Case("common", "generic")
978 .Case("440", "440")
979 .Case("440fp", "440")
980 .Case("450", "450")
981 .Case("601", "601")
982 .Case("602", "602")
983 .Case("603", "603")
984 .Case("603e", "603e")
985 .Case("603ev", "603ev")
986 .Case("604", "604")
987 .Case("604e", "604e")
988 .Case("620", "620")
989 .Case("G3", "g3")
990 .Case("7400", "7400")
991 .Case("G4", "g4")
992 .Case("7450", "7450")
993 .Case("G4+", "g4+")
994 .Case("750", "750")
995 .Case("970", "970")
996 .Case("G5", "g5")
997 .Case("a2", "a2")
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000998 .Case("e500mc", "e500mc")
999 .Case("e5500", "e5500")
Hal Finkel8eb59282012-06-11 22:35:19 +00001000 .Case("power6", "pwr6")
1001 .Case("power7", "pwr7")
1002 .Case("powerpc", "ppc")
1003 .Case("powerpc64", "ppc64")
1004 .Default("");
1005 }
1006
1007 return "";
1008}
1009
1010void Clang::AddPPCTargetArgs(const ArgList &Args,
1011 ArgStringList &CmdArgs) const {
1012 std::string TargetCPUName = getPPCTargetCPU(Args);
1013
1014 // LLVM may default to generating code for the native CPU,
1015 // but, like gcc, we default to a more generic option for
1016 // each architecture. (except on Darwin)
1017 llvm::Triple Triple = getToolChain().getTriple();
1018 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1019 if (Triple.getArch() == llvm::Triple::ppc64)
1020 TargetCPUName = "ppc64";
1021 else
1022 TargetCPUName = "ppc";
1023 }
1024
1025 if (!TargetCPUName.empty()) {
1026 CmdArgs.push_back("-target-cpu");
1027 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1028 }
1029}
1030
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001031void Clang::AddSparcTargetArgs(const ArgList &Args,
1032 ArgStringList &CmdArgs) const {
1033 const Driver &D = getToolChain().getDriver();
1034
1035 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001036 CmdArgs.push_back("-target-cpu");
Benjamin Kramereed4f2a2011-12-26 14:18:37 +00001037 CmdArgs.push_back(A->getValue(Args));
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001038 }
1039
1040 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001041 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001042 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1043 options::OPT_mhard_float)) {
1044 if (A->getOption().matches(options::OPT_msoft_float))
1045 FloatABI = "soft";
1046 else if (A->getOption().matches(options::OPT_mhard_float))
1047 FloatABI = "hard";
1048 }
1049
1050 // If unspecified, choose the default based on the platform.
1051 if (FloatABI.empty()) {
1052 switch (getToolChain().getTriple().getOS()) {
1053 default:
1054 // Assume "soft", but warn the user we are guessing.
1055 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001056 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001057 break;
1058 }
1059 }
1060
1061 if (FloatABI == "soft") {
1062 // Floating point operations and argument passing are soft.
1063 //
1064 // FIXME: This changes CPP defines, we need -target-soft-float.
1065 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001066 CmdArgs.push_back("-target-feature");
1067 CmdArgs.push_back("+soft-float");
1068 } else {
1069 assert(FloatABI == "hard" && "Invalid float abi!");
1070 CmdArgs.push_back("-mhard-float");
1071 }
1072}
1073
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001074void Clang::AddX86TargetArgs(const ArgList &Args,
1075 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001076 if (!Args.hasFlag(options::OPT_mred_zone,
1077 options::OPT_mno_red_zone,
1078 true) ||
1079 Args.hasArg(options::OPT_mkernel) ||
1080 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001081 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001082
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001083 if (Args.hasFlag(options::OPT_msoft_float,
1084 options::OPT_mno_soft_float,
1085 false))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001086 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001087
Daniel Dunbare13ada62009-11-14 22:04:54 +00001088 const char *CPUName = 0;
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001089 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001090 if (StringRef(A->getValue(Args)) == "native") {
Daniel Dunbare13ada62009-11-14 22:04:54 +00001091 // FIXME: Reject attempts to use -march=native unless the target matches
1092 // the host.
1093 //
1094 // FIXME: We should also incorporate the detected target features for use
1095 // with -native.
1096 std::string CPU = llvm::sys::getHostCPUName();
Bob Wilsone78227b2012-05-09 17:53:10 +00001097 if (!CPU.empty() && CPU != "generic")
Daniel Dunbare13ada62009-11-14 22:04:54 +00001098 CPUName = Args.MakeArgString(CPU);
1099 } else
1100 CPUName = A->getValue(Args);
1101 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001102
Daniel Dunbare13ada62009-11-14 22:04:54 +00001103 // Select the default CPU if none was given (or detection failed).
1104 if (!CPUName) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001105 // FIXME: Need target hooks.
Bob Wilson6524dd32011-10-14 05:03:44 +00001106 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001107 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001108 CPUName = "core2";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001109 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001110 CPUName = "yonah";
Chris Lattnerb986aba2010-04-11 19:29:39 +00001111 } else if (getToolChain().getOS().startswith("haiku")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001112 if (getToolChain().getArch() == llvm::Triple::x86_64)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001113 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001114 else if (getToolChain().getArch() == llvm::Triple::x86)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001115 CPUName = "i586";
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001116 } else if (getToolChain().getOS().startswith("openbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001117 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001118 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001119 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001120 CPUName = "i486";
Eli Friedman9fa28852012-08-08 23:57:20 +00001121 } else if (getToolChain().getOS().startswith("bitrig")) {
1122 if (getToolChain().getArch() == llvm::Triple::x86_64)
1123 CPUName = "x86-64";
1124 else if (getToolChain().getArch() == llvm::Triple::x86)
1125 CPUName = "i686";
Roman Divacky432f10d2011-03-01 18:11:37 +00001126 } else if (getToolChain().getOS().startswith("freebsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001127 if (getToolChain().getArch() == llvm::Triple::x86_64)
Roman Divacky432f10d2011-03-01 18:11:37 +00001128 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001129 else if (getToolChain().getArch() == llvm::Triple::x86)
Roman Divacky432f10d2011-03-01 18:11:37 +00001130 CPUName = "i486";
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001131 } else if (getToolChain().getOS().startswith("netbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001132 if (getToolChain().getArch() == llvm::Triple::x86_64)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001133 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001134 else if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001135 CPUName = "i486";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001136 } else {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001137 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001138 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001139 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001140 CPUName = "pentium4";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001141 }
1142 }
1143
Daniel Dunbare13ada62009-11-14 22:04:54 +00001144 if (CPUName) {
Daniel Dunbara7d02312009-12-18 06:30:12 +00001145 CmdArgs.push_back("-target-cpu");
Daniel Dunbare13ada62009-11-14 22:04:54 +00001146 CmdArgs.push_back(CPUName);
1147 }
1148
Eli Friedmanad811f02011-07-02 00:34:19 +00001149 // The required algorithm here is slightly strange: the options are applied
1150 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1151 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1152 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1153 // former correctly, but not the latter; handle directly-overridden
1154 // attributes here.
1155 llvm::StringMap<unsigned> PrevFeature;
1156 std::vector<const char*> Features;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001157 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1158 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001159 StringRef Name = (*it)->getOption().getName();
Daniel Dunbara442fd52010-06-11 22:00:13 +00001160 (*it)->claim();
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001161
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001162 // Skip over "-m".
1163 assert(Name.startswith("-m") && "Invalid feature name.");
1164 Name = Name.substr(2);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001165
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001166 bool IsNegative = Name.startswith("no-");
1167 if (IsNegative)
1168 Name = Name.substr(3);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001169
Eli Friedmanad811f02011-07-02 00:34:19 +00001170 unsigned& Prev = PrevFeature[Name];
1171 if (Prev)
1172 Features[Prev - 1] = 0;
1173 Prev = Features.size() + 1;
1174 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1175 }
1176 for (unsigned i = 0; i < Features.size(); i++) {
1177 if (Features[i]) {
1178 CmdArgs.push_back("-target-feature");
1179 CmdArgs.push_back(Features[i]);
1180 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001181 }
1182}
1183
Tony Linthicum76329bf2011-12-12 21:14:55 +00001184static Arg* getLastHexagonArchArg (const ArgList &Args)
1185{
1186 Arg * A = NULL;
1187
Sebastian Pop86500282012-01-13 20:37:10 +00001188 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
1189 it != ie; ++it) {
1190 if ((*it)->getOption().matches(options::OPT_march_EQ) ||
Tony Linthicum76329bf2011-12-12 21:14:55 +00001191 (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
1192 A = *it;
1193 A->claim();
1194 }
Sebastian Pop86500282012-01-13 20:37:10 +00001195 else if ((*it)->getOption().matches(options::OPT_m_Joined)){
1196 StringRef Value = (*it)->getValue(Args,0);
1197 if (Value.startswith("v")) {
1198 A = *it;
1199 A->claim();
1200 }
1201 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001202 }
1203 return A;
1204}
1205
Sebastian Pop86500282012-01-13 20:37:10 +00001206static StringRef getHexagonTargetCPU(const ArgList &Args)
Tony Linthicum76329bf2011-12-12 21:14:55 +00001207{
1208 Arg *A;
1209 llvm::StringRef WhichHexagon;
1210
Sebastian Pop86500282012-01-13 20:37:10 +00001211 // Select the default CPU (v4) if none was given or detection failed.
Tony Linthicum76329bf2011-12-12 21:14:55 +00001212 if ((A = getLastHexagonArchArg (Args))) {
Sebastian Pop86500282012-01-13 20:37:10 +00001213 WhichHexagon = A->getValue(Args);
1214 if (WhichHexagon == "")
1215 return "v4";
1216 else
1217 return WhichHexagon;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001218 }
Sebastian Pop86500282012-01-13 20:37:10 +00001219 else
1220 return "v4";
Tony Linthicum76329bf2011-12-12 21:14:55 +00001221}
1222
1223void Clang::AddHexagonTargetArgs(const ArgList &Args,
1224 ArgStringList &CmdArgs) const {
1225 llvm::Triple Triple = getToolChain().getTriple();
1226
1227 CmdArgs.push_back("-target-cpu");
Sebastian Pop86500282012-01-13 20:37:10 +00001228 CmdArgs.push_back(Args.MakeArgString("hexagon" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001229 CmdArgs.push_back("-fno-signed-char");
1230 CmdArgs.push_back("-nobuiltininc");
1231
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001232 if (Args.hasArg(options::OPT_mqdsp6_compat))
Tony Linthicum76329bf2011-12-12 21:14:55 +00001233 CmdArgs.push_back("-mqdsp6-compat");
1234
1235 if (Arg *A = Args.getLastArg(options::OPT_G,
1236 options::OPT_msmall_data_threshold_EQ)) {
1237 std::string SmallDataThreshold="-small-data-threshold=";
1238 SmallDataThreshold += A->getValue(Args);
1239 CmdArgs.push_back ("-mllvm");
1240 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
1241 A->claim();
1242 }
1243
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001244 if (!Args.hasArg(options::OPT_fno_short_enums))
1245 CmdArgs.push_back("-fshort-enums");
1246 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1247 CmdArgs.push_back ("-mllvm");
1248 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1249 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001250 CmdArgs.push_back ("-mllvm");
1251 CmdArgs.push_back ("-machine-sink-split=0");
1252}
1253
Eric Christopher84fbdb42011-08-19 00:30:14 +00001254static bool
John McCall5fb5df92012-06-20 06:18:46 +00001255shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001256 const llvm::Triple &Triple) {
1257 // We use the zero-cost exception tables for Objective-C if the non-fragile
1258 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1259 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001260 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001261 return true;
1262
Bob Wilson6524dd32011-10-14 05:03:44 +00001263 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001264 return false;
1265
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001266 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001267 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001268 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001269}
1270
Anders Carlssone96ab552011-02-28 02:27:16 +00001271/// addExceptionArgs - Adds exception related arguments to the driver command
1272/// arguments. There's a master flag, -fexceptions and also language specific
1273/// flags to enable/disable C++ and Objective-C exceptions.
1274/// This makes it possible to for example disable C++ exceptions but enable
1275/// Objective-C exceptions.
1276static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1277 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001278 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001279 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001280 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001281 if (KernelOrKext) {
1282 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1283 // arguments now to avoid warnings about unused arguments.
1284 Args.ClaimAllArgs(options::OPT_fexceptions);
1285 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1286 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1287 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1288 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1289 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001290 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001291 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001292
1293 // Exceptions are enabled by default.
1294 bool ExceptionsEnabled = true;
1295
1296 // This keeps track of whether exceptions were explicitly turned on or off.
1297 bool DidHaveExplicitExceptionFlag = false;
1298
Rafael Espindola00a66572009-10-01 13:33:33 +00001299 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1300 options::OPT_fno_exceptions)) {
1301 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001302 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001303 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001304 ExceptionsEnabled = false;
1305
1306 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001307 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001308
Anders Carlssone96ab552011-02-28 02:27:16 +00001309 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001310
Anders Carlssone96ab552011-02-28 02:27:16 +00001311 // Exception tables and cleanups can be enabled with -fexceptions even if the
1312 // language itself doesn't support exceptions.
1313 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1314 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001315
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001316 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1317 // is not necessarily sensible, but follows GCC.
1318 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001319 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001320 options::OPT_fno_objc_exceptions,
1321 true)) {
1322 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001323
Eric Christopher84fbdb42011-08-19 00:30:14 +00001324 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001325 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001326 }
1327
1328 if (types::isCXX(InputType)) {
1329 bool CXXExceptionsEnabled = ExceptionsEnabled;
1330
Eric Christopher84fbdb42011-08-19 00:30:14 +00001331 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1332 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001333 options::OPT_fexceptions,
1334 options::OPT_fno_exceptions)) {
1335 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1336 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001337 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001338 CXXExceptionsEnabled = false;
1339 }
1340
1341 if (CXXExceptionsEnabled) {
1342 CmdArgs.push_back("-fcxx-exceptions");
1343
1344 ShouldUseExceptionTables = true;
1345 }
1346 }
1347
1348 if (ShouldUseExceptionTables)
1349 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001350}
1351
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001352static bool ShouldDisableCFI(const ArgList &Args,
1353 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001354 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001355 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001356 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001357 // we disable them if we think the .s file will be passed to it.
Rafael Espindolac41db922012-03-08 14:39:55 +00001358 Default = Args.hasFlag(options::OPT_integrated_as,
1359 options::OPT_no_integrated_as,
1360 TC.IsIntegratedAssemblerDefault());
Rafael Espindolaf934f982011-05-17 16:26:17 +00001361 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001362 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
1363 options::OPT_fno_dwarf2_cfi_asm,
1364 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001365}
1366
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001367static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1368 const ToolChain &TC) {
1369 bool IsIADefault = TC.IsIntegratedAssemblerDefault();
1370 bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
1371 options::OPT_no_integrated_as,
1372 IsIADefault);
1373 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1374 options::OPT_fno_dwarf_directory_asm,
1375 UseIntegratedAs);
1376 return !UseDwarfDirectory;
1377}
1378
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001379/// \brief Check whether the given input tree contains any compilation actions.
1380static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001381 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001382 return true;
1383
1384 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1385 if (ContainsCompileAction(*it))
1386 return true;
1387
1388 return false;
1389}
1390
1391/// \brief Check if -relax-all should be passed to the internal assembler.
1392/// This is done by default when compiling non-assembler source with -O0.
1393static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1394 bool RelaxDefault = true;
1395
1396 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1397 RelaxDefault = A->getOption().matches(options::OPT_O0);
1398
1399 if (RelaxDefault) {
1400 RelaxDefault = false;
1401 for (ActionList::const_iterator it = C.getActions().begin(),
1402 ie = C.getActions().end(); it != ie; ++it) {
1403 if (ContainsCompileAction(*it)) {
1404 RelaxDefault = true;
1405 break;
1406 }
1407 }
1408 }
1409
1410 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1411 RelaxDefault);
1412}
1413
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001414/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1415/// This needs to be called before we add the C run-time (malloc, etc).
1416static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001417 ArgStringList &CmdArgs) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001418 if (!Args.hasFlag(options::OPT_faddress_sanitizer,
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001419 options::OPT_fno_address_sanitizer, false))
1420 return;
Logan Chienc6fd8202012-09-02 09:30:11 +00001421 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001422 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanovea155f02012-06-04 11:15:05 +00001423 if (!Args.hasArg(options::OPT_pie))
1424 TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001425 }
Daniel Dunbar3ca41d42011-12-07 23:22:17 +00001426
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001427 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1428 llvm::sys::path::append(LibAsan, "lib", "linux",
1429 (Twine("libclang_rt.asan-") +
1430 TC.getArchName() + "-android.so"));
1431 CmdArgs.push_back(Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001432 } else {
1433 if (!Args.hasArg(options::OPT_shared)) {
1434 // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
1435 // resource directory.
1436 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1437 llvm::sys::path::append(LibAsan, "lib", "linux",
1438 (Twine("libclang_rt.asan-") +
1439 TC.getArchName() + ".a"));
1440 CmdArgs.push_back(Args.MakeArgString(LibAsan));
1441 CmdArgs.push_back("-lpthread");
1442 CmdArgs.push_back("-ldl");
1443 CmdArgs.push_back("-export-dynamic");
1444 }
1445 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001446}
1447
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001448/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1449/// This needs to be called before we add the C run-time (malloc, etc).
1450static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1451 ArgStringList &CmdArgs) {
1452 if (!Args.hasFlag(options::OPT_fthread_sanitizer,
1453 options::OPT_fno_thread_sanitizer, false))
1454 return;
1455 if (!Args.hasArg(options::OPT_shared)) {
1456 // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library
1457 // resource directory.
1458 SmallString<128> LibTsan(TC.getDriver().ResourceDir);
1459 llvm::sys::path::append(LibTsan, "lib", "linux",
1460 (Twine("libclang_rt.tsan-") +
1461 TC.getArchName() + ".a"));
1462 CmdArgs.push_back(Args.MakeArgString(LibTsan));
1463 CmdArgs.push_back("-lpthread");
1464 CmdArgs.push_back("-ldl");
1465 CmdArgs.push_back("-export-dynamic");
1466 }
1467}
1468
Rafael Espindola224dd632011-12-14 21:02:23 +00001469static bool shouldUseFramePointer(const ArgList &Args,
1470 const llvm::Triple &Triple) {
1471 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1472 options::OPT_fomit_frame_pointer))
1473 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1474
Rafael Espindola00b29182011-12-14 21:50:24 +00001475 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001476 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1477 Triple.getArch() == llvm::Triple::x86) &&
1478 Triple.getOS() == llvm::Triple::Linux) {
1479 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1480 if (!A->getOption().matches(options::OPT_O0))
1481 return false;
1482 }
1483
1484 return true;
1485}
1486
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001487void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001488 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001489 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001490 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001491 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001492 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1493 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001494 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001495 ArgStringList CmdArgs;
1496
Daniel Dunbare521a892009-03-31 20:53:55 +00001497 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1498
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001499 // Invoke ourselves in -cc1 mode.
1500 //
1501 // FIXME: Implement custom jobs for internal actions.
1502 CmdArgs.push_back("-cc1");
1503
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001504 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001505 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001506 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001507 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001508
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001509 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001510 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001511
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001512 if (isa<AnalyzeJobAction>(JA)) {
1513 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1514 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001515 } else if (isa<MigrateJobAction>(JA)) {
1516 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001517 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001518 if (Output.getType() == types::TY_Dependencies)
1519 CmdArgs.push_back("-Eonly");
1520 else
1521 CmdArgs.push_back("-E");
Daniel Dunbarc4343942010-02-03 03:07:56 +00001522 } else if (isa<AssembleJobAction>(JA)) {
1523 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001524
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001525 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001526 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001527
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001528 // When using an integrated assembler, translate -Wa, and -Xassembler
1529 // options.
1530 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1531 options::OPT_Xassembler),
1532 ie = Args.filtered_end(); it != ie; ++it) {
1533 const Arg *A = *it;
1534 A->claim();
1535
1536 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001537 StringRef Value = A->getValue(Args, i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001538
1539 if (Value == "-force_cpusubtype_ALL") {
1540 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001541 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001542 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001543 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001544 CmdArgs.push_back("-mllvm");
1545 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001546 } else if (Value == "--noexecstack") {
1547 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001548 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001549 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001550 << A->getOption().getName() << Value;
1551 }
1552 }
1553 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001554
1555 // Also ignore explicit -force_cpusubtype_ALL option.
1556 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001557 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001558 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001559 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001560
Aaron Ballman1f10cc52012-07-31 01:21:00 +00001561 if (JA.getType() == types::TY_Nothing)
1562 CmdArgs.push_back("-fsyntax-only");
1563 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001564 CmdArgs.push_back("-emit-pch");
1565 else
1566 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001567 } else {
1568 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001569
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001570 if (JA.getType() == types::TY_Nothing) {
1571 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001572 } else if (JA.getType() == types::TY_LLVM_IR ||
1573 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001574 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001575 } else if (JA.getType() == types::TY_LLVM_BC ||
1576 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001577 CmdArgs.push_back("-emit-llvm-bc");
1578 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00001579 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00001580 } else if (JA.getType() == types::TY_AST) {
1581 CmdArgs.push_back("-emit-pch");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001582 } else if (JA.getType() == types::TY_RewrittenObjC) {
1583 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001584 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00001585 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1586 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001587 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001588 } else {
1589 assert(JA.getType() == types::TY_PP_Asm &&
1590 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001591 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00001592 }
1593
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001594 // The make clang go fast button.
1595 CmdArgs.push_back("-disable-free");
1596
John McCallbb79b5f2010-02-13 03:50:24 +00001597 // Disable the verification pass in -asserts builds.
1598#ifdef NDEBUG
1599 CmdArgs.push_back("-disable-llvm-verifier");
1600#endif
1601
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001602 // Set the main file name, so that debug info works even with
1603 // -save-temps.
1604 CmdArgs.push_back("-main-file-name");
1605 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1606
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001607 // Some flags which affect the language (via preprocessor
1608 // defines). See darwin::CC1::AddCPPArgs.
1609 if (Args.hasArg(options::OPT_static))
1610 CmdArgs.push_back("-static-define");
1611
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001612 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00001613 // Enable region store model by default.
1614 CmdArgs.push_back("-analyzer-store=region");
1615
Ted Kremenek7bea9a12009-12-07 22:26:14 +00001616 // Treat blocks as analysis entry points.
1617 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1618
Ted Kremenek49c79792011-03-24 00:28:47 +00001619 CmdArgs.push_back("-analyzer-eagerly-assume");
1620
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001621 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001622 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001623 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00001624
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001625 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1626 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00001627
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001628 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00001629 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00001630
1631 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00001632
1633 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00001634 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1635 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1636 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1637 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1638 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1639 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001640 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001641
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001642 // Set the output format. The default is plist, for (lame) historical
1643 // reasons.
1644 CmdArgs.push_back("-analyzer-output");
1645 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
1646 CmdArgs.push_back(A->getValue(Args));
1647 else
1648 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001649
Ted Kremenekfe449a22010-03-22 22:32:05 +00001650 // Disable the presentation of standard compiler warnings when
1651 // using --analyze. We only want to show static analyzer diagnostics
1652 // or frontend errors.
1653 CmdArgs.push_back("-w");
1654
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001655 // Add -Xanalyzer arguments when running as analyzer.
1656 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00001657 }
1658
Daniel Dunbar4eadb602009-09-10 01:21:12 +00001659 CheckCodeGenerationOptions(D, Args);
1660
Daniel Dunbar44e71222009-04-29 18:32:25 +00001661 // Perform argument translation for LLVM backend. This
1662 // takes some care in reconciling with llvm-gcc. The
1663 // issue is that llvm-gcc translates these options based on
1664 // the values in cc1, whereas we are processing based on
1665 // the driver arguments.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001666
Daniel Dunbar44e71222009-04-29 18:32:25 +00001667 // This comes from the default translation the driver + cc1
1668 // would do to enable flag_pic.
Simon Atanasyana16b7fd2012-05-29 18:50:33 +00001669
1670 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1671 options::OPT_fpic, options::OPT_fno_pic,
1672 options::OPT_fPIE, options::OPT_fno_PIE,
1673 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruthc0c04552012-04-08 16:40:35 +00001674 bool PICDisabled = false;
1675 bool PICEnabled = false;
1676 bool PICForPIE = false;
1677 if (LastPICArg) {
1678 PICForPIE = (LastPICArg->getOption().matches(options::OPT_fPIE) ||
1679 LastPICArg->getOption().matches(options::OPT_fpie));
1680 PICEnabled = (PICForPIE ||
1681 LastPICArg->getOption().matches(options::OPT_fPIC) ||
1682 LastPICArg->getOption().matches(options::OPT_fpic));
1683 PICDisabled = !PICEnabled;
1684 }
1685 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1686 // PIC or PIE options above, if these show up, PIC is disabled.
Bob Wilson2afa0112012-09-29 23:52:58 +00001687 llvm::Triple Triple(TripleStr);
1688 if ((Args.hasArg(options::OPT_mkernel) ||
1689 Args.hasArg(options::OPT_fapple_kext)) &&
1690 (Triple.getOS() != llvm::Triple::IOS ||
1691 Triple.isOSVersionLT(6)))
Chandler Carruthc0c04552012-04-08 16:40:35 +00001692 PICDisabled = true;
1693 if (Args.hasArg(options::OPT_static))
1694 PICDisabled = true;
1695 bool DynamicNoPIC = Args.hasArg(options::OPT_mdynamic_no_pic);
1696
1697 // Select the relocation model.
Daniel Dunbar44e71222009-04-29 18:32:25 +00001698 const char *Model = getToolChain().GetForcedPicModel();
1699 if (!Model) {
Chandler Carruthc0c04552012-04-08 16:40:35 +00001700 if (DynamicNoPIC)
Daniel Dunbar44e71222009-04-29 18:32:25 +00001701 Model = "dynamic-no-pic";
1702 else if (PICDisabled)
1703 Model = "static";
1704 else if (PICEnabled)
1705 Model = "pic";
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001706 else
Daniel Dunbar44e71222009-04-29 18:32:25 +00001707 Model = getToolChain().GetDefaultRelocationModel();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001708 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001709 StringRef ModelStr = Model ? Model : "";
1710 if (Model && ModelStr != "pic") {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001711 CmdArgs.push_back("-mrelocation-model");
1712 CmdArgs.push_back(Model);
1713 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001714
Chandler Carruthc0c04552012-04-08 16:40:35 +00001715 // Infer the __PIC__ and __PIE__ values.
1716 if (ModelStr == "pic" && PICForPIE) {
1717 CmdArgs.push_back("-pie-level");
1718 CmdArgs.push_back((LastPICArg &&
1719 LastPICArg->getOption().matches(options::OPT_fPIE)) ?
1720 "2" : "1");
1721 } else if (ModelStr == "pic" || ModelStr == "dynamic-no-pic") {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00001722 CmdArgs.push_back("-pic-level");
Chandler Carruthc0c04552012-04-08 16:40:35 +00001723 CmdArgs.push_back(((ModelStr != "dynamic-no-pic" && LastPICArg &&
1724 LastPICArg->getOption().matches(options::OPT_fPIC)) ||
1725 getToolChain().getTriple().isOSDarwin()) ? "2" : "1");
Daniel Dunbar44e71222009-04-29 18:32:25 +00001726 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001727
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00001728 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1729 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00001730 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00001731
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001732 // LLVM Code Generator Options.
1733
Daniel Dunbar0bb03312011-02-09 17:54:19 +00001734 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
1735 CmdArgs.push_back("-mregparm");
1736 CmdArgs.push_back(A->getValue(Args));
1737 }
1738
Roman Divacky65b88cd2011-03-01 17:40:53 +00001739 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1740 CmdArgs.push_back("-mrtd");
1741
Rafael Espindola224dd632011-12-14 21:02:23 +00001742 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001743 CmdArgs.push_back("-mdisable-fp-elim");
1744 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1745 options::OPT_fno_zero_initialized_in_bss))
1746 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00001747 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1748 options::OPT_fno_strict_aliasing,
1749 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00001750 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00001751 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
1752 false))
1753 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00001754 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
1755 options::OPT_fno_optimize_sibling_calls))
1756 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001757
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001758 // Handle various floating point optimization flags, mapping them to the
1759 // appropriate LLVM code generation flags. The pattern for all of these is to
1760 // default off the codegen optimizations, and if any flag enables them and no
1761 // flag disables them after the flag enabling them, enable the codegen
1762 // optimization. This is complicated by several "umbrella" flags.
1763 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001764 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001765 options::OPT_ffinite_math_only,
1766 options::OPT_fno_finite_math_only,
1767 options::OPT_fhonor_infinities,
1768 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001769 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1770 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001771 A->getOption().getID() != options::OPT_fhonor_infinities)
1772 CmdArgs.push_back("-menable-no-infs");
1773 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001774 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001775 options::OPT_ffinite_math_only,
1776 options::OPT_fno_finite_math_only,
1777 options::OPT_fhonor_nans,
1778 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001779 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1780 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001781 A->getOption().getID() != options::OPT_fhonor_nans)
1782 CmdArgs.push_back("-menable-no-nans");
1783
Benjamin Kramerc242ef22012-05-02 14:55:48 +00001784 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
1785 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001786 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001787 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001788 options::OPT_fmath_errno,
Chandler Carruth3634c662012-04-26 02:10:51 +00001789 options::OPT_fno_math_errno))
1790 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
1791 if (MathErrno)
1792 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001793
1794 // There are several flags which require disabling very specific
1795 // optimizations. Any of these being disabled forces us to turn off the
1796 // entire set of LLVM optimizations, so collect them through all the flag
1797 // madness.
1798 bool AssociativeMath = false;
1799 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001800 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001801 options::OPT_funsafe_math_optimizations,
1802 options::OPT_fno_unsafe_math_optimizations,
1803 options::OPT_fassociative_math,
1804 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001805 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1806 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001807 A->getOption().getID() != options::OPT_fno_associative_math)
1808 AssociativeMath = true;
1809 bool ReciprocalMath = false;
1810 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001811 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001812 options::OPT_funsafe_math_optimizations,
1813 options::OPT_fno_unsafe_math_optimizations,
1814 options::OPT_freciprocal_math,
1815 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001816 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1817 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001818 A->getOption().getID() != options::OPT_fno_reciprocal_math)
1819 ReciprocalMath = true;
1820 bool SignedZeros = true;
1821 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001822 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001823 options::OPT_funsafe_math_optimizations,
1824 options::OPT_fno_unsafe_math_optimizations,
1825 options::OPT_fsigned_zeros,
1826 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001827 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1828 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001829 A->getOption().getID() != options::OPT_fsigned_zeros)
1830 SignedZeros = false;
1831 bool TrappingMath = true;
1832 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001833 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001834 options::OPT_funsafe_math_optimizations,
1835 options::OPT_fno_unsafe_math_optimizations,
1836 options::OPT_ftrapping_math,
1837 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001838 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1839 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001840 A->getOption().getID() != options::OPT_ftrapping_math)
1841 TrappingMath = false;
1842 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
1843 !TrappingMath)
1844 CmdArgs.push_back("-menable-unsafe-fp-math");
1845
Lang Hamesaa53b932012-07-06 00:59:19 +00001846
1847 // Validate and pass through -fp-contract option.
1848 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001849 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00001850 options::OPT_ffp_contract)) {
1851 if (A->getOption().getID() == options::OPT_ffp_contract) {
1852 StringRef Val = A->getValue(Args);
1853 if (Val == "fast" || Val == "on" || Val == "off") {
1854 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
1855 } else {
1856 D.Diag(diag::err_drv_unsupported_option_argument)
1857 << A->getOption().getName() << Val;
1858 }
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001859 } else if (A->getOption().getID() == options::OPT_ffast_math) {
Lang Hamesaa53b932012-07-06 00:59:19 +00001860 // If fast-math is set then set the fp-contract mode to fast.
1861 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
1862 }
1863 }
1864
Bob Wilson6a039162012-07-19 03:52:53 +00001865 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
1866 // and if we find them, tell the frontend to provide the appropriate
1867 // preprocessor macros. This is distinct from enabling any optimizations as
1868 // these options induce language changes which must survive serialization
1869 // and deserialization, etc.
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001870 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, options::OPT_fno_fast_math))
1871 if (A->getOption().matches(options::OPT_ffast_math))
1872 CmdArgs.push_back("-ffast-math");
1873 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
1874 if (A->getOption().matches(options::OPT_ffinite_math_only))
1875 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001876
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001877 // Decide whether to use verbose asm. Verbose assembly is the default on
1878 // toolchains which have the integrated assembler on by default.
1879 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
1880 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001881 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001882 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001883 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001884
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001885 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
1886 CmdArgs.push_back("-mdebug-pass");
1887 CmdArgs.push_back("Structure");
1888 }
1889 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
1890 CmdArgs.push_back("-mdebug-pass");
1891 CmdArgs.push_back("Arguments");
1892 }
1893
John McCall8517abc2010-02-19 02:45:38 +00001894 // Enable -mconstructor-aliases except on darwin, where we have to
1895 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00001896 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00001897 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00001898
John McCall7ef5cb32011-03-18 02:56:14 +00001899 // Darwin's kernel doesn't support guard variables; just die if we
1900 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00001901 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00001902 CmdArgs.push_back("-fforbid-guard-variables");
1903
Douglas Gregordbe39272011-02-01 15:15:22 +00001904 if (Args.hasArg(options::OPT_mms_bitfields)) {
1905 CmdArgs.push_back("-mms-bitfields");
1906 }
John McCall8517abc2010-02-19 02:45:38 +00001907
Daniel Dunbar306945d2009-09-16 06:17:29 +00001908 // This is a coarse approximation of what llvm-gcc actually does, both
1909 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
1910 // complicated ways.
1911 bool AsynchronousUnwindTables =
1912 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
1913 options::OPT_fno_asynchronous_unwind_tables,
1914 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001915 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00001916 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
1917 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001918 CmdArgs.push_back("-munwind-tables");
1919
Rafael Espindola66aa0452012-06-19 01:26:10 +00001920 getToolChain().addClangTargetOptions(CmdArgs);
1921
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001922 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
1923 CmdArgs.push_back("-mlimit-float-precision");
1924 CmdArgs.push_back(A->getValue(Args));
1925 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001926
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001927 // FIXME: Handle -mtune=.
1928 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00001929
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001930 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001931 CmdArgs.push_back("-mcode-model");
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001932 CmdArgs.push_back(A->getValue(Args));
1933 }
1934
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001935 // Add target specific cpu and features flags.
1936 switch(getToolChain().getTriple().getArch()) {
1937 default:
1938 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001939
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001940 case llvm::Triple::arm:
1941 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00001942 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001943 break;
1944
Eric Christopher0b26a612010-03-02 02:41:08 +00001945 case llvm::Triple::mips:
1946 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00001947 case llvm::Triple::mips64:
1948 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00001949 AddMIPSTargetArgs(Args, CmdArgs);
1950 break;
1951
Hal Finkel8eb59282012-06-11 22:35:19 +00001952 case llvm::Triple::ppc:
1953 case llvm::Triple::ppc64:
1954 AddPPCTargetArgs(Args, CmdArgs);
1955 break;
1956
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001957 case llvm::Triple::sparc:
1958 AddSparcTargetArgs(Args, CmdArgs);
1959 break;
1960
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001961 case llvm::Triple::x86:
1962 case llvm::Triple::x86_64:
1963 AddX86TargetArgs(Args, CmdArgs);
1964 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001965
1966 case llvm::Triple::hexagon:
1967 AddHexagonTargetArgs(Args, CmdArgs);
1968 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00001969 }
1970
Tony Linthicum76329bf2011-12-12 21:14:55 +00001971
1972
Daniel Dunbar976a2f52010-08-11 23:07:47 +00001973 // Pass the linker version in use.
1974 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1975 CmdArgs.push_back("-target-linker-version");
1976 CmdArgs.push_back(A->getValue(Args));
1977 }
1978
Nick Lewycky75033772011-02-02 06:43:03 +00001979 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00001980 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewycky75033772011-02-02 06:43:03 +00001981 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson6524dd32011-10-14 05:03:44 +00001982 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00001983 CmdArgs.push_back("-momit-leaf-frame-pointer");
1984
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00001985 // Explicitly error on some things we know we don't support and can't just
1986 // ignore.
1987 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001988 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
1989 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001990 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00001991 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001992 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00001993 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
1994 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001995 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001996 << Unsupported->getOption().getName();
1997 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00001998 }
1999
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002000 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002001 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002002 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002003 CmdArgs.push_back("-header-include-file");
2004 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2005 D.CCPrintHeadersFilename : "-");
2006 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002007 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002008 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002009
Chad Rosierbe10f982011-08-02 17:58:04 +00002010 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002011 CmdArgs.push_back("-diagnostic-log-file");
2012 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2013 D.CCLogDiagnosticsFilename : "-");
2014 }
2015
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002016 // Use the last option from "-g" group. "-gline-tables-only" is
2017 // preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002018 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002019 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
2020 if (A->getOption().matches(options::OPT_gline_tables_only)) {
2021 CmdArgs.push_back("-gline-tables-only");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002022 } else if (!A->getOption().matches(options::OPT_g0) &&
2023 !A->getOption().matches(options::OPT_ggdb0)) {
Chad Rosier8fe3b112011-11-07 19:52:29 +00002024 CmdArgs.push_back("-g");
Chad Rosierc2bf3382011-11-04 19:28:44 +00002025 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002026 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002027
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002028 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2029 Args.ClaimAllArgs(options::OPT_g_flags_Group);
2030
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002031 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2032 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2033
Chris Lattner3c77a352010-06-22 00:03:40 +00002034 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2035
Nick Lewycky207bce32011-04-21 23:44:07 +00002036 if (Args.hasArg(options::OPT_ftest_coverage) ||
2037 Args.hasArg(options::OPT_coverage))
2038 CmdArgs.push_back("-femit-coverage-notes");
2039 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2040 Args.hasArg(options::OPT_coverage))
2041 CmdArgs.push_back("-femit-coverage-data");
2042
Nick Lewycky480cb992011-05-04 20:46:58 +00002043 if (C.getArgs().hasArg(options::OPT_c) ||
2044 C.getArgs().hasArg(options::OPT_S)) {
2045 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002046 CmdArgs.push_back("-coverage-file");
Bill Wendling8c0b4bc2012-08-30 00:43:41 +00002047 SmallString<128> absFilename(Output.getFilename());
2048 llvm::sys::fs::make_absolute(absFilename);
2049 CmdArgs.push_back(Args.MakeArgString(absFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002050 }
2051 }
2052
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002053 // Pass options for controlling the default header search paths.
2054 if (Args.hasArg(options::OPT_nostdinc)) {
2055 CmdArgs.push_back("-nostdsysteminc");
2056 CmdArgs.push_back("-nobuiltininc");
2057 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002058 if (Args.hasArg(options::OPT_nostdlibinc))
2059 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002060 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2061 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2062 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002063
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002064 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002065 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002066 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002067
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002068 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2069
Ted Kremenekf7639e12012-03-06 20:06:33 +00002070 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002071 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002072 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002073 options::OPT_ccc_arcmt_modify,
2074 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002075 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002076 switch (A->getOption().getID()) {
2077 default:
2078 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002079 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002080 CmdArgs.push_back("-arcmt-check");
2081 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002082 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002083 CmdArgs.push_back("-arcmt-modify");
2084 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002085 case options::OPT_ccc_arcmt_migrate:
2086 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002087 CmdArgs.push_back("-mt-migrate-directory");
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002088 CmdArgs.push_back(A->getValue(Args));
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002089
2090 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2091 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002092 break;
John McCalld70fb982011-06-15 23:25:17 +00002093 }
2094 }
2095 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002096
Ted Kremenekf7639e12012-03-06 20:06:33 +00002097 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2098 if (ARCMTEnabled) {
2099 D.Diag(diag::err_drv_argument_not_allowed_with)
2100 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2101 }
2102 CmdArgs.push_back("-mt-migrate-directory");
2103 CmdArgs.push_back(A->getValue(Args));
2104
2105 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2106 options::OPT_objcmt_migrate_subscripting)) {
2107 // None specified, means enable them all.
2108 CmdArgs.push_back("-objcmt-migrate-literals");
2109 CmdArgs.push_back("-objcmt-migrate-subscripting");
2110 } else {
2111 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2112 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2113 }
2114 }
2115
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002116 // Add preprocessing options like -I, -D, etc. if we are using the
2117 // preprocessor.
2118 //
2119 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002120 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Peter Collingbourne9b515cb2011-11-06 00:40:05 +00002121 AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002122
Rafael Espindolaa7431922011-07-21 23:40:37 +00002123 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2124 // that "The compiler can only warn and ignore the option if not recognized".
2125 // When building with ccache, it will pass -D options to clang even on
2126 // preprocessed inputs and configure concludes that -fPIC is not supported.
2127 Args.ClaimAllArgs(options::OPT_D);
2128
Daniel Dunbar58f78332009-09-17 06:53:36 +00002129 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002130 // others.
2131 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002132 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002133 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002134 else if (A->getOption().matches(options::OPT_O) &&
2135 A->getValue(Args)[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002136 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002137 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002138 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002139 }
2140
Daniel Dunbar945577c2009-10-29 02:24:45 +00002141 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002142 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2143 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002144 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002145 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002146
2147 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2148 // (-ansi is equivalent to -std=c89).
2149 //
2150 // If a std is supplied, only add -trigraphs if it follows the
2151 // option.
2152 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2153 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002154 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002155 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002156 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002157 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002158 else
2159 Std->render(Args, CmdArgs);
2160
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002161 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2162 options::OPT_trigraphs))
2163 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002164 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002165 } else {
2166 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002167 //
2168 // FIXME: Clang doesn't correctly handle -std= when the input language
2169 // doesn't match. For the time being just ignore this for C++ inputs;
2170 // eventually we want to do all the standard defaulting here instead of
2171 // splitting it between the driver and clang -cc1.
2172 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002173 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2174 "-std=", /*Joined=*/true);
2175 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2176 CmdArgs.push_back("-std=c++11");
2177
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002178 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002179 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002180
Chandler Carruthb009b142011-04-23 06:30:43 +00002181 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2182 // '-fconst-strings'; this better indicates its actual behavior.
2183 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2184 false)) {
2185 // For perfect compatibility with GCC, we do this even in the presence of
2186 // '-w'. This flag names something other than a warning for GCC.
2187 CmdArgs.push_back("-fconst-strings");
2188 }
2189
Chandler Carruth61fbf622011-04-23 09:27:53 +00002190 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002191 // during C++ compilation, which it is by default. GCC keeps this define even
2192 // in the presence of '-w', match this behavior bug-for-bug.
2193 if (types::isCXX(InputType) &&
2194 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2195 true)) {
2196 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002197 }
2198
Chandler Carruthe0391482010-05-22 02:21:53 +00002199 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2200 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2201 if (Asm->getOption().matches(options::OPT_fasm))
2202 CmdArgs.push_back("-fgnu-keywords");
2203 else
2204 CmdArgs.push_back("-fno-gnu-keywords");
2205 }
2206
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002207 if (ShouldDisableCFI(Args, getToolChain()))
2208 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002209
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002210 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2211 CmdArgs.push_back("-fno-dwarf-directory-asm");
2212
Nick Lewyckyba743b72011-10-21 02:32:14 +00002213 if (const char *pwd = ::getenv("PWD")) {
2214 // GCC also verifies that stat(pwd) and stat(".") have the same inode
2215 // number. Not doing those because stats are slow, but we could.
NAKAMURA Takumib5e6fa22011-10-22 10:25:25 +00002216 if (llvm::sys::path::is_absolute(pwd)) {
Nick Lewyckyba743b72011-10-21 02:32:14 +00002217 std::string CompDir = pwd;
2218 CmdArgs.push_back("-fdebug-compilation-dir");
2219 CmdArgs.push_back(Args.MakeArgString(CompDir));
2220 }
2221 }
2222
Richard Smith9a568822011-11-21 19:36:32 +00002223 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2224 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002225 CmdArgs.push_back("-ftemplate-depth");
2226 CmdArgs.push_back(A->getValue(Args));
2227 }
2228
Richard Smith9a568822011-11-21 19:36:32 +00002229 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2230 CmdArgs.push_back("-fconstexpr-depth");
2231 CmdArgs.push_back(A->getValue(Args));
2232 }
2233
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002234 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2235 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002236 if (A->getNumValues()) {
2237 StringRef bytes = A->getValue(Args);
2238 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2239 } else
2240 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002241 }
2242
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002243 if (Arg *A = Args.getLastArg(options::OPT_fbounds_checking,
2244 options::OPT_fbounds_checking_EQ)) {
2245 if (A->getNumValues()) {
2246 StringRef val = A->getValue(Args);
2247 CmdArgs.push_back(Args.MakeArgString("-fbounds-checking=" + val));
2248 } else
2249 CmdArgs.push_back("-fbounds-checking=1");
2250 }
2251
Daniel Dunbarfffd1812009-11-19 04:00:53 +00002252 if (Args.hasArg(options::OPT__relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002253 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002254
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002255 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2256 CmdArgs.push_back("-fconstant-string-class");
2257 CmdArgs.push_back(A->getValue(Args));
2258 }
David Chisnall5778fce2009-08-31 16:41:57 +00002259
Chris Lattnere23003d2010-01-09 21:54:33 +00002260 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2261 CmdArgs.push_back("-ftabstop");
2262 CmdArgs.push_back(A->getValue(Args));
2263 }
2264
Chris Lattnerb35583d2010-04-07 20:49:23 +00002265 CmdArgs.push_back("-ferror-limit");
2266 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
2267 CmdArgs.push_back(A->getValue(Args));
2268 else
2269 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002270
Chandler Carrutha77a7272010-05-06 04:55:18 +00002271 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2272 CmdArgs.push_back("-fmacro-backtrace-limit");
Douglas Gregorcd121fb2010-05-04 17:13:42 +00002273 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002274 }
2275
2276 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2277 CmdArgs.push_back("-ftemplate-backtrace-limit");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002278 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002279 }
2280
Richard Smithf6f003a2011-12-16 19:06:07 +00002281 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2282 CmdArgs.push_back("-fconstexpr-backtrace-limit");
2283 CmdArgs.push_back(A->getValue(Args));
2284 }
2285
Daniel Dunbar2c978472009-11-04 06:24:47 +00002286 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002287 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002288 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002289 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002290 } else {
2291 // If -fmessage-length=N was not specified, determine whether this is a
2292 // terminal and, if so, implicitly define -fmessage-length appropriately.
2293 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002294 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002295 }
2296
Daniel Dunbare357d562009-12-03 18:42:11 +00002297 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2298 CmdArgs.push_back("-fvisibility");
2299 CmdArgs.push_back(A->getValue(Args));
2300 }
2301
Douglas Gregor08329632010-06-15 17:05:35 +00002302 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002303
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002304 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2305
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002306 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002307 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2308 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002309 CmdArgs.push_back("-ffreestanding");
2310
Daniel Dunbare357d562009-12-03 18:42:11 +00002311 // Forward -f (flag) options which we can pass directly.
Mike Stumpd9546382009-12-12 01:27:46 +00002312 Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002313 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002314 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002315 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002316 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002317 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002318 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002319 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2320 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002321
2322 // Report and error for -faltivec on anything other then PowerPC.
2323 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2324 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2325 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2326 D.Diag(diag::err_drv_argument_only_allowed_with)
2327 << A->getAsString(Args) << "ppc/ppc64";
2328
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002329 if (getToolChain().SupportsProfiling())
2330 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002331
Kostya Serebryany8855ff62011-11-16 17:34:26 +00002332 if (Args.hasFlag(options::OPT_faddress_sanitizer,
2333 options::OPT_fno_address_sanitizer, false))
2334 CmdArgs.push_back("-faddress-sanitizer");
2335
Kostya Serebryany28a7a112012-03-01 22:27:08 +00002336 if (Args.hasFlag(options::OPT_fthread_sanitizer,
2337 options::OPT_fno_thread_sanitizer, false))
2338 CmdArgs.push_back("-fthread-sanitizer");
2339
Daniel Dunbar35621a92010-03-16 16:57:46 +00002340 // -flax-vector-conversions is default.
2341 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2342 options::OPT_fno_lax_vector_conversions))
2343 CmdArgs.push_back("-fno-lax-vector-conversions");
2344
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002345 if (Args.getLastArg(options::OPT_fapple_kext))
2346 CmdArgs.push_back("-fapple-kext");
2347
David Blaikie690f21e2012-06-14 18:55:27 +00002348 if (Args.hasFlag(options::OPT_frewrite_includes,
2349 options::OPT_fno_rewrite_includes, false))
2350 CmdArgs.push_back("-frewrite-includes");
2351
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002352 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002353 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002354 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002355 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2356 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002357
2358 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2359 CmdArgs.push_back("-ftrapv-handler");
2360 CmdArgs.push_back(A->getValue(Args));
2361 }
2362
Bob Wilson14adb362012-02-03 06:27:22 +00002363 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002364
Chandler Carruth6e501032011-03-27 00:04:55 +00002365 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2366 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2367 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2368 options::OPT_fno_wrapv)) {
2369 if (A->getOption().matches(options::OPT_fwrapv))
2370 CmdArgs.push_back("-fwrapv");
2371 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2372 options::OPT_fno_strict_overflow)) {
2373 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2374 CmdArgs.push_back("-fwrapv");
2375 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002376 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002377 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002378
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002379 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2380
Daniel Dunbar4930e332009-11-17 08:07:36 +00002381 // -stack-protector=0 is default.
2382 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002383 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2384 options::OPT_fstack_protector_all,
2385 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002386 if (A->getOption().matches(options::OPT_fstack_protector))
2387 StackProtectorLevel = 1;
2388 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2389 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002390 } else {
2391 StackProtectorLevel =
2392 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2393 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002394 if (StackProtectorLevel) {
2395 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002396 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002397 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002398
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002399 // --param ssp-buffer-size=
2400 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2401 ie = Args.filtered_end(); it != ie; ++it) {
2402 StringRef Str((*it)->getValue(Args));
2403 if (Str.startswith("ssp-buffer-size=")) {
2404 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00002405 CmdArgs.push_back("-stack-protector-buffer-size");
2406 // FIXME: Verify the argument is a valid integer.
2407 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002408 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002409 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00002410 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002411 }
2412
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002413 // Translate -mstackrealign
2414 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2415 false)) {
2416 CmdArgs.push_back("-backend-option");
2417 CmdArgs.push_back("-force-align-stack");
2418 }
2419 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2420 false)) {
2421 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2422 }
2423
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002424 if (Args.hasArg(options::OPT_mstack_alignment)) {
2425 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2426 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002427 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002428
Daniel Dunbard18049a2009-04-07 21:16:11 +00002429 // Forward -f options with positive and negative forms; we translate
2430 // these by hand.
2431
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002432 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002433 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002434 CmdArgs.push_back("-fapple-kext");
2435 if (!Args.hasArg(options::OPT_fbuiltin))
2436 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002437 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002438 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002439 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002440 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002441 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002442
Nuno Lopes13c88c72009-12-16 16:59:22 +00002443 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2444 options::OPT_fno_assume_sane_operator_new))
2445 CmdArgs.push_back("-fno-assume-sane-operator-new");
2446
Daniel Dunbar4930e332009-11-17 08:07:36 +00002447 // -fblocks=0 is default.
2448 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002449 getToolChain().IsBlocksDefault()) ||
2450 (Args.hasArg(options::OPT_fgnu_runtime) &&
2451 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2452 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002453 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002454
2455 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2456 !getToolChain().hasBlocksRuntime())
2457 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002458 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002459
Douglas Gregor226173a2012-01-18 15:19:58 +00002460 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2461 // users must also pass -fcxx-modules. The latter flag will disappear once the
2462 // modules implementation is solid for C++/Objective-C++ programs as well.
2463 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2464 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2465 options::OPT_fno_cxx_modules,
2466 false);
2467 if (AllowedInCXX || !types::isCXX(InputType))
2468 CmdArgs.push_back("-fmodules");
2469 }
Douglas Gregor787869b2012-01-03 17:13:05 +00002470
John McCalldfea9982010-04-09 19:12:06 +00002471 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002472 if (Args.hasFlag(options::OPT_fno_access_control,
2473 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002474 false))
John McCall3155f572010-04-09 19:03:51 +00002475 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00002476
Anders Carlssond470fef2010-11-21 00:09:52 +00002477 // -felide-constructors is the default.
2478 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2479 options::OPT_felide_constructors,
2480 false))
2481 CmdArgs.push_back("-fno-elide-constructors");
2482
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002483 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002484 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
2485 KernelOrKext)
Daniel Dunbar484afa22009-11-19 04:55:23 +00002486 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00002487
Tony Linthicum76329bf2011-12-12 21:14:55 +00002488 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002489 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00002490 options::OPT_fno_short_enums,
2491 getToolChain().getTriple().getArch() ==
2492 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002493 CmdArgs.push_back("-fshort-enums");
2494
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002495 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002496 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002497 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00002498 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00002499
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002500 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002501 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002502 options::OPT_fno_threadsafe_statics))
2503 CmdArgs.push_back("-fno-threadsafe-statics");
2504
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002505 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002506 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2507 options::OPT_fno_use_cxa_atexit,
2508 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00002509 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00002510 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2511 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002512 CmdArgs.push_back("-fno-use-cxa-atexit");
2513
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002514 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002515 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002516 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2517 CmdArgs.push_back("-fms-extensions");
2518
Chad Rosiered943242012-07-20 21:20:33 +00002519 // -fms-inline-asm.
Chad Rosierd3957e52012-07-20 23:12:26 +00002520 if (Args.hasArg(options::OPT_fenable_experimental_ms_inline_asm))
2521 CmdArgs.push_back("-fenable-experimental-ms-inline-asm");
Chad Rosiered943242012-07-20 21:20:33 +00002522
Francois Pichet1b4f1632011-09-17 04:32:15 +00002523 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00002524 if (Args.hasFlag(options::OPT_fms_compatibility,
2525 options::OPT_fno_ms_compatibility,
2526 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2527 Args.hasFlag(options::OPT_fms_extensions,
2528 options::OPT_fno_ms_extensions,
2529 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00002530 CmdArgs.push_back("-fms-compatibility");
2531
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002532 // -fmsc-version=1300 is default.
2533 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2534 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2535 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002536 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002537 if (msc_ver.empty())
2538 CmdArgs.push_back("-fmsc-version=1300");
2539 else
2540 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2541 }
2542
2543
Dawn Perchik68bb1b42010-09-02 23:59:25 +00002544 // -fborland-extensions=0 is default.
2545 if (Args.hasFlag(options::OPT_fborland_extensions,
2546 options::OPT_fno_borland_extensions, false))
2547 CmdArgs.push_back("-fborland-extensions");
2548
Francois Pichet02744872011-09-01 16:38:08 +00002549 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2550 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00002551 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2552 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00002553 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00002554 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00002555
Chandler Carruthe03aa552010-04-17 20:17:31 +00002556 // -fgnu-keywords default varies depending on language; only pass if
2557 // specified.
2558 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00002559 options::OPT_fno_gnu_keywords))
2560 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00002561
Rafael Espindola922a6242011-06-02 17:30:53 +00002562 if (Args.hasFlag(options::OPT_fgnu89_inline,
2563 options::OPT_fno_gnu89_inline,
2564 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00002565 CmdArgs.push_back("-fgnu89-inline");
2566
Chad Rosier9c76d242012-03-15 22:31:42 +00002567 if (Args.hasArg(options::OPT_fno_inline))
2568 CmdArgs.push_back("-fno-inline");
2569
Chad Rosier64d6be92012-03-06 21:17:19 +00002570 if (Args.hasArg(options::OPT_fno_inline_functions))
2571 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00002572
John McCall5fb5df92012-06-20 06:18:46 +00002573 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00002574
John McCall5fb5df92012-06-20 06:18:46 +00002575 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2576 // legacy is the default.
2577 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00002578 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2579 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00002580 objcRuntime.isLegacyDispatchDefaultForArch(
2581 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00002582 if (getToolChain().UseObjCMixedDispatch())
2583 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2584 else
2585 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2586 }
2587 }
2588
Nico Weber97bd94b2012-03-09 21:19:44 +00002589 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2590 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00002591 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00002592 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2593 }
2594
John McCall24fc0de2011-07-06 00:26:06 +00002595 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2596 // NOTE: This logic is duplicated in ToolChains.cpp.
2597 bool ARC = isObjCAutoRefCount(Args);
2598 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00002599 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00002600
John McCall24fc0de2011-07-06 00:26:06 +00002601 CmdArgs.push_back("-fobjc-arc");
2602
Chandler Carruth491db322011-11-04 07:34:47 +00002603 // FIXME: It seems like this entire block, and several around it should be
2604 // wrapped in isObjC, but for now we just use it here as this is where it
2605 // was being used previously.
2606 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2607 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2608 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2609 else
2610 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2611 }
2612
John McCall24fc0de2011-07-06 00:26:06 +00002613 // Allow the user to enable full exceptions code emission.
2614 // We define off for Objective-CC, on for Objective-C++.
2615 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2616 options::OPT_fno_objc_arc_exceptions,
2617 /*default*/ types::isCXX(InputType)))
2618 CmdArgs.push_back("-fobjc-arc-exceptions");
2619 }
2620
2621 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2622 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00002623 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00002624 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002625
John McCall24fc0de2011-07-06 00:26:06 +00002626 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2627 // takes precedence.
2628 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2629 if (!GCArg)
2630 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2631 if (GCArg) {
2632 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002633 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00002634 << GCArg->getAsString(Args);
2635 } else if (getToolChain().SupportsObjCGC()) {
2636 GCArg->render(Args, CmdArgs);
2637 } else {
2638 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002639 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00002640 << GCArg->getAsString(Args);
2641 }
2642 }
2643
John McCallb5f652e2011-06-22 00:53:57 +00002644 // Add exception args.
2645 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00002646 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00002647
2648 if (getToolChain().UseSjLjExceptions())
2649 CmdArgs.push_back("-fsjlj-exceptions");
2650
2651 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00002652 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2653 options::OPT_fno_assume_sane_operator_new))
2654 CmdArgs.push_back("-fno-assume-sane-operator-new");
2655
Daniel Dunbar34d7a992010-04-27 15:34:57 +00002656 // -fconstant-cfstrings is default, and may be subject to argument translation
2657 // on Darwin.
2658 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2659 options::OPT_fno_constant_cfstrings) ||
2660 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2661 options::OPT_mno_constant_cfstrings))
2662 CmdArgs.push_back("-fno-constant-cfstrings");
2663
John Thompsoned4e2952009-11-05 20:14:16 +00002664 // -fshort-wchar default varies depending on platform; only
2665 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00002666 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2667 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00002668
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00002669 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2670 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00002671 //
2672 // FIXME: This is gross; that translation should be pulled from the
2673 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002674 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00002675 options::OPT_fno_pascal_strings,
2676 false) ||
2677 Args.hasFlag(options::OPT_mpascal_strings,
2678 options::OPT_mno_pascal_strings,
2679 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002680 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002681
Daniel Dunbar096ed292011-10-05 21:04:55 +00002682 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2683 // -fno-pack-struct doesn't apply to -fpack-struct=.
2684 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00002685 std::string PackStructStr = "-fpack-struct=";
2686 PackStructStr += A->getValue(Args);
2687 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00002688 } else if (Args.hasFlag(options::OPT_fpack_struct,
2689 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00002690 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00002691 }
2692
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002693 if (Args.hasArg(options::OPT_mkernel) ||
2694 Args.hasArg(options::OPT_fapple_kext)) {
2695 if (!Args.hasArg(options::OPT_fcommon))
2696 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00002697 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002698 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00002699
Daniel Dunbard18049a2009-04-07 21:16:11 +00002700 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002701 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002702 CmdArgs.push_back("-fno-common");
2703
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002704 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00002705 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00002706 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002707 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002708 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002709 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2710
Daniel Dunbar6358d682010-10-15 22:30:42 +00002711 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2712 if (!Args.hasFlag(options::OPT_ffor_scope,
2713 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002714 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00002715 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2716
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00002717 // -fcaret-diagnostics is default.
2718 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2719 options::OPT_fno_caret_diagnostics, true))
2720 CmdArgs.push_back("-fno-caret-diagnostics");
2721
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002722 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00002723 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002724 options::OPT_fno_diagnostics_fixit_info))
2725 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002726
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002727 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00002728 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002729 options::OPT_fno_diagnostics_show_option))
2730 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002731
Chris Lattnerbf6fac82010-05-04 21:55:25 +00002732 if (const Arg *A =
2733 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
2734 CmdArgs.push_back("-fdiagnostics-show-category");
2735 CmdArgs.push_back(A->getValue(Args));
2736 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002737
Douglas Gregor643c9222011-05-21 17:07:29 +00002738 if (const Arg *A =
2739 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
2740 CmdArgs.push_back("-fdiagnostics-format");
2741 CmdArgs.push_back(A->getValue(Args));
2742 }
2743
Chandler Carruthb6766f02011-03-27 01:50:55 +00002744 if (Arg *A = Args.getLastArg(
2745 options::OPT_fdiagnostics_show_note_include_stack,
2746 options::OPT_fno_diagnostics_show_note_include_stack)) {
2747 if (A->getOption().matches(
2748 options::OPT_fdiagnostics_show_note_include_stack))
2749 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
2750 else
2751 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
2752 }
2753
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002754 // Color diagnostics are the default, unless the terminal doesn't support
2755 // them.
2756 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidis4f920162010-09-23 12:56:06 +00002757 options::OPT_fno_color_diagnostics,
2758 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002759 CmdArgs.push_back("-fcolor-diagnostics");
2760
Daniel Dunbardb097022009-06-08 21:13:54 +00002761 if (!Args.hasFlag(options::OPT_fshow_source_location,
2762 options::OPT_fno_show_source_location))
2763 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002764
Douglas Gregor643c9222011-05-21 17:07:29 +00002765 if (!Args.hasFlag(options::OPT_fshow_column,
2766 options::OPT_fno_show_column,
2767 true))
2768 CmdArgs.push_back("-fno-show-column");
2769
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00002770 if (!Args.hasFlag(options::OPT_fspell_checking,
2771 options::OPT_fno_spell_checking))
2772 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002773
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002774
Daniel Dunbar3ada2b72010-11-02 19:42:04 +00002775 // Silently ignore -fasm-blocks for now.
2776 (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
2777 false);
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002778
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00002779 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
2780 A->render(Args, CmdArgs);
2781
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002782 // -fdollars-in-identifiers default varies depending on platform and
2783 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00002784 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002785 options::OPT_fno_dollars_in_identifiers)) {
2786 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002787 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002788 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002789 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002790 }
2791
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002792 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
2793 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00002794 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002795 options::OPT_fno_unit_at_a_time)) {
2796 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002797 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002798 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002799
Eli Friedman055c9702011-11-02 01:53:16 +00002800 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
2801 options::OPT_fno_apple_pragma_pack, false))
2802 CmdArgs.push_back("-fapple-pragma-pack");
2803
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002804 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002805 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002806 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002807#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00002808 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002809 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
2810 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
2811 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
2812 CmdArgs.push_back("-fno-builtin-strcat");
2813 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
2814 CmdArgs.push_back("-fno-builtin-strcpy");
2815 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002816#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002817
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002818 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00002819 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002820 options::OPT_traditional_cpp)) {
2821 if (isa<PreprocessJobAction>(JA))
2822 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002823 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002824 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002825 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002826
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002827 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00002828 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00002829
2830 // Handle serialized diagnostics.
2831 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
2832 CmdArgs.push_back("-serialize-diagnostic-file");
2833 CmdArgs.push_back(Args.MakeArgString(A->getValue(Args)));
2834 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002835
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00002836 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
2837 CmdArgs.push_back("-fretain-comments-from-system-headers");
2838
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002839 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
2840 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002841 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002842 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
2843 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00002844 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00002845
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002846 // We translate this by hand to the -cc1 argument, since nightly test uses
2847 // it and developers have been trained to spell it with -mllvm.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002848 if (StringRef((*it)->getValue(Args, 0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002849 CmdArgs.push_back("-disable-llvm-optzns");
2850 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00002851 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002852 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002853
Daniel Dunbard67a3222009-03-30 06:36:42 +00002854 if (Output.getType() == types::TY_Dependencies) {
2855 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002856 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00002857 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002858 CmdArgs.push_back(Output.getFilename());
2859 } else {
2860 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002861 }
2862
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002863 for (InputInfoList::const_iterator
2864 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2865 const InputInfo &II = *it;
2866 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00002867 if (Args.hasArg(options::OPT_rewrite_objc))
2868 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2869 else
2870 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00002871 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002872 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002873 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002874 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002875 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002876
Chris Lattnere9d7d782009-11-03 19:50:27 +00002877 Args.AddAllArgs(CmdArgs, options::OPT_undef);
2878
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00002879 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002880
2881 // Optionally embed the -cc1 level arguments into the debug info, for build
2882 // analysis.
2883 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002884 ArgStringList OriginalArgs;
2885 for (ArgList::const_iterator it = Args.begin(),
2886 ie = Args.end(); it != ie; ++it)
2887 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002888
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00002889 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002890 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002891 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002892 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002893 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002894 }
2895 CmdArgs.push_back("-dwarf-debug-flags");
2896 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
2897 }
2898
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00002899 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00002900
Roman Divacky178e01602011-02-10 16:52:03 +00002901 if (Arg *A = Args.getLastArg(options::OPT_pg))
2902 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002903 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00002904 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002905
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002906 // Claim some arguments which clang supports automatically.
2907
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00002908 // -fpch-preprocess is used with gcc to add a special marker in the output to
2909 // include the PCH file. Clang's PTH solution is completely transparent, so we
2910 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002911 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002912
Daniel Dunbar17731772009-03-23 19:03:36 +00002913 // Claim some arguments which clang doesn't support, but we don't
2914 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00002915 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
2916 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00002917
Rafael Espindolad95a8122011-03-01 05:25:27 +00002918 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00002919 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00002920 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002921}
2922
Jim Grosbach576452b2012-02-10 20:37:10 +00002923void ClangAs::AddARMTargetArgs(const ArgList &Args,
2924 ArgStringList &CmdArgs) const {
2925 const Driver &D = getToolChain().getDriver();
2926 llvm::Triple Triple = getToolChain().getTriple();
2927
2928 // Set the CPU based on -march= and -mcpu=.
2929 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00002930 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00002931
2932 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00002933 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00002934 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00002935
2936 // Honor -mfpmath=.
2937 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00002938 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00002939}
2940
John McCall5fb5df92012-06-20 06:18:46 +00002941/// Add options related to the Objective-C runtime/ABI.
2942///
2943/// Returns true if the runtime is non-fragile.
2944ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
2945 ArgStringList &cmdArgs,
2946 RewriteKind rewriteKind) const {
2947 // Look for the controlling runtime option.
2948 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
2949 options::OPT_fgnu_runtime,
2950 options::OPT_fobjc_runtime_EQ);
2951
2952 // Just forward -fobjc-runtime= to the frontend. This supercedes
2953 // options about fragility.
2954 if (runtimeArg &&
2955 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
2956 ObjCRuntime runtime;
2957 StringRef value = runtimeArg->getValue(args);
2958 if (runtime.tryParse(value)) {
2959 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
2960 << value;
2961 }
2962
2963 runtimeArg->render(args, cmdArgs);
2964 return runtime;
2965 }
2966
2967 // Otherwise, we'll need the ABI "version". Version numbers are
2968 // slightly confusing for historical reasons:
2969 // 1 - Traditional "fragile" ABI
2970 // 2 - Non-fragile ABI, version 1
2971 // 3 - Non-fragile ABI, version 2
2972 unsigned objcABIVersion = 1;
2973 // If -fobjc-abi-version= is present, use that to set the version.
2974 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
2975 StringRef value = abiArg->getValue(args);
2976 if (value == "1")
2977 objcABIVersion = 1;
2978 else if (value == "2")
2979 objcABIVersion = 2;
2980 else if (value == "3")
2981 objcABIVersion = 3;
2982 else
2983 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2984 << value;
2985 } else {
2986 // Otherwise, determine if we are using the non-fragile ABI.
2987 bool nonFragileABIIsDefault =
2988 (rewriteKind == RK_NonFragile ||
2989 (rewriteKind == RK_None &&
2990 getToolChain().IsObjCNonFragileABIDefault()));
2991 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
2992 options::OPT_fno_objc_nonfragile_abi,
2993 nonFragileABIIsDefault)) {
2994 // Determine the non-fragile ABI version to use.
2995#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
2996 unsigned nonFragileABIVersion = 1;
2997#else
2998 unsigned nonFragileABIVersion = 2;
2999#endif
3000
3001 if (Arg *abiArg = args.getLastArg(
3002 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
3003 StringRef value = abiArg->getValue(args);
3004 if (value == "1")
3005 nonFragileABIVersion = 1;
3006 else if (value == "2")
3007 nonFragileABIVersion = 2;
3008 else
3009 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3010 << value;
3011 }
3012
3013 objcABIVersion = 1 + nonFragileABIVersion;
3014 } else {
3015 objcABIVersion = 1;
3016 }
3017 }
3018
3019 // We don't actually care about the ABI version other than whether
3020 // it's non-fragile.
3021 bool isNonFragile = objcABIVersion != 1;
3022
3023 // If we have no runtime argument, ask the toolchain for its default runtime.
3024 // However, the rewriter only really supports the Mac runtime, so assume that.
3025 ObjCRuntime runtime;
3026 if (!runtimeArg) {
3027 switch (rewriteKind) {
3028 case RK_None:
3029 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3030 break;
3031 case RK_Fragile:
3032 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3033 break;
3034 case RK_NonFragile:
3035 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3036 break;
3037 }
3038
3039 // -fnext-runtime
3040 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3041 // On Darwin, make this use the default behavior for the toolchain.
3042 if (getToolChain().getTriple().isOSDarwin()) {
3043 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3044
3045 // Otherwise, build for a generic macosx port.
3046 } else {
3047 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3048 }
3049
3050 // -fgnu-runtime
3051 } else {
3052 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003053 // Legacy behaviour is to target the gnustep runtime if we are i
3054 // non-fragile mode or the GCC runtime in fragile mode.
3055 if (isNonFragile)
3056 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple());
3057 else
3058 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003059 }
3060
3061 cmdArgs.push_back(args.MakeArgString(
3062 "-fobjc-runtime=" + runtime.getAsString()));
3063 return runtime;
3064}
3065
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003066void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003067 const InputInfo &Output,
3068 const InputInfoList &Inputs,
3069 const ArgList &Args,
3070 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003071 ArgStringList CmdArgs;
3072
3073 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3074 const InputInfo &Input = Inputs[0];
3075
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003076 // Don't warn about "clang -w -c foo.s"
3077 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003078 // and "clang -emit-llvm -c foo.s"
3079 Args.ClaimAllArgs(options::OPT_emit_llvm);
3080 // and "clang -use-gold-plugin -c foo.s"
3081 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003082
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003083 // Invoke ourselves in -cc1as mode.
3084 //
3085 // FIXME: Implement custom jobs for internal actions.
3086 CmdArgs.push_back("-cc1as");
3087
3088 // Add the "effective" target triple.
3089 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003090 std::string TripleStr =
3091 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003092 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3093
3094 // Set the output mode, we currently only expect to be used as a real
3095 // assembler.
3096 CmdArgs.push_back("-filetype");
3097 CmdArgs.push_back("obj");
3098
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003099 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003100 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003101
Jim Grosbach576452b2012-02-10 20:37:10 +00003102 // Add target specific cpu and features flags.
3103 switch(getToolChain().getTriple().getArch()) {
3104 default:
3105 break;
3106
3107 case llvm::Triple::arm:
3108 case llvm::Triple::thumb:
3109 AddARMTargetArgs(Args, CmdArgs);
3110 break;
3111 }
3112
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003113 // Ignore explicit -force_cpusubtype_ALL option.
3114 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003115
Eric Christopherfc3ee562012-01-10 00:38:01 +00003116 // Determine the original source input.
3117 const Action *SourceAction = &JA;
3118 while (SourceAction->getKind() != Action::InputClass) {
3119 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3120 SourceAction = SourceAction->getInputs()[0];
3121 }
3122
3123 // Forward -g, assuming we are dealing with an actual assembly file.
3124 if (SourceAction->getType() == types::TY_Asm ||
3125 SourceAction->getType() == types::TY_PP_Asm) {
3126 Args.ClaimAllArgs(options::OPT_g_Group);
3127 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3128 if (!A->getOption().matches(options::OPT_g0))
3129 CmdArgs.push_back("-g");
3130 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003131
3132 // Optionally embed the -cc1as level arguments into the debug info, for build
3133 // analysis.
3134 if (getToolChain().UseDwarfDebugFlags()) {
3135 ArgStringList OriginalArgs;
3136 for (ArgList::const_iterator it = Args.begin(),
3137 ie = Args.end(); it != ie; ++it)
3138 (*it)->render(Args, OriginalArgs);
3139
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003140 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003141 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3142 Flags += Exec;
3143 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3144 Flags += " ";
3145 Flags += OriginalArgs[i];
3146 }
3147 CmdArgs.push_back("-dwarf-debug-flags");
3148 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3149 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003150
3151 // FIXME: Add -static support, once we have it.
3152
3153 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3154 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003155 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003156
3157 assert(Output.isFilename() && "Unexpected lipo output.");
3158 CmdArgs.push_back("-o");
3159 CmdArgs.push_back(Output.getFilename());
3160
Daniel Dunbarb440f562010-08-02 02:38:21 +00003161 assert(Input.isFilename() && "Invalid input.");
3162 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003163
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003164 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003165 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003166}
3167
Daniel Dunbara3246a02009-03-18 08:07:30 +00003168void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003169 const InputInfo &Output,
3170 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003171 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003172 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003173 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003174 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003175
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003176 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003177 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003178 Arg *A = *it;
Daniel Dunbar2da02722009-03-19 07:55:12 +00003179 if (A->getOption().hasForwardToGCC()) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003180 // Don't forward any -g arguments to assembly steps.
3181 if (isa<AssembleJobAction>(JA) &&
3182 A->getOption().matches(options::OPT_g_Group))
3183 continue;
3184
Daniel Dunbar2da02722009-03-19 07:55:12 +00003185 // It is unfortunate that we have to claim here, as this means
3186 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003187 // platforms using a generic gcc, even if we are just using gcc
3188 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003189 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003190 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003191 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003192 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003193
Daniel Dunbar4e295052010-01-25 22:35:08 +00003194 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003195
3196 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003197 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00003198 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003199 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003200
3201 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003202 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003203 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003204 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003205 CmdArgs.push_back("ppc64");
3206 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003207 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003208 }
3209
Daniel Dunbar5716d872009-05-02 21:41:52 +00003210 // Try to force gcc to match the tool chain we want, if we recognize
3211 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003212 //
3213 // FIXME: The triple class should directly provide the information we want
3214 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003215 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003216 CmdArgs.push_back("-m32");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003217 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::x86_64)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003218 CmdArgs.push_back("-m64");
3219
Daniel Dunbarb440f562010-08-02 02:38:21 +00003220 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003221 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003222 CmdArgs.push_back(Output.getFilename());
3223 } else {
3224 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003225 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003226 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003227
Tony Linthicum76329bf2011-12-12 21:14:55 +00003228 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3229 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003230
3231 // Only pass -x if gcc will understand it; otherwise hope gcc
3232 // understands the suffix correctly. The main use case this would go
3233 // wrong in is for linker inputs if they happened to have an odd
3234 // suffix; really the only way to get this to happen is a command
3235 // like '-x foobar a.c' which will treat a.c like a linker input.
3236 //
3237 // FIXME: For the linker case specifically, can we safely convert
3238 // inputs into '-Wl,' options?
3239 for (InputInfoList::const_iterator
3240 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3241 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003242
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003243 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003244 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3245 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003246 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003247 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003248 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003249 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003250 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003251
Daniel Dunbara3246a02009-03-18 08:07:30 +00003252 if (types::canTypeBeUserSpecified(II.getType())) {
3253 CmdArgs.push_back("-x");
3254 CmdArgs.push_back(types::getTypeName(II.getType()));
3255 }
3256
Daniel Dunbarb440f562010-08-02 02:38:21 +00003257 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003258 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003259 else {
3260 const Arg &A = II.getInputArg();
3261
3262 // Reverse translate some rewritten options.
3263 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3264 CmdArgs.push_back("-lstdc++");
3265 continue;
3266 }
3267
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003268 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003269 A.render(Args, CmdArgs);
3270 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003271 }
3272
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003273 const std::string customGCCName = D.getCCCGenericGCCName();
3274 const char *GCCName;
3275 if (!customGCCName.empty())
3276 GCCName = customGCCName.c_str();
3277 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003278 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003279 } else
3280 GCCName = "gcc";
3281
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003282 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003283 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003284 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003285}
3286
Daniel Dunbar4e295052010-01-25 22:35:08 +00003287void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3288 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003289 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003290}
3291
Daniel Dunbar4e295052010-01-25 22:35:08 +00003292void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3293 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003294 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003295}
3296
Daniel Dunbar4e295052010-01-25 22:35:08 +00003297void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3298 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003299 const Driver &D = getToolChain().getDriver();
3300
Daniel Dunbar4e295052010-01-25 22:35:08 +00003301 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003302 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3303 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003304 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003305 else {
3306 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003307 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003308 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003309
Daniel Dunbar4e295052010-01-25 22:35:08 +00003310 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003311 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003312}
3313
Daniel Dunbar4e295052010-01-25 22:35:08 +00003314void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3315 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003316 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003317}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003318
Daniel Dunbar4e295052010-01-25 22:35:08 +00003319void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3320 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003321 // The types are (hopefully) good enough.
3322}
3323
Tony Linthicum76329bf2011-12-12 21:14:55 +00003324// Hexagon tools start.
3325void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3326 ArgStringList &CmdArgs) const {
3327
3328}
3329void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3330 const InputInfo &Output,
3331 const InputInfoList &Inputs,
3332 const ArgList &Args,
3333 const char *LinkingOutput) const {
3334
3335 const Driver &D = getToolChain().getDriver();
3336 ArgStringList CmdArgs;
3337
3338 std::string MarchString = "-march=";
3339 MarchString += getHexagonTargetCPU(Args);
3340 CmdArgs.push_back(Args.MakeArgString(MarchString));
3341
3342 RenderExtraToolArgs(JA, CmdArgs);
3343
3344 if (Output.isFilename()) {
3345 CmdArgs.push_back("-o");
3346 CmdArgs.push_back(Output.getFilename());
3347 } else {
3348 assert(Output.isNothing() && "Unexpected output");
3349 CmdArgs.push_back("-fsyntax-only");
3350 }
3351
3352
3353 // Only pass -x if gcc will understand it; otherwise hope gcc
3354 // understands the suffix correctly. The main use case this would go
3355 // wrong in is for linker inputs if they happened to have an odd
3356 // suffix; really the only way to get this to happen is a command
3357 // like '-x foobar a.c' which will treat a.c like a linker input.
3358 //
3359 // FIXME: For the linker case specifically, can we safely convert
3360 // inputs into '-Wl,' options?
3361 for (InputInfoList::const_iterator
3362 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3363 const InputInfo &II = *it;
3364
3365 // Don't try to pass LLVM or AST inputs to a generic gcc.
3366 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3367 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3368 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3369 << getToolChain().getTripleString();
3370 else if (II.getType() == types::TY_AST)
3371 D.Diag(clang::diag::err_drv_no_ast_support)
3372 << getToolChain().getTripleString();
3373
3374 if (II.isFilename())
3375 CmdArgs.push_back(II.getFilename());
3376 else
3377 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3378 II.getInputArg().render(Args, CmdArgs);
3379 }
3380
3381 const char *GCCName = "hexagon-as";
3382 const char *Exec =
3383 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3384 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3385
3386}
3387void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3388 ArgStringList &CmdArgs) const {
3389 // The types are (hopefully) good enough.
3390}
3391
3392void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3393 const InputInfo &Output,
3394 const InputInfoList &Inputs,
3395 const ArgList &Args,
3396 const char *LinkingOutput) const {
3397
3398 const Driver &D = getToolChain().getDriver();
3399 ArgStringList CmdArgs;
3400
3401 for (ArgList::const_iterator
3402 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3403 Arg *A = *it;
3404 if (A->getOption().hasForwardToGCC()) {
3405 // Don't forward any -g arguments to assembly steps.
3406 if (isa<AssembleJobAction>(JA) &&
3407 A->getOption().matches(options::OPT_g_Group))
3408 continue;
3409
3410 // It is unfortunate that we have to claim here, as this means
3411 // we will basically never report anything interesting for
3412 // platforms using a generic gcc, even if we are just using gcc
3413 // to get to the assembler.
3414 A->claim();
3415 A->render(Args, CmdArgs);
3416 }
3417 }
3418
3419 RenderExtraToolArgs(JA, CmdArgs);
3420
3421 // Add Arch Information
3422 Arg *A;
Sebastian Pop86500282012-01-13 20:37:10 +00003423 if ((A = getLastHexagonArchArg(Args))) {
3424 if (A->getOption().matches(options::OPT_m_Joined))
3425 A->render(Args, CmdArgs);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003426 else
Sebastian Pop86500282012-01-13 20:37:10 +00003427 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003428 }
Sebastian Pop86500282012-01-13 20:37:10 +00003429 else {
3430 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
3431 }
3432
Tony Linthicum76329bf2011-12-12 21:14:55 +00003433 CmdArgs.push_back("-mqdsp6-compat");
3434
3435 const char *GCCName;
3436 if (C.getDriver().CCCIsCXX)
3437 GCCName = "hexagon-g++";
3438 else
3439 GCCName = "hexagon-gcc";
3440 const char *Exec =
3441 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3442
3443 if (Output.isFilename()) {
3444 CmdArgs.push_back("-o");
3445 CmdArgs.push_back(Output.getFilename());
3446 }
3447
3448 for (InputInfoList::const_iterator
3449 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3450 const InputInfo &II = *it;
3451
3452 // Don't try to pass LLVM or AST inputs to a generic gcc.
3453 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3454 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3455 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3456 << getToolChain().getTripleString();
3457 else if (II.getType() == types::TY_AST)
3458 D.Diag(clang::diag::err_drv_no_ast_support)
3459 << getToolChain().getTripleString();
3460
3461 if (II.isFilename())
3462 CmdArgs.push_back(II.getFilename());
3463 else
3464 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3465 II.getInputArg().render(Args, CmdArgs);
3466 }
3467 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3468
3469}
3470// Hexagon tools end.
3471
3472
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003473const char *darwin::CC1::getCC1Name(types::ID Type) const {
3474 switch (Type) {
3475 default:
David Blaikie83d382b2011-09-23 05:06:16 +00003476 llvm_unreachable("Unexpected type for Darwin CC1 tool.");
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003477 case types::TY_Asm:
3478 case types::TY_C: case types::TY_CHeader:
3479 case types::TY_PP_C: case types::TY_PP_CHeader:
3480 return "cc1";
3481 case types::TY_ObjC: case types::TY_ObjCHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003482 case types::TY_PP_ObjC: case types::TY_PP_ObjC_Alias:
3483 case types::TY_PP_ObjCHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003484 return "cc1obj";
3485 case types::TY_CXX: case types::TY_CXXHeader:
3486 case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
3487 return "cc1plus";
3488 case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003489 case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXX_Alias:
3490 case types::TY_PP_ObjCXXHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003491 return "cc1objplus";
3492 }
3493}
3494
David Blaikie68e081d2011-12-20 02:48:34 +00003495void darwin::CC1::anchor() {}
3496
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003497const char *darwin::CC1::getBaseInputName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003498 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00003499 return Args.MakeArgString(
3500 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003501}
3502
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003503const char *darwin::CC1::getBaseInputStem(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003504 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003505 const char *Str = getBaseInputName(Args, Inputs);
3506
Chris Lattner906bb902011-01-16 08:14:11 +00003507 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003508 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003509
3510 return Str;
3511}
3512
3513const char *
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003514darwin::CC1::getDependencyFileName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003515 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003516 // FIXME: Think about this more.
3517 std::string Res;
3518
3519 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3520 std::string Str(OutputOpt->getValue(Args));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003521 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003522 } else {
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003523 Res = darwin::CC1::getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003524 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003525 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003526}
3527
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003528void darwin::CC1::RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const {
Eric Christopher84fbdb42011-08-19 00:30:14 +00003529 for (ArgStringList::iterator it = CmdArgs.begin(), ie = CmdArgs.end();
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003530 it != ie;) {
Chad Rosier2f818792011-08-18 17:56:32 +00003531
3532 StringRef Option = *it;
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003533 bool RemoveOption = false;
Chad Rosier30453862011-08-18 01:18:28 +00003534
Bob Wilson7ecbd322012-02-07 01:17:55 +00003535 // Erase both -fmodule-cache-path and its argument.
3536 if (Option.equals("-fmodule-cache-path") && it+2 != ie) {
3537 it = CmdArgs.erase(it, it+2);
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003538 ie = CmdArgs.end();
Chad Rosier30453862011-08-18 01:18:28 +00003539 continue;
3540 }
3541
Bob Wilson7ecbd322012-02-07 01:17:55 +00003542 // Remove unsupported -f options.
3543 if (Option.startswith("-f")) {
3544 // Remove -f/-fno- to reduce the number of cases.
3545 if (Option.startswith("-fno-"))
3546 Option = Option.substr(5);
3547 else
3548 Option = Option.substr(2);
3549 RemoveOption = llvm::StringSwitch<bool>(Option)
3550 .Case("altivec", true)
3551 .Case("modules", true)
3552 .Case("diagnostics-show-note-include-stack", true)
3553 .Default(false);
3554 }
3555
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003556 // Handle machine specific options.
3557 if (Option.startswith("-m")) {
3558 RemoveOption = llvm::StringSwitch<bool>(Option)
3559 .Case("-mthumb", true)
3560 .Case("-mno-thumb", true)
3561 .Case("-mno-fused-madd", true)
3562 .Case("-mlong-branch", true)
3563 .Case("-mlongcall", true)
3564 .Case("-mcpu=G4", true)
3565 .Case("-mcpu=G5", true)
3566 .Default(false);
3567 }
3568
3569 // Handle warning options.
3570 if (Option.startswith("-W")) {
3571 // Remove -W/-Wno- to reduce the number of cases.
3572 if (Option.startswith("-Wno-"))
3573 Option = Option.substr(5);
3574 else
3575 Option = Option.substr(2);
3576
3577 RemoveOption = llvm::StringSwitch<bool>(Option)
3578 .Case("address-of-temporary", true)
3579 .Case("ambiguous-member-template", true)
3580 .Case("analyzer-incompatible-plugin", true)
3581 .Case("array-bounds", true)
3582 .Case("array-bounds-pointer-arithmetic", true)
3583 .Case("bind-to-temporary-copy", true)
3584 .Case("bitwise-op-parentheses", true)
3585 .Case("bool-conversions", true)
3586 .Case("builtin-macro-redefined", true)
3587 .Case("c++-hex-floats", true)
3588 .Case("c++0x-compat", true)
3589 .Case("c++0x-extensions", true)
3590 .Case("c++0x-narrowing", true)
Richard Smith31ce7932011-10-13 23:32:09 +00003591 .Case("c++11-compat", true)
3592 .Case("c++11-extensions", true)
3593 .Case("c++11-narrowing", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003594 .Case("conditional-uninitialized", true)
3595 .Case("constant-conversion", true)
David Blaikieebcbe4b2012-03-15 04:50:32 +00003596 .Case("conversion-null", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003597 .Case("CFString-literal", true)
3598 .Case("constant-logical-operand", true)
3599 .Case("custom-atomic-properties", true)
3600 .Case("default-arg-special-member", true)
3601 .Case("delegating-ctor-cycles", true)
3602 .Case("delete-non-virtual-dtor", true)
3603 .Case("deprecated-implementations", true)
3604 .Case("deprecated-writable-strings", true)
3605 .Case("distributed-object-modifiers", true)
3606 .Case("duplicate-method-arg", true)
3607 .Case("dynamic-class-memaccess", true)
3608 .Case("enum-compare", true)
3609 .Case("exit-time-destructors", true)
3610 .Case("gnu", true)
3611 .Case("gnu-designator", true)
3612 .Case("header-hygiene", true)
3613 .Case("idiomatic-parentheses", true)
3614 .Case("ignored-qualifiers", true)
3615 .Case("implicit-atomic-properties", true)
3616 .Case("incompatible-pointer-types", true)
3617 .Case("incomplete-implementation", true)
3618 .Case("initializer-overrides", true)
3619 .Case("invalid-noreturn", true)
3620 .Case("invalid-token-paste", true)
Ivan Krasin31f74112011-10-06 02:46:34 +00003621 .Case("language-extension-token", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003622 .Case("literal-conversion", true)
3623 .Case("literal-range", true)
3624 .Case("local-type-template-args", true)
3625 .Case("logical-op-parentheses", true)
3626 .Case("method-signatures", true)
3627 .Case("microsoft", true)
3628 .Case("mismatched-tags", true)
3629 .Case("missing-method-return-type", true)
3630 .Case("non-pod-varargs", true)
3631 .Case("nonfragile-abi2", true)
3632 .Case("null-arithmetic", true)
3633 .Case("null-dereference", true)
3634 .Case("out-of-line-declaration", true)
3635 .Case("overriding-method-mismatch", true)
3636 .Case("readonly-setter-attrs", true)
3637 .Case("return-stack-address", true)
3638 .Case("self-assign", true)
3639 .Case("semicolon-before-method-body", true)
3640 .Case("sentinel", true)
3641 .Case("shift-overflow", true)
3642 .Case("shift-sign-overflow", true)
3643 .Case("sign-conversion", true)
3644 .Case("sizeof-array-argument", true)
3645 .Case("sizeof-pointer-memaccess", true)
3646 .Case("string-compare", true)
3647 .Case("super-class-method-mismatch", true)
3648 .Case("tautological-compare", true)
3649 .Case("typedef-redefinition", true)
3650 .Case("typename-missing", true)
3651 .Case("undefined-reinterpret-cast", true)
3652 .Case("unknown-warning-option", true)
3653 .Case("unnamed-type-template-args", true)
3654 .Case("unneeded-internal-declaration", true)
3655 .Case("unneeded-member-function", true)
3656 .Case("unused-comparison", true)
3657 .Case("unused-exception-parameter", true)
3658 .Case("unused-member-function", true)
3659 .Case("unused-result", true)
3660 .Case("vector-conversions", true)
3661 .Case("vla", true)
3662 .Case("used-but-marked-unused", true)
3663 .Case("weak-vtables", true)
3664 .Default(false);
3665 } // if (Option.startswith("-W"))
Chad Rosier30453862011-08-18 01:18:28 +00003666 if (RemoveOption) {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003667 it = CmdArgs.erase(it);
Chad Rosier23594f62011-08-17 18:51:56 +00003668 ie = CmdArgs.end();
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003669 } else {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003670 ++it;
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003671 }
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003672 }
3673}
3674
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003675void darwin::CC1::AddCC1Args(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003676 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003677 const Driver &D = getToolChain().getDriver();
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003678
3679 CheckCodeGenerationOptions(D, Args);
3680
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003681 // Derived from cc1 spec.
Bob Wilson2afa0112012-09-29 23:52:58 +00003682 if ((!Args.hasArg(options::OPT_mkernel) ||
3683 (getDarwinToolChain().isTargetIPhoneOS() &&
3684 !getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) &&
3685 !Args.hasArg(options::OPT_static) &&
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003686 !Args.hasArg(options::OPT_mdynamic_no_pic))
3687 CmdArgs.push_back("-fPIC");
3688
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003689 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3690 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3691 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3692 CmdArgs.push_back("-fno-builtin-strcat");
3693 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3694 CmdArgs.push_back("-fno-builtin-strcpy");
3695 }
3696
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003697 if (Args.hasArg(options::OPT_g_Flag) &&
3698 !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
3699 CmdArgs.push_back("-feliminate-unused-debug-symbols");
3700}
3701
3702void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3703 const InputInfoList &Inputs,
3704 const ArgStringList &OutputArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003705 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003706
3707 // Derived from cc1_options spec.
3708 if (Args.hasArg(options::OPT_fast) ||
3709 Args.hasArg(options::OPT_fastf) ||
3710 Args.hasArg(options::OPT_fastcp))
3711 CmdArgs.push_back("-O3");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003712
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003713 if (Arg *A = Args.getLastArg(options::OPT_pg))
3714 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003715 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003716 << A->getAsString(Args) << "-fomit-frame-pointer";
3717
3718 AddCC1Args(Args, CmdArgs);
3719
3720 if (!Args.hasArg(options::OPT_Q))
3721 CmdArgs.push_back("-quiet");
3722
3723 CmdArgs.push_back("-dumpbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003724 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003725
3726 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3727
3728 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
3729 Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
3730
3731 // FIXME: The goal is to use the user provided -o if that is our
3732 // final output, otherwise to drive from the original input
3733 // name. Find a clean way to go about this.
3734 if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
3735 Args.hasArg(options::OPT_o)) {
3736 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
3737 CmdArgs.push_back("-auxbase-strip");
3738 CmdArgs.push_back(OutputOpt->getValue(Args));
3739 } else {
3740 CmdArgs.push_back("-auxbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003741 CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003742 }
3743
3744 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3745
3746 Args.AddAllArgs(CmdArgs, options::OPT_O);
3747 // FIXME: -Wall is getting some special treatment. Investigate.
3748 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3749 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003750 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003751 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003752 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3753 // Honor -std-default.
3754 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3755 "-std=", /*Joined=*/true);
3756 }
3757
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003758 if (Args.hasArg(options::OPT_v))
3759 CmdArgs.push_back("-version");
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003760 if (Args.hasArg(options::OPT_pg) &&
3761 getToolChain().SupportsProfiling())
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003762 CmdArgs.push_back("-p");
3763 Args.AddLastArg(CmdArgs, options::OPT_p);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003764
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003765 // The driver treats -fsyntax-only specially.
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003766 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3767 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3768 // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
3769 // used to inhibit the default -fno-builtin-str{cat,cpy}.
3770 //
3771 // FIXME: Should we grow a better way to deal with "removing" args?
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003772 for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
3773 options::OPT_fsyntax_only),
3774 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003775 if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
3776 !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
3777 (*it)->claim();
3778 (*it)->render(Args, CmdArgs);
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003779 }
3780 }
3781 } else
3782 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003783
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003784 // Claim Clang only -f options, they aren't worth warning about.
3785 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3786
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003787 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3788 if (Args.hasArg(options::OPT_Qn))
3789 CmdArgs.push_back("-fno-ident");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003790
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003791 // FIXME: This isn't correct.
3792 //Args.AddLastArg(CmdArgs, options::OPT__help)
3793 //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
3794
3795 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3796
3797 // FIXME: Still don't get what is happening here. Investigate.
3798 Args.AddAllArgs(CmdArgs, options::OPT__param);
3799
3800 if (Args.hasArg(options::OPT_fmudflap) ||
3801 Args.hasArg(options::OPT_fmudflapth)) {
3802 CmdArgs.push_back("-fno-builtin");
3803 CmdArgs.push_back("-fno-merge-constants");
3804 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003805
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003806 if (Args.hasArg(options::OPT_coverage)) {
3807 CmdArgs.push_back("-fprofile-arcs");
3808 CmdArgs.push_back("-ftest-coverage");
3809 }
3810
3811 if (types::isCXX(Inputs[0].getType()))
3812 CmdArgs.push_back("-D__private_extern__=extern");
3813}
3814
3815void darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3816 const InputInfoList &Inputs,
3817 const ArgStringList &OutputArgs) const {
3818 // Derived from cpp_options
3819 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003820
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003821 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3822
3823 AddCC1Args(Args, CmdArgs);
3824
3825 // NOTE: The code below has some commonality with cpp_options, but
3826 // in classic gcc style ends up sending things in different
3827 // orders. This may be a good merge candidate once we drop pedantic
3828 // compatibility.
3829
3830 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003831 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003832 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003833 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3834 // Honor -std-default.
3835 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3836 "-std=", /*Joined=*/true);
3837 }
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003838 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3839 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003840
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003841 // The driver treats -fsyntax-only specially.
3842 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
3843
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003844 // Claim Clang only -f options, they aren't worth warning about.
3845 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3846
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003847 if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
3848 !Args.hasArg(options::OPT_fno_working_directory))
3849 CmdArgs.push_back("-fworking-directory");
3850
3851 Args.AddAllArgs(CmdArgs, options::OPT_O);
3852 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3853 if (Args.hasArg(options::OPT_save_temps))
3854 CmdArgs.push_back("-fpch-preprocess");
3855}
3856
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003857void darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003858 ArgStringList &CmdArgs,
Mike Stump11289f42009-09-09 15:08:12 +00003859 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003860 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003861
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003862 CheckPreprocessingOptions(D, Args);
3863
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003864 // Derived from cpp_unique_options.
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003865 // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
3866 Args.AddLastArg(CmdArgs, options::OPT_C);
3867 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003868 if (!Args.hasArg(options::OPT_Q))
3869 CmdArgs.push_back("-quiet");
3870 Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
Douglas Gregor64b046f2010-03-24 20:13:48 +00003871 Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003872 Args.AddLastArg(CmdArgs, options::OPT_v);
3873 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
3874 Args.AddLastArg(CmdArgs, options::OPT_P);
3875
3876 // FIXME: Handle %I properly.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003877 if (getToolChain().getArch() == llvm::Triple::x86_64) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003878 CmdArgs.push_back("-imultilib");
3879 CmdArgs.push_back("x86_64");
3880 }
3881
3882 if (Args.hasArg(options::OPT_MD)) {
3883 CmdArgs.push_back("-MD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003884 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003885 }
3886
3887 if (Args.hasArg(options::OPT_MMD)) {
3888 CmdArgs.push_back("-MMD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003889 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003890 }
3891
3892 Args.AddLastArg(CmdArgs, options::OPT_M);
3893 Args.AddLastArg(CmdArgs, options::OPT_MM);
3894 Args.AddAllArgs(CmdArgs, options::OPT_MF);
3895 Args.AddLastArg(CmdArgs, options::OPT_MG);
3896 Args.AddLastArg(CmdArgs, options::OPT_MP);
3897 Args.AddAllArgs(CmdArgs, options::OPT_MQ);
3898 Args.AddAllArgs(CmdArgs, options::OPT_MT);
3899 if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
3900 (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
3901 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3902 CmdArgs.push_back("-MQ");
3903 CmdArgs.push_back(OutputOpt->getValue(Args));
3904 }
3905 }
3906
3907 Args.AddLastArg(CmdArgs, options::OPT_remap);
3908 if (Args.hasArg(options::OPT_g3))
3909 CmdArgs.push_back("-dD");
3910 Args.AddLastArg(CmdArgs, options::OPT_H);
3911
3912 AddCPPArgs(Args, CmdArgs);
3913
3914 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
3915 Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
3916
3917 for (InputInfoList::const_iterator
3918 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3919 const InputInfo &II = *it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003920
Daniel Dunbarb440f562010-08-02 02:38:21 +00003921 CmdArgs.push_back(II.getFilename());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003922 }
3923
3924 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
3925 options::OPT_Xpreprocessor);
3926
3927 if (Args.hasArg(options::OPT_fmudflap)) {
3928 CmdArgs.push_back("-D_MUDFLAP");
3929 CmdArgs.push_back("-include");
3930 CmdArgs.push_back("mf-runtime.h");
3931 }
3932
3933 if (Args.hasArg(options::OPT_fmudflapth)) {
3934 CmdArgs.push_back("-D_MUDFLAP");
3935 CmdArgs.push_back("-D_MUDFLAPTH");
3936 CmdArgs.push_back("-include");
3937 CmdArgs.push_back("mf-runtime.h");
3938 }
3939}
3940
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003941void darwin::CC1::AddCPPArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003942 ArgStringList &CmdArgs) const {
3943 // Derived from cpp spec.
3944
3945 if (Args.hasArg(options::OPT_static)) {
3946 // The gcc spec is broken here, it refers to dynamic but
3947 // that has been translated. Start by being bug compatible.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003948
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003949 // if (!Args.hasArg(arglist.parser.dynamicOption))
3950 CmdArgs.push_back("-D__STATIC__");
3951 } else
3952 CmdArgs.push_back("-D__DYNAMIC__");
3953
3954 if (Args.hasArg(options::OPT_pthread))
3955 CmdArgs.push_back("-D_REENTRANT");
3956}
3957
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003958void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003959 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003960 const InputInfoList &Inputs,
3961 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003962 const char *LinkingOutput) const {
3963 ArgStringList CmdArgs;
3964
3965 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3966
3967 CmdArgs.push_back("-E");
3968
3969 if (Args.hasArg(options::OPT_traditional) ||
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003970 Args.hasArg(options::OPT_traditional_cpp))
3971 CmdArgs.push_back("-traditional-cpp");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003972
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003973 ArgStringList OutputArgs;
Daniel Dunbarb440f562010-08-02 02:38:21 +00003974 assert(Output.isFilename() && "Unexpected CC1 output.");
3975 OutputArgs.push_back("-o");
3976 OutputArgs.push_back(Output.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003977
Joerg Sonnenbergerb86f5f42011-03-06 23:31:01 +00003978 if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
Daniel Dunbarf64f5302009-03-29 22:27:40 +00003979 AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3980 } else {
3981 AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
3982 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3983 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003984
Daniel Dunbar6a8803a2009-04-03 01:27:06 +00003985 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3986
Chad Rosierc31e48d2011-09-08 00:38:00 +00003987 RemoveCC1UnsupportedArgs(CmdArgs);
3988
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003989 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003990 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003991 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003992 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003993}
3994
3995void darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003996 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003997 const InputInfoList &Inputs,
3998 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003999 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004000 const Driver &D = getToolChain().getDriver();
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004001 ArgStringList CmdArgs;
4002
4003 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
4004
Bob Wilson0090df22012-04-01 23:03:29 +00004005 // Silence warning about unused --serialize-diagnostics
4006 Args.ClaimAllArgs(options::OPT__serialize_diags);
4007
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004008 types::ID InputType = Inputs[0].getType();
David Blaikie747ff7e2012-04-04 20:43:14 +00004009 if (const Arg *A = Args.getLastArg(options::OPT_traditional))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004010 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004011 << A->getAsString(Args) << "-E";
4012
Daniel Dunbar24e52992010-06-07 23:28:45 +00004013 if (JA.getType() == types::TY_LLVM_IR ||
4014 JA.getType() == types::TY_LTO_IR)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004015 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00004016 else if (JA.getType() == types::TY_LLVM_BC ||
4017 JA.getType() == types::TY_LTO_BC)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004018 CmdArgs.push_back("-emit-llvm-bc");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004019 else if (Output.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004020 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004021 << getToolChain().getTripleString();
Daniel Dunbarbcd554f2010-02-11 17:33:45 +00004022 else if (JA.getType() != types::TY_PP_Asm &&
4023 JA.getType() != types::TY_PCH)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004024 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004025 << getTypeName(JA.getType());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004026
4027 ArgStringList OutputArgs;
4028 if (Output.getType() != types::TY_PCH) {
4029 OutputArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004030 if (Output.isNothing())
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004031 OutputArgs.push_back("/dev/null");
4032 else
4033 OutputArgs.push_back(Output.getFilename());
4034 }
4035
4036 // There is no need for this level of compatibility, but it makes
4037 // diffing easier.
4038 bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
4039 Args.hasArg(options::OPT_S));
4040
4041 if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004042 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004043 if (OutputArgsEarly) {
4044 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4045 } else {
4046 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4047 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4048 }
4049 } else {
4050 CmdArgs.push_back("-fpreprocessed");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004051
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004052 for (InputInfoList::const_iterator
4053 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4054 const InputInfo &II = *it;
4055
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004056 // Reject AST inputs.
4057 if (II.getType() == types::TY_AST) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004058 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004059 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004060 return;
4061 }
4062
Daniel Dunbarb440f562010-08-02 02:38:21 +00004063 CmdArgs.push_back(II.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004064 }
4065
4066 if (OutputArgsEarly) {
4067 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4068 } else {
4069 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4070 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4071 }
4072 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004073
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004074 if (Output.getType() == types::TY_PCH) {
4075 assert(Output.isFilename() && "Invalid PCH output.");
4076
4077 CmdArgs.push_back("-o");
4078 // NOTE: gcc uses a temp .s file for this, but there doesn't seem
4079 // to be a good reason.
Chad Rosier96d690c2011-08-01 19:58:48 +00004080 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004081 D.GetTemporaryPath("cc", "s"));
Chad Rosier96d690c2011-08-01 19:58:48 +00004082 C.addTempFile(TmpPath);
4083 CmdArgs.push_back(TmpPath);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004084
Eric Christopher84fbdb42011-08-19 00:30:14 +00004085 // If we're emitting a pch file with the last 4 characters of ".pth"
4086 // and falling back to llvm-gcc we want to use ".gch" instead.
4087 std::string OutputFile(Output.getFilename());
4088 size_t loc = OutputFile.rfind(".pth");
4089 if (loc != std::string::npos)
4090 OutputFile.replace(loc, 4, ".gch");
4091 const char *Tmp = C.getArgs().MakeArgString("--output-pch="+OutputFile);
4092 CmdArgs.push_back(Tmp);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004093 }
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004094
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00004095 RemoveCC1UnsupportedArgs(CmdArgs);
4096
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004097 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004098 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004099 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004100 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004101}
4102
Daniel Dunbarbe220842009-03-20 16:06:39 +00004103void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004104 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004105 const InputInfoList &Inputs,
4106 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004107 const char *LinkingOutput) const {
4108 ArgStringList CmdArgs;
4109
4110 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4111 const InputInfo &Input = Inputs[0];
4112
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004113 // Determine the original source input.
4114 const Action *SourceAction = &JA;
4115 while (SourceAction->getKind() != Action::InputClass) {
4116 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4117 SourceAction = SourceAction->getInputs()[0];
4118 }
4119
4120 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004121 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004122 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004123 if (Args.hasArg(options::OPT_gstabs))
4124 CmdArgs.push_back("--gstabs");
4125 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004126 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004127 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004128
Daniel Dunbarbe220842009-03-20 16:06:39 +00004129 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004130 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004131
Daniel Dunbar6d484762010-07-22 01:47:22 +00004132 // Use -force_cpusubtype_ALL on x86 by default.
4133 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4134 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004135 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4136 CmdArgs.push_back("-force_cpusubtype_ALL");
4137
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004138 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
Bob Wilson2afa0112012-09-29 23:52:58 +00004139 (((Args.hasArg(options::OPT_mkernel) ||
4140 Args.hasArg(options::OPT_fapple_kext)) &&
4141 (!getDarwinToolChain().isTargetIPhoneOS() ||
4142 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4143 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004144 CmdArgs.push_back("-static");
4145
Daniel Dunbarbe220842009-03-20 16:06:39 +00004146 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4147 options::OPT_Xassembler);
4148
4149 assert(Output.isFilename() && "Unexpected lipo output.");
4150 CmdArgs.push_back("-o");
4151 CmdArgs.push_back(Output.getFilename());
4152
Daniel Dunbarb440f562010-08-02 02:38:21 +00004153 assert(Input.isFilename() && "Invalid input.");
4154 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004155
4156 // asm_final spec is empty.
4157
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004158 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004159 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004160 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004161}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004162
David Blaikie68e081d2011-12-20 02:48:34 +00004163void darwin::DarwinTool::anchor() {}
4164
Daniel Dunbare9ded432009-09-09 18:36:20 +00004165void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4166 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004167 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004168
Daniel Dunbarc1964212009-03-26 16:23:12 +00004169 // Derived from darwin_arch spec.
4170 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004171 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004172
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004173 // FIXME: Is this needed anymore?
4174 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004175 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004176}
4177
Bill Wendling3b2000f2012-10-02 18:02:50 +00004178bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4179 // We only need to generate a temp path for LTO if we aren't compiling object
4180 // files. When compiling source files, we run 'dsymutil' after linking. We
4181 // don't run 'dsymutil' when compiling object files.
4182 for (InputInfoList::const_iterator
4183 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4184 if (it->getType() != types::TY_Object)
4185 return true;
4186
4187 return false;
4188}
4189
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004190void darwin::Link::AddLinkArgs(Compilation &C,
4191 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004192 ArgStringList &CmdArgs,
4193 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004194 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004195 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004196
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004197 unsigned Version[3] = { 0, 0, 0 };
4198 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4199 bool HadExtra;
4200 if (!Driver::GetReleaseVersion(A->getValue(Args), Version[0],
4201 Version[1], Version[2], HadExtra) ||
4202 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004203 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004204 << A->getAsString(Args);
4205 }
4206
4207 // Newer linkers support -demangle, pass it if supported and not disabled by
4208 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004209 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004210 // Don't pass -demangle to ld_classic.
4211 //
4212 // FIXME: This is a temporary workaround, ld should be handling this.
4213 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4214 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004215 if (getToolChain().getArch() == llvm::Triple::x86) {
4216 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4217 options::OPT_Wl_COMMA),
4218 ie = Args.filtered_end(); it != ie; ++it) {
4219 const Arg *A = *it;
4220 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004221 if (StringRef(A->getValue(Args, i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004222 UsesLdClassic = true;
4223 }
4224 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004225 if (!UsesLdClassic)
4226 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004227 }
4228
Daniel Dunbaref889c72011-06-21 20:55:11 +00004229 // If we are using LTO, then automatically create a temporary file path for
4230 // the linker to use, so that it's lifetime will extend past a possible
4231 // dsymutil step.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004232 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
Daniel Dunbaref889c72011-06-21 20:55:11 +00004233 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004234 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Daniel Dunbaref889c72011-06-21 20:55:11 +00004235 C.addTempFile(TmpPath);
4236 CmdArgs.push_back("-object_path_lto");
4237 CmdArgs.push_back(TmpPath);
4238 }
4239
Daniel Dunbarc1964212009-03-26 16:23:12 +00004240 // Derived from the "link" spec.
4241 Args.AddAllArgs(CmdArgs, options::OPT_static);
4242 if (!Args.hasArg(options::OPT_static))
4243 CmdArgs.push_back("-dynamic");
4244 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4245 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4246 // here. How do we wish to handle such things?
4247 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004248
Daniel Dunbarc1964212009-03-26 16:23:12 +00004249 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004250 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004251 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004252 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004253
4254 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4255 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4256 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4257
4258 Arg *A;
4259 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4260 (A = Args.getLastArg(options::OPT_current__version)) ||
4261 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004262 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004263 << A->getAsString(Args) << "-dynamiclib";
4264
4265 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4266 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4267 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4268 } else {
4269 CmdArgs.push_back("-dylib");
4270
4271 Arg *A;
4272 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4273 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4274 (A = Args.getLastArg(options::OPT_client__name)) ||
4275 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4276 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4277 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004278 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004279 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004280
Daniel Dunbarc1964212009-03-26 16:23:12 +00004281 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4282 "-dylib_compatibility_version");
4283 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4284 "-dylib_current_version");
4285
Daniel Dunbara48823f2010-01-22 02:04:52 +00004286 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004287
4288 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4289 "-dylib_install_name");
4290 }
4291
4292 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4293 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4294 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004295 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004296 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004297 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4298 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4299 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4300 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4301 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4302 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004303 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004304 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4305 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4306 Args.AddAllArgs(CmdArgs, options::OPT_init);
4307
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004308 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004309 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004310
4311 // If we had an explicit -mios-simulator-version-min argument, honor that,
4312 // otherwise use the traditional deployment targets. We can't just check the
4313 // is-sim attribute because existing code follows this path, and the linker
4314 // may not handle the argument.
4315 //
4316 // FIXME: We may be able to remove this, once we can verify no one depends on
4317 // it.
4318 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4319 CmdArgs.push_back("-ios_simulator_version_min");
4320 else if (DarwinTC.isTargetIPhoneOS())
4321 CmdArgs.push_back("-iphoneos_version_min");
4322 else
4323 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004324 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004325
Daniel Dunbarc1964212009-03-26 16:23:12 +00004326 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4327 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4328 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4329 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4330 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004331
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004332 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4333 options::OPT_fno_pie,
4334 options::OPT_fno_PIE)) {
4335 if (A->getOption().matches(options::OPT_fpie) ||
4336 A->getOption().matches(options::OPT_fPIE))
4337 CmdArgs.push_back("-pie");
4338 else
4339 CmdArgs.push_back("-no_pie");
4340 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004341
4342 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4343 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4344 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4345 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4346 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4347 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4348 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4349 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4350 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4351 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4352 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4353 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4354 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4355 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4356 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4357 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004358
Daniel Dunbar84384642011-05-02 21:03:47 +00004359 // Give --sysroot= preference, over the Apple specific behavior to also use
4360 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004361 StringRef sysroot = C.getSysRoot();
4362 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004363 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004364 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004365 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4366 CmdArgs.push_back("-syslibroot");
4367 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004368 }
4369
Daniel Dunbarc1964212009-03-26 16:23:12 +00004370 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4371 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4372 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4373 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4374 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004375 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004376 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4377 Args.AddAllArgs(CmdArgs, options::OPT_y);
4378 Args.AddLastArg(CmdArgs, options::OPT_w);
4379 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4380 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4381 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4382 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4383 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4384 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4385 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4386 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4387 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4388 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4389 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4390 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4391}
4392
4393void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004394 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004395 const InputInfoList &Inputs,
4396 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004397 const char *LinkingOutput) const {
4398 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004399
Daniel Dunbarc1964212009-03-26 16:23:12 +00004400 // The logic here is derived from gcc's behavior; most of which
4401 // comes from specs (starting with link_command). Consult gcc for
4402 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004403 ArgStringList CmdArgs;
4404
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004405 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4406 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4407 options::OPT_ccc_arcmt_migrate)) {
4408 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4409 (*I)->claim();
4410 const char *Exec =
4411 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4412 CmdArgs.push_back(Output.getFilename());
4413 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4414 return;
4415 }
4416
Daniel Dunbarc1964212009-03-26 16:23:12 +00004417 // I'm not sure why this particular decomposition exists in gcc, but
4418 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004419 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004420
Daniel Dunbarc1964212009-03-26 16:23:12 +00004421 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4422 Args.AddAllArgs(CmdArgs, options::OPT_s);
4423 Args.AddAllArgs(CmdArgs, options::OPT_t);
4424 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4425 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004426 Args.AddLastArg(CmdArgs, options::OPT_e);
4427 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4428 Args.AddAllArgs(CmdArgs, options::OPT_r);
4429
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004430 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4431 // members of static archive libraries which implement Objective-C classes or
4432 // categories.
4433 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4434 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004435
Daniel Dunbarc1964212009-03-26 16:23:12 +00004436 CmdArgs.push_back("-o");
4437 CmdArgs.push_back(Output.getFilename());
4438
Chad Rosier06fd3c62012-05-16 23:45:12 +00004439 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004440 !Args.hasArg(options::OPT_nostartfiles)) {
4441 // Derived from startfile spec.
4442 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004443 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004444 if (getDarwinToolChain().isTargetIOSSimulator()) {
4445 // The simulator doesn't have a versioned crt1 file.
4446 CmdArgs.push_back("-ldylib1.o");
4447 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004448 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4449 CmdArgs.push_back("-ldylib1.o");
4450 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004451 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004452 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004453 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004454 CmdArgs.push_back("-ldylib1.10.5.o");
4455 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004456 } else {
4457 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004458 if (!Args.hasArg(options::OPT_static)) {
4459 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004460 if (getDarwinToolChain().isTargetIOSSimulator()) {
4461 // The simulator doesn't have a versioned crt1 file.
4462 CmdArgs.push_back("-lbundle1.o");
4463 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004464 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4465 CmdArgs.push_back("-lbundle1.o");
4466 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004467 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004468 CmdArgs.push_back("-lbundle1.o");
4469 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004470 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004471 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004472 if (Args.hasArg(options::OPT_pg) &&
4473 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004474 if (Args.hasArg(options::OPT_static) ||
4475 Args.hasArg(options::OPT_object) ||
4476 Args.hasArg(options::OPT_preload)) {
4477 CmdArgs.push_back("-lgcrt0.o");
4478 } else {
4479 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004480
Daniel Dunbarc1964212009-03-26 16:23:12 +00004481 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004482 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004483 // By default on OS X 10.8 and later, we don't link with a crt1.o
4484 // file and the linker knows to use _main as the entry point. But,
4485 // when compiling with -pg, we need to link with the gcrt1.o file,
4486 // so pass the -no_new_main option to tell the linker to use the
4487 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004488 if (getDarwinToolChain().isTargetMacOS() &&
4489 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4490 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004491 } else {
4492 if (Args.hasArg(options::OPT_static) ||
4493 Args.hasArg(options::OPT_object) ||
4494 Args.hasArg(options::OPT_preload)) {
4495 CmdArgs.push_back("-lcrt0.o");
4496 } else {
4497 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004498 if (getDarwinToolChain().isTargetIOSSimulator()) {
4499 // The simulator doesn't have a versioned crt1 file.
4500 CmdArgs.push_back("-lcrt1.o");
4501 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004502 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4503 CmdArgs.push_back("-lcrt1.o");
Bob Wilson2afa0112012-09-29 23:52:58 +00004504 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00004505 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004506 } else {
4507 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4508 CmdArgs.push_back("-lcrt1.o");
4509 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4510 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004511 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004512 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004513
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004514 // darwin_crt2 spec is empty.
4515 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004516 }
4517 }
4518 }
4519 }
4520
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004521 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4522 Args.hasArg(options::OPT_shared_libgcc) &&
4523 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004524 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004525 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004526 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004527 }
4528 }
4529
4530 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004531
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004532 // If we're building a dynamic lib with -faddress-sanitizer, unresolved
4533 // symbols may appear. Mark all of them as dynamic_lookup.
4534 // Linking executables is handled in lib/Driver/ToolChains.cpp.
4535 if (Args.hasFlag(options::OPT_faddress_sanitizer,
4536 options::OPT_fno_address_sanitizer, false)) {
4537 if (Args.hasArg(options::OPT_dynamiclib) ||
4538 Args.hasArg(options::OPT_bundle)) {
4539 CmdArgs.push_back("-undefined");
4540 CmdArgs.push_back("dynamic_lookup");
4541 }
4542 }
4543
Daniel Dunbarc1964212009-03-26 16:23:12 +00004544 if (Args.hasArg(options::OPT_fopenmp))
4545 // This is more complicated in gcc...
4546 CmdArgs.push_back("-lgomp");
4547
Douglas Gregor9295df02012-05-15 21:00:27 +00004548 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4549
Bob Wilson16d93952012-05-15 18:57:39 +00004550 if (isObjCRuntimeLinked(Args) &&
4551 !Args.hasArg(options::OPT_nostdlib) &&
4552 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004553 // Avoid linking compatibility stubs on i386 mac.
4554 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004555 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004556 // If we don't have ARC or subscripting runtime support, link in the
4557 // runtime stubs. We have to do this *before* adding any of the normal
4558 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004559 ObjCRuntime runtime =
4560 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004561 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004562 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004563 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004564 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004565 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004566 CmdArgs.push_back("-framework");
4567 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004568 // Link libobj.
4569 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004570 }
John McCall31168b02011-06-15 23:02:42 +00004571
Daniel Dunbarc1964212009-03-26 16:23:12 +00004572 if (LinkingOutput) {
4573 CmdArgs.push_back("-arch_multiple");
4574 CmdArgs.push_back("-final_output");
4575 CmdArgs.push_back(LinkingOutput);
4576 }
4577
Daniel Dunbarc1964212009-03-26 16:23:12 +00004578 if (Args.hasArg(options::OPT_fnested_functions))
4579 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004580
Daniel Dunbarc1964212009-03-26 16:23:12 +00004581 if (!Args.hasArg(options::OPT_nostdlib) &&
4582 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004583 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004584 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004585
Daniel Dunbarc1964212009-03-26 16:23:12 +00004586 // link_ssp spec is empty.
4587
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004588 // Let the tool chain choose which runtime library to link.
4589 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004590 }
4591
Chad Rosier06fd3c62012-05-16 23:45:12 +00004592 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004593 !Args.hasArg(options::OPT_nostartfiles)) {
4594 // endfile_spec is empty.
4595 }
4596
4597 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4598 Args.AddAllArgs(CmdArgs, options::OPT_F);
4599
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004600 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004601 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004602 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004603}
4604
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004605void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004606 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004607 const InputInfoList &Inputs,
4608 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004609 const char *LinkingOutput) const {
4610 ArgStringList CmdArgs;
4611
4612 CmdArgs.push_back("-create");
4613 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004614
4615 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004616 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004617
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004618 for (InputInfoList::const_iterator
4619 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4620 const InputInfo &II = *it;
4621 assert(II.isFilename() && "Unexpected lipo input.");
4622 CmdArgs.push_back(II.getFilename());
4623 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004624 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004625 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004626 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004627}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004628
Daniel Dunbar88299622010-06-04 18:28:36 +00004629void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004630 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004631 const InputInfoList &Inputs,
4632 const ArgList &Args,
4633 const char *LinkingOutput) const {
4634 ArgStringList CmdArgs;
4635
Daniel Dunbareb86b042011-05-09 17:23:16 +00004636 CmdArgs.push_back("-o");
4637 CmdArgs.push_back(Output.getFilename());
4638
Daniel Dunbar88299622010-06-04 18:28:36 +00004639 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4640 const InputInfo &Input = Inputs[0];
4641 assert(Input.isFilename() && "Unexpected dsymutil input.");
4642 CmdArgs.push_back(Input.getFilename());
4643
Daniel Dunbar88299622010-06-04 18:28:36 +00004644 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004645 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004646 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004647}
4648
Eric Christopher551ef452011-08-23 17:56:55 +00004649void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4650 const InputInfo &Output,
4651 const InputInfoList &Inputs,
4652 const ArgList &Args,
4653 const char *LinkingOutput) const {
4654 ArgStringList CmdArgs;
4655 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004656 CmdArgs.push_back("--debug-info");
4657 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004658 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004659
4660 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4661 const InputInfo &Input = Inputs[0];
4662 assert(Input.isFilename() && "Unexpected verify input");
4663
4664 // Grabbing the output of the earlier dsymutil run.
4665 CmdArgs.push_back(Input.getFilename());
4666
4667 const char *Exec =
4668 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4669 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4670}
4671
David Chisnallf571cde2012-02-15 13:39:01 +00004672void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4673 const InputInfo &Output,
4674 const InputInfoList &Inputs,
4675 const ArgList &Args,
4676 const char *LinkingOutput) const {
4677 ArgStringList CmdArgs;
4678
4679 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4680 options::OPT_Xassembler);
4681
4682 CmdArgs.push_back("-o");
4683 CmdArgs.push_back(Output.getFilename());
4684
4685 for (InputInfoList::const_iterator
4686 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4687 const InputInfo &II = *it;
4688 CmdArgs.push_back(II.getFilename());
4689 }
4690
4691 const char *Exec =
4692 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4693 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4694}
4695
4696
4697void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4698 const InputInfo &Output,
4699 const InputInfoList &Inputs,
4700 const ArgList &Args,
4701 const char *LinkingOutput) const {
4702 // FIXME: Find a real GCC, don't hard-code versions here
4703 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4704 const llvm::Triple &T = getToolChain().getTriple();
4705 std::string LibPath = "/usr/lib/";
4706 llvm::Triple::ArchType Arch = T.getArch();
4707 switch (Arch) {
4708 case llvm::Triple::x86:
4709 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4710 T.getOSName()).str() + "/4.5.2/";
4711 break;
4712 case llvm::Triple::x86_64:
4713 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4714 T.getOSName()).str();
4715 GCCLibPath += "/4.5.2/amd64/";
4716 LibPath += "amd64/";
4717 break;
4718 default:
4719 assert(0 && "Unsupported architecture");
4720 }
4721
4722 ArgStringList CmdArgs;
4723
David Chisnall272a0712012-02-29 15:06:12 +00004724 // Demangle C++ names in errors
4725 CmdArgs.push_back("-C");
4726
David Chisnallf571cde2012-02-15 13:39:01 +00004727 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4728 (!Args.hasArg(options::OPT_shared))) {
4729 CmdArgs.push_back("-e");
4730 CmdArgs.push_back("_start");
4731 }
4732
4733 if (Args.hasArg(options::OPT_static)) {
4734 CmdArgs.push_back("-Bstatic");
4735 CmdArgs.push_back("-dn");
4736 } else {
4737 CmdArgs.push_back("-Bdynamic");
4738 if (Args.hasArg(options::OPT_shared)) {
4739 CmdArgs.push_back("-shared");
4740 } else {
4741 CmdArgs.push_back("--dynamic-linker");
4742 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4743 }
4744 }
4745
4746 if (Output.isFilename()) {
4747 CmdArgs.push_back("-o");
4748 CmdArgs.push_back(Output.getFilename());
4749 } else {
4750 assert(Output.isNothing() && "Invalid output.");
4751 }
4752
4753 if (!Args.hasArg(options::OPT_nostdlib) &&
4754 !Args.hasArg(options::OPT_nostartfiles)) {
4755 if (!Args.hasArg(options::OPT_shared)) {
4756 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4757 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004758 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004759 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4760 } else {
4761 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004762 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4763 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004764 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004765 if (getToolChain().getDriver().CCCIsCXX)
4766 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004767 }
4768
4769 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4770
4771 Args.AddAllArgs(CmdArgs, options::OPT_L);
4772 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4773 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004774 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00004775
4776 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4777
4778 if (!Args.hasArg(options::OPT_nostdlib) &&
4779 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00004780 if (getToolChain().getDriver().CCCIsCXX)
4781 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00004782 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004783 if (!Args.hasArg(options::OPT_shared)) {
4784 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00004785 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00004786 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004787 }
David Chisnallf571cde2012-02-15 13:39:01 +00004788 }
4789
4790 if (!Args.hasArg(options::OPT_nostdlib) &&
4791 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00004792 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004793 }
David Chisnall96de9932012-02-16 16:00:47 +00004794 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004795
4796 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4797
4798 const char *Exec =
4799 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4800 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4801}
4802
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004803void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004804 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004805 const InputInfoList &Inputs,
4806 const ArgList &Args,
4807 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004808 ArgStringList CmdArgs;
4809
4810 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4811 options::OPT_Xassembler);
4812
4813 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004814 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004815
4816 for (InputInfoList::const_iterator
4817 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4818 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004819 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004820 }
4821
4822 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004823 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004824 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004825}
4826
4827void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004828 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004829 const InputInfoList &Inputs,
4830 const ArgList &Args,
4831 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004832 ArgStringList CmdArgs;
4833
4834 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004835 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004836 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004837 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004838 }
4839
4840 if (Args.hasArg(options::OPT_static)) {
4841 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004842 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004843 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004844// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004845 CmdArgs.push_back("-Bdynamic");
4846 if (Args.hasArg(options::OPT_shared)) {
4847 CmdArgs.push_back("-shared");
4848 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00004849 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004850 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4851 }
4852 }
4853
Daniel Dunbarb440f562010-08-02 02:38:21 +00004854 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004855 CmdArgs.push_back("-o");
4856 CmdArgs.push_back(Output.getFilename());
4857 } else {
4858 assert(Output.isNothing() && "Invalid output.");
4859 }
4860
4861 if (!Args.hasArg(options::OPT_nostdlib) &&
4862 !Args.hasArg(options::OPT_nostartfiles)) {
4863 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004864 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004865 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004866 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004867 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004868 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004869 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004870 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004871 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004872 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004873 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00004874 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004875 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004876 }
4877
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004878 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4879 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004880 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004881
4882 Args.AddAllArgs(CmdArgs, options::OPT_L);
4883 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4884 Args.AddAllArgs(CmdArgs, options::OPT_e);
4885
Daniel Dunbar54423b22010-09-17 00:24:54 +00004886 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004887
4888 if (!Args.hasArg(options::OPT_nostdlib) &&
4889 !Args.hasArg(options::OPT_nodefaultlibs)) {
4890 // FIXME: For some reason GCC passes -lgcc before adding
4891 // the default system libraries. Just mimic this for now.
4892 CmdArgs.push_back("-lgcc");
4893
4894 if (Args.hasArg(options::OPT_pthread))
4895 CmdArgs.push_back("-pthread");
4896 if (!Args.hasArg(options::OPT_shared))
4897 CmdArgs.push_back("-lc");
4898 CmdArgs.push_back("-lgcc");
4899 }
4900
4901 if (!Args.hasArg(options::OPT_nostdlib) &&
4902 !Args.hasArg(options::OPT_nostartfiles)) {
4903 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004904 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004905 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004906 }
4907
Bill Wendling08760582011-06-27 19:15:03 +00004908 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00004909
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004910 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004911 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004912 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004913}
4914
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004915void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004916 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004917 const InputInfoList &Inputs,
4918 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00004919 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004920 ArgStringList CmdArgs;
4921
4922 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4923 options::OPT_Xassembler);
4924
4925 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004926 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004927
4928 for (InputInfoList::const_iterator
4929 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4930 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004931 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004932 }
4933
4934 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004935 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004936 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004937}
4938
4939void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004940 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004941 const InputInfoList &Inputs,
4942 const ArgList &Args,
4943 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004944 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004945 ArgStringList CmdArgs;
4946
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004947 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004948 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004949 CmdArgs.push_back("-e");
4950 CmdArgs.push_back("__start");
4951 }
4952
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004953 if (Args.hasArg(options::OPT_static)) {
4954 CmdArgs.push_back("-Bstatic");
4955 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00004956 if (Args.hasArg(options::OPT_rdynamic))
4957 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004958 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004959 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004960 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004961 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004962 } else {
4963 CmdArgs.push_back("-dynamic-linker");
4964 CmdArgs.push_back("/usr/libexec/ld.so");
4965 }
4966 }
4967
Daniel Dunbarb440f562010-08-02 02:38:21 +00004968 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004969 CmdArgs.push_back("-o");
4970 CmdArgs.push_back(Output.getFilename());
4971 } else {
4972 assert(Output.isNothing() && "Invalid output.");
4973 }
4974
4975 if (!Args.hasArg(options::OPT_nostdlib) &&
4976 !Args.hasArg(options::OPT_nostartfiles)) {
4977 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00004978 if (Args.hasArg(options::OPT_pg))
4979 CmdArgs.push_back(Args.MakeArgString(
4980 getToolChain().GetFilePath("gcrt0.o")));
4981 else
4982 CmdArgs.push_back(Args.MakeArgString(
4983 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004984 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004985 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004986 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004987 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004988 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004989 }
4990 }
4991
Edward O'Callaghan5c521462009-10-28 15:13:08 +00004992 std::string Triple = getToolChain().getTripleString();
4993 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004994 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004995 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004996 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004997
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004998 Args.AddAllArgs(CmdArgs, options::OPT_L);
4999 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5000 Args.AddAllArgs(CmdArgs, options::OPT_e);
5001
Daniel Dunbar54423b22010-09-17 00:24:54 +00005002 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005003
5004 if (!Args.hasArg(options::OPT_nostdlib) &&
5005 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005006 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005007 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005008 if (Args.hasArg(options::OPT_pg))
5009 CmdArgs.push_back("-lm_p");
5010 else
5011 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005012 }
5013
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005014 // FIXME: For some reason GCC passes -lgcc before adding
5015 // the default system libraries. Just mimic this for now.
5016 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005017
Eric Christopher17674ec2012-09-13 06:32:34 +00005018 if (Args.hasArg(options::OPT_pthread)) {
5019 if (!Args.hasArg(options::OPT_shared) &&
5020 Args.hasArg(options::OPT_pg))
5021 CmdArgs.push_back("-lpthread_p");
5022 else
5023 CmdArgs.push_back("-lpthread");
5024 }
5025
Chandler Carruth45661652011-12-17 22:32:42 +00005026 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005027 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005028 CmdArgs.push_back("-lc_p");
5029 else
5030 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005031 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005032
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005033 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005034 }
5035
5036 if (!Args.hasArg(options::OPT_nostdlib) &&
5037 !Args.hasArg(options::OPT_nostartfiles)) {
5038 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005039 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005040 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005041 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005042 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005043 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005044 }
5045
5046 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005047 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005048 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005049}
Ed Schoutene33194b2009-04-02 19:13:12 +00005050
Eli Friedman9fa28852012-08-08 23:57:20 +00005051void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5052 const InputInfo &Output,
5053 const InputInfoList &Inputs,
5054 const ArgList &Args,
5055 const char *LinkingOutput) const {
5056 ArgStringList CmdArgs;
5057
5058 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5059 options::OPT_Xassembler);
5060
5061 CmdArgs.push_back("-o");
5062 CmdArgs.push_back(Output.getFilename());
5063
5064 for (InputInfoList::const_iterator
5065 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5066 const InputInfo &II = *it;
5067 CmdArgs.push_back(II.getFilename());
5068 }
5069
5070 const char *Exec =
5071 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5072 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5073}
5074
5075void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5076 const InputInfo &Output,
5077 const InputInfoList &Inputs,
5078 const ArgList &Args,
5079 const char *LinkingOutput) const {
5080 const Driver &D = getToolChain().getDriver();
5081 ArgStringList CmdArgs;
5082
5083 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5084 (!Args.hasArg(options::OPT_shared))) {
5085 CmdArgs.push_back("-e");
5086 CmdArgs.push_back("__start");
5087 }
5088
5089 if (Args.hasArg(options::OPT_static)) {
5090 CmdArgs.push_back("-Bstatic");
5091 } else {
5092 if (Args.hasArg(options::OPT_rdynamic))
5093 CmdArgs.push_back("-export-dynamic");
5094 CmdArgs.push_back("--eh-frame-hdr");
5095 CmdArgs.push_back("-Bdynamic");
5096 if (Args.hasArg(options::OPT_shared)) {
5097 CmdArgs.push_back("-shared");
5098 } else {
5099 CmdArgs.push_back("-dynamic-linker");
5100 CmdArgs.push_back("/usr/libexec/ld.so");
5101 }
5102 }
5103
5104 if (Output.isFilename()) {
5105 CmdArgs.push_back("-o");
5106 CmdArgs.push_back(Output.getFilename());
5107 } else {
5108 assert(Output.isNothing() && "Invalid output.");
5109 }
5110
5111 if (!Args.hasArg(options::OPT_nostdlib) &&
5112 !Args.hasArg(options::OPT_nostartfiles)) {
5113 if (!Args.hasArg(options::OPT_shared)) {
5114 if (Args.hasArg(options::OPT_pg))
5115 CmdArgs.push_back(Args.MakeArgString(
5116 getToolChain().GetFilePath("gcrt0.o")));
5117 else
5118 CmdArgs.push_back(Args.MakeArgString(
5119 getToolChain().GetFilePath("crt0.o")));
5120 CmdArgs.push_back(Args.MakeArgString(
5121 getToolChain().GetFilePath("crtbegin.o")));
5122 } else {
5123 CmdArgs.push_back(Args.MakeArgString(
5124 getToolChain().GetFilePath("crtbeginS.o")));
5125 }
5126 }
5127
5128 Args.AddAllArgs(CmdArgs, options::OPT_L);
5129 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5130 Args.AddAllArgs(CmdArgs, options::OPT_e);
5131
5132 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5133
5134 if (!Args.hasArg(options::OPT_nostdlib) &&
5135 !Args.hasArg(options::OPT_nodefaultlibs)) {
5136 if (D.CCCIsCXX) {
5137 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5138 if (Args.hasArg(options::OPT_pg))
5139 CmdArgs.push_back("-lm_p");
5140 else
5141 CmdArgs.push_back("-lm");
5142 }
5143
5144 if (Args.hasArg(options::OPT_pthread))
5145 CmdArgs.push_back("-lpthread");
5146 if (!Args.hasArg(options::OPT_shared)) {
5147 if (Args.hasArg(options::OPT_pg))
5148 CmdArgs.push_back("-lc_p");
5149 else
5150 CmdArgs.push_back("-lc");
5151 }
5152
5153 std::string myarch = "-lclang_rt.";
5154 const llvm::Triple &T = getToolChain().getTriple();
5155 llvm::Triple::ArchType Arch = T.getArch();
5156 switch (Arch) {
5157 case llvm::Triple::arm:
5158 myarch += ("arm");
5159 break;
5160 case llvm::Triple::x86:
5161 myarch += ("i386");
5162 break;
5163 case llvm::Triple::x86_64:
5164 myarch += ("amd64");
5165 break;
5166 default:
5167 assert(0 && "Unsupported architecture");
5168 }
5169 CmdArgs.push_back(Args.MakeArgString(myarch));
5170 }
5171
5172 if (!Args.hasArg(options::OPT_nostdlib) &&
5173 !Args.hasArg(options::OPT_nostartfiles)) {
5174 if (!Args.hasArg(options::OPT_shared))
5175 CmdArgs.push_back(Args.MakeArgString(
5176 getToolChain().GetFilePath("crtend.o")));
5177 else
5178 CmdArgs.push_back(Args.MakeArgString(
5179 getToolChain().GetFilePath("crtendS.o")));
5180 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005181
5182 const char *Exec =
5183 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5184 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005185}
5186
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005187void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005188 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005189 const InputInfoList &Inputs,
5190 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005191 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005192 ArgStringList CmdArgs;
5193
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005194 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5195 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005196 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005197 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005198 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005199 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005200 else if (getToolChain().getArch() == llvm::Triple::mips ||
5201 getToolChain().getArch() == llvm::Triple::mipsel ||
5202 getToolChain().getArch() == llvm::Triple::mips64 ||
5203 getToolChain().getArch() == llvm::Triple::mips64el) {
5204 StringRef CPUName;
5205 StringRef ABIName;
5206 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005207
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005208 CmdArgs.push_back("-march");
5209 CmdArgs.push_back(CPUName.data());
5210
5211 // Convert ABI name to the GNU tools acceptable variant.
5212 if (ABIName == "o32")
5213 ABIName = "32";
5214 else if (ABIName == "n64")
5215 ABIName = "64";
5216
5217 CmdArgs.push_back("-mabi");
5218 CmdArgs.push_back(ABIName.data());
5219
5220 if (getToolChain().getArch() == llvm::Triple::mips ||
5221 getToolChain().getArch() == llvm::Triple::mips64)
5222 CmdArgs.push_back("-EB");
5223 else
5224 CmdArgs.push_back("-EL");
5225
5226 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5227 options::OPT_fpic, options::OPT_fno_pic,
5228 options::OPT_fPIE, options::OPT_fno_PIE,
5229 options::OPT_fpie, options::OPT_fno_pie);
5230 if (LastPICArg &&
5231 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5232 LastPICArg->getOption().matches(options::OPT_fpic) ||
5233 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5234 LastPICArg->getOption().matches(options::OPT_fpie))) {
5235 CmdArgs.push_back("-KPIC");
5236 }
5237 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005238
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005239 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5240 options::OPT_Xassembler);
5241
5242 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005243 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005244
5245 for (InputInfoList::const_iterator
5246 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5247 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005248 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005249 }
5250
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005251 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005252 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005253 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005254}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005255
5256void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005257 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005258 const InputInfoList &Inputs,
5259 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005260 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005261 const toolchains::FreeBSD& ToolChain =
5262 static_cast<const toolchains::FreeBSD&>(getToolChain());
5263 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005264 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005265
5266 // Silence warning for "clang -g foo.o -o foo"
5267 Args.ClaimAllArgs(options::OPT_g_Group);
5268 // and "clang -emit-llvm foo.o -o foo"
5269 Args.ClaimAllArgs(options::OPT_emit_llvm);
5270 // and for "clang -w foo.o -o foo". Other warning options are already
5271 // handled somewhere else.
5272 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005273
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005274 if (!D.SysRoot.empty())
5275 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5276
Roman Divackyafe2f232012-08-28 15:09:03 +00005277 if (Args.hasArg(options::OPT_pie))
5278 CmdArgs.push_back("-pie");
5279
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005280 if (Args.hasArg(options::OPT_static)) {
5281 CmdArgs.push_back("-Bstatic");
5282 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005283 if (Args.hasArg(options::OPT_rdynamic))
5284 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005285 CmdArgs.push_back("--eh-frame-hdr");
5286 if (Args.hasArg(options::OPT_shared)) {
5287 CmdArgs.push_back("-Bshareable");
5288 } else {
5289 CmdArgs.push_back("-dynamic-linker");
5290 CmdArgs.push_back("/libexec/ld-elf.so.1");
5291 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005292 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5293 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005294 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5295 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5296 CmdArgs.push_back("--hash-style=both");
5297 }
5298 }
5299 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005300 }
5301
5302 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5303 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005304 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005305 CmdArgs.push_back("-m");
5306 CmdArgs.push_back("elf_i386_fbsd");
5307 }
5308
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005309 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005310 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005311 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005312 }
5313
Daniel Dunbarb440f562010-08-02 02:38:21 +00005314 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005315 CmdArgs.push_back("-o");
5316 CmdArgs.push_back(Output.getFilename());
5317 } else {
5318 assert(Output.isNothing() && "Invalid output.");
5319 }
5320
5321 if (!Args.hasArg(options::OPT_nostdlib) &&
5322 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005323 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005324 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005325 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005326 crt1 = "gcrt1.o";
5327 else if (Args.hasArg(options::OPT_pie))
5328 crt1 = "Scrt1.o";
5329 else
5330 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005331 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005332 if (crt1)
5333 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5334
5335 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5336
5337 const char *crtbegin = NULL;
5338 if (Args.hasArg(options::OPT_static))
5339 crtbegin = "crtbeginT.o";
5340 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5341 crtbegin = "crtbeginS.o";
5342 else
5343 crtbegin = "crtbegin.o";
5344
5345 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005346 }
5347
5348 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005349 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005350 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5351 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005352 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005353 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5354 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005355 Args.AddAllArgs(CmdArgs, options::OPT_s);
5356 Args.AddAllArgs(CmdArgs, options::OPT_t);
5357 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5358 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005359
Roman Divackyafe2f232012-08-28 15:09:03 +00005360 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005361
5362 if (!Args.hasArg(options::OPT_nostdlib) &&
5363 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005364 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005365 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005366 if (Args.hasArg(options::OPT_pg))
5367 CmdArgs.push_back("-lm_p");
5368 else
5369 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005370 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005371 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5372 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005373 if (Args.hasArg(options::OPT_pg))
5374 CmdArgs.push_back("-lgcc_p");
5375 else
5376 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005377 if (Args.hasArg(options::OPT_static)) {
5378 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005379 } else if (Args.hasArg(options::OPT_pg)) {
5380 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005381 } else {
5382 CmdArgs.push_back("--as-needed");
5383 CmdArgs.push_back("-lgcc_s");
5384 CmdArgs.push_back("--no-as-needed");
5385 }
5386
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005387 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005388 if (Args.hasArg(options::OPT_pg))
5389 CmdArgs.push_back("-lpthread_p");
5390 else
5391 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005392 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005393
Roman Divacky66f22762011-02-10 16:59:40 +00005394 if (Args.hasArg(options::OPT_pg)) {
5395 if (Args.hasArg(options::OPT_shared))
5396 CmdArgs.push_back("-lc");
5397 else
5398 CmdArgs.push_back("-lc_p");
5399 CmdArgs.push_back("-lgcc_p");
5400 } else {
5401 CmdArgs.push_back("-lc");
5402 CmdArgs.push_back("-lgcc");
5403 }
5404
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005405 if (Args.hasArg(options::OPT_static)) {
5406 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005407 } else if (Args.hasArg(options::OPT_pg)) {
5408 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005409 } else {
5410 CmdArgs.push_back("--as-needed");
5411 CmdArgs.push_back("-lgcc_s");
5412 CmdArgs.push_back("--no-as-needed");
5413 }
5414 }
5415
5416 if (!Args.hasArg(options::OPT_nostdlib) &&
5417 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005418 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005419 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005420 else
5421 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005422 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005423 }
5424
Roman Divackyafe2f232012-08-28 15:09:03 +00005425 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005426
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005427 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005428 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005429 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005430}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005431
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005432void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5433 const InputInfo &Output,
5434 const InputInfoList &Inputs,
5435 const ArgList &Args,
5436 const char *LinkingOutput) const {
5437 ArgStringList CmdArgs;
5438
5439 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5440 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005441 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005442 CmdArgs.push_back("--32");
5443
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005444 // Set byte order explicitly
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005445 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005446 CmdArgs.push_back("-EB");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005447 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005448 CmdArgs.push_back("-EL");
5449
5450 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5451 options::OPT_Xassembler);
5452
5453 CmdArgs.push_back("-o");
5454 CmdArgs.push_back(Output.getFilename());
5455
5456 for (InputInfoList::const_iterator
5457 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5458 const InputInfo &II = *it;
5459 CmdArgs.push_back(II.getFilename());
5460 }
5461
David Chisnallddbd68f2011-09-27 22:03:18 +00005462 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005463 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5464}
5465
5466void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5467 const InputInfo &Output,
5468 const InputInfoList &Inputs,
5469 const ArgList &Args,
5470 const char *LinkingOutput) const {
5471 const Driver &D = getToolChain().getDriver();
5472 ArgStringList CmdArgs;
5473
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005474 if (!D.SysRoot.empty())
5475 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5476
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005477 if (Args.hasArg(options::OPT_static)) {
5478 CmdArgs.push_back("-Bstatic");
5479 } else {
5480 if (Args.hasArg(options::OPT_rdynamic))
5481 CmdArgs.push_back("-export-dynamic");
5482 CmdArgs.push_back("--eh-frame-hdr");
5483 if (Args.hasArg(options::OPT_shared)) {
5484 CmdArgs.push_back("-Bshareable");
5485 } else {
5486 CmdArgs.push_back("-dynamic-linker");
5487 CmdArgs.push_back("/libexec/ld.elf_so");
5488 }
5489 }
5490
5491 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5492 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005493 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005494 CmdArgs.push_back("-m");
5495 CmdArgs.push_back("elf_i386");
5496 }
5497
5498 if (Output.isFilename()) {
5499 CmdArgs.push_back("-o");
5500 CmdArgs.push_back(Output.getFilename());
5501 } else {
5502 assert(Output.isNothing() && "Invalid output.");
5503 }
5504
5505 if (!Args.hasArg(options::OPT_nostdlib) &&
5506 !Args.hasArg(options::OPT_nostartfiles)) {
5507 if (!Args.hasArg(options::OPT_shared)) {
5508 CmdArgs.push_back(Args.MakeArgString(
5509 getToolChain().GetFilePath("crt0.o")));
5510 CmdArgs.push_back(Args.MakeArgString(
5511 getToolChain().GetFilePath("crti.o")));
5512 CmdArgs.push_back(Args.MakeArgString(
5513 getToolChain().GetFilePath("crtbegin.o")));
5514 } else {
5515 CmdArgs.push_back(Args.MakeArgString(
5516 getToolChain().GetFilePath("crti.o")));
5517 CmdArgs.push_back(Args.MakeArgString(
5518 getToolChain().GetFilePath("crtbeginS.o")));
5519 }
5520 }
5521
5522 Args.AddAllArgs(CmdArgs, options::OPT_L);
5523 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5524 Args.AddAllArgs(CmdArgs, options::OPT_e);
5525 Args.AddAllArgs(CmdArgs, options::OPT_s);
5526 Args.AddAllArgs(CmdArgs, options::OPT_t);
5527 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5528 Args.AddAllArgs(CmdArgs, options::OPT_r);
5529
5530 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5531
5532 if (!Args.hasArg(options::OPT_nostdlib) &&
5533 !Args.hasArg(options::OPT_nodefaultlibs)) {
5534 if (D.CCCIsCXX) {
5535 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5536 CmdArgs.push_back("-lm");
5537 }
5538 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5539 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005540 if (Args.hasArg(options::OPT_static)) {
5541 CmdArgs.push_back("-lgcc_eh");
5542 } else {
5543 CmdArgs.push_back("--as-needed");
5544 CmdArgs.push_back("-lgcc_s");
5545 CmdArgs.push_back("--no-as-needed");
5546 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005547 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005548
5549 if (Args.hasArg(options::OPT_pthread))
5550 CmdArgs.push_back("-lpthread");
5551 CmdArgs.push_back("-lc");
5552
5553 CmdArgs.push_back("-lgcc");
5554 if (Args.hasArg(options::OPT_static)) {
5555 CmdArgs.push_back("-lgcc_eh");
5556 } else {
5557 CmdArgs.push_back("--as-needed");
5558 CmdArgs.push_back("-lgcc_s");
5559 CmdArgs.push_back("--no-as-needed");
5560 }
5561 }
5562
5563 if (!Args.hasArg(options::OPT_nostdlib) &&
5564 !Args.hasArg(options::OPT_nostartfiles)) {
5565 if (!Args.hasArg(options::OPT_shared))
5566 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5567 "crtend.o")));
5568 else
5569 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5570 "crtendS.o")));
5571 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5572 "crtn.o")));
5573 }
5574
Bill Wendling08760582011-06-27 19:15:03 +00005575 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005576
David Chisnallddbd68f2011-09-27 22:03:18 +00005577 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005578 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5579}
5580
Rafael Espindola92b00932010-08-10 00:25:48 +00005581void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5582 const InputInfo &Output,
5583 const InputInfoList &Inputs,
5584 const ArgList &Args,
5585 const char *LinkingOutput) const {
5586 ArgStringList CmdArgs;
5587
5588 // Add --32/--64 to make sure we get the format we want.
5589 // This is incomplete
5590 if (getToolChain().getArch() == llvm::Triple::x86) {
5591 CmdArgs.push_back("--32");
5592 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5593 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005594 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5595 CmdArgs.push_back("-a32");
5596 CmdArgs.push_back("-mppc");
5597 CmdArgs.push_back("-many");
5598 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5599 CmdArgs.push_back("-a64");
5600 CmdArgs.push_back("-mppc64");
5601 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005602 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005603 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005604 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5605 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005606
5607 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5608 getToolChain().getTriple());
5609 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005610
5611 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5612 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5613 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005614 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5615 getToolChain().getArch() == llvm::Triple::mipsel ||
5616 getToolChain().getArch() == llvm::Triple::mips64 ||
5617 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005618 StringRef CPUName;
5619 StringRef ABIName;
5620 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005621
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005622 CmdArgs.push_back("-march");
5623 CmdArgs.push_back(CPUName.data());
5624
5625 // Convert ABI name to the GNU tools acceptable variant.
5626 if (ABIName == "o32")
5627 ABIName = "32";
5628 else if (ABIName == "n64")
5629 ABIName = "64";
5630
5631 CmdArgs.push_back("-mabi");
5632 CmdArgs.push_back(ABIName.data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005633
5634 if (getToolChain().getArch() == llvm::Triple::mips ||
5635 getToolChain().getArch() == llvm::Triple::mips64)
5636 CmdArgs.push_back("-EB");
5637 else
5638 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005639
5640 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5641 options::OPT_fpic, options::OPT_fno_pic,
5642 options::OPT_fPIE, options::OPT_fno_PIE,
5643 options::OPT_fpie, options::OPT_fno_pie);
5644 if (LastPICArg &&
5645 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5646 LastPICArg->getOption().matches(options::OPT_fpic) ||
5647 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5648 LastPICArg->getOption().matches(options::OPT_fpie))) {
5649 CmdArgs.push_back("-KPIC");
5650 }
Rafael Espindola92b00932010-08-10 00:25:48 +00005651 }
5652
5653 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5654 options::OPT_Xassembler);
5655
5656 CmdArgs.push_back("-o");
5657 CmdArgs.push_back(Output.getFilename());
5658
5659 for (InputInfoList::const_iterator
5660 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5661 const InputInfo &II = *it;
5662 CmdArgs.push_back(II.getFilename());
5663 }
5664
5665 const char *Exec =
5666 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5667 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5668}
5669
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005670static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5671 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00005672 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005673 bool StaticLibgcc = isAndroid || Args.hasArg(options::OPT_static) ||
Rafael Espindolacc354322011-10-17 21:39:04 +00005674 Args.hasArg(options::OPT_static_libgcc);
5675 if (!D.CCCIsCXX)
5676 CmdArgs.push_back("-lgcc");
5677
5678 if (StaticLibgcc) {
5679 if (D.CCCIsCXX)
5680 CmdArgs.push_back("-lgcc");
5681 } else {
5682 if (!D.CCCIsCXX)
5683 CmdArgs.push_back("--as-needed");
5684 CmdArgs.push_back("-lgcc_s");
5685 if (!D.CCCIsCXX)
5686 CmdArgs.push_back("--no-as-needed");
5687 }
5688
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005689 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005690 CmdArgs.push_back("-lgcc_eh");
5691 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5692 CmdArgs.push_back("-lgcc");
5693}
5694
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005695void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5696 const InputInfo &Output,
5697 const InputInfoList &Inputs,
5698 const ArgList &Args,
5699 const char *LinkingOutput) const {
5700 const toolchains::Linux& ToolChain =
5701 static_cast<const toolchains::Linux&>(getToolChain());
5702 const Driver &D = ToolChain.getDriver();
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005703 const bool isAndroid = ToolChain.getTriple().getEnvironment() ==
Logan Chienc6fd8202012-09-02 09:30:11 +00005704 llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005705
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005706 ArgStringList CmdArgs;
5707
Rafael Espindolad1002f62010-11-15 18:28:16 +00005708 // Silence warning for "clang -g foo.o -o foo"
5709 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005710 // and "clang -emit-llvm foo.o -o foo"
5711 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00005712 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005713 // handled somewhere else.
5714 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005715
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005716 if (!D.SysRoot.empty())
5717 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005718
Rafael Espindolad47ac232010-11-17 22:26:15 +00005719 if (Args.hasArg(options::OPT_pie))
5720 CmdArgs.push_back("-pie");
5721
Rafael Espindola1c76c592010-11-07 22:57:16 +00005722 if (Args.hasArg(options::OPT_rdynamic))
5723 CmdArgs.push_back("-export-dynamic");
5724
Rafael Espindola34d77dc2010-11-11 19:34:42 +00005725 if (Args.hasArg(options::OPT_s))
5726 CmdArgs.push_back("-s");
5727
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005728 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5729 e = ToolChain.ExtraOpts.end();
5730 i != e; ++i)
5731 CmdArgs.push_back(i->c_str());
5732
5733 if (!Args.hasArg(options::OPT_static)) {
5734 CmdArgs.push_back("--eh-frame-hdr");
5735 }
5736
5737 CmdArgs.push_back("-m");
5738 if (ToolChain.getArch() == llvm::Triple::x86)
5739 CmdArgs.push_back("elf_i386");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005740 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00005741 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005742 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005743 else if (ToolChain.getArch() == llvm::Triple::ppc)
5744 CmdArgs.push_back("elf32ppclinux");
5745 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5746 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005747 else if (ToolChain.getArch() == llvm::Triple::mips)
5748 CmdArgs.push_back("elf32btsmip");
5749 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5750 CmdArgs.push_back("elf32ltsmip");
5751 else if (ToolChain.getArch() == llvm::Triple::mips64)
5752 CmdArgs.push_back("elf64btsmip");
5753 else if (ToolChain.getArch() == llvm::Triple::mips64el)
5754 CmdArgs.push_back("elf64ltsmip");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005755 else
5756 CmdArgs.push_back("elf_x86_64");
5757
5758 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00005759 if (ToolChain.getArch() == llvm::Triple::arm
5760 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005761 CmdArgs.push_back("-Bstatic");
5762 else
5763 CmdArgs.push_back("-static");
5764 } else if (Args.hasArg(options::OPT_shared)) {
5765 CmdArgs.push_back("-shared");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005766 if ((ToolChain.getArch() == llvm::Triple::arm
5767 || ToolChain.getArch() == llvm::Triple::thumb) && isAndroid) {
5768 CmdArgs.push_back("-Bsymbolic");
5769 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005770 }
5771
5772 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00005773 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005774 (!Args.hasArg(options::OPT_static) &&
5775 !Args.hasArg(options::OPT_shared))) {
5776 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005777 if (isAndroid)
5778 CmdArgs.push_back("/system/bin/linker");
5779 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005780 CmdArgs.push_back("/lib/ld-linux.so.2");
Douglas Gregord9bb1522011-03-06 19:11:49 +00005781 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liueabbf922012-07-30 11:05:56 +00005782 ToolChain.getArch() == llvm::Triple::thumb) {
5783 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5784 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5785 else
5786 CmdArgs.push_back("/lib/ld-linux.so.3");
5787 }
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005788 else if (ToolChain.getArch() == llvm::Triple::mips ||
5789 ToolChain.getArch() == llvm::Triple::mipsel)
5790 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan1e1e2e22012-04-06 20:14:27 +00005791 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
5792 ToolChain.getArch() == llvm::Triple::mips64el)
5793 CmdArgs.push_back("/lib64/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005794 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner20b90d02011-04-11 21:15:37 +00005795 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005796 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner20b90d02011-04-11 21:15:37 +00005797 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005798 else
5799 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5800 }
5801
5802 CmdArgs.push_back("-o");
5803 CmdArgs.push_back(Output.getFilename());
5804
Rafael Espindola81937ec2010-12-01 01:52:43 +00005805 if (!Args.hasArg(options::OPT_nostdlib) &&
5806 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005807 if (!isAndroid) {
5808 const char *crt1 = NULL;
5809 if (!Args.hasArg(options::OPT_shared)){
5810 if (Args.hasArg(options::OPT_pie))
5811 crt1 = "Scrt1.o";
5812 else
5813 crt1 = "crt1.o";
5814 }
5815 if (crt1)
5816 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005817
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005818 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5819 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005820
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005821 const char *crtbegin;
5822 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005823 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005824 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005825 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005826 else if (Args.hasArg(options::OPT_pie))
5827 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005828 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005829 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005830 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00005831
5832 // Add crtfastmath.o if available and fast math is enabled.
5833 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005834 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005835
5836 Args.AddAllArgs(CmdArgs, options::OPT_L);
5837
5838 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5839
Roman Divackyee8188a2011-03-01 17:53:14 +00005840 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5841 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005842 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005843
Rafael Espindola9446d762012-04-09 23:53:34 +00005844 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5845 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5846 // forward.
5847 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5848 CmdArgs.push_back("-plugin");
5849 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5850 CmdArgs.push_back(Args.MakeArgString(Plugin));
5851 }
5852
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00005853 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5854 CmdArgs.push_back("--no-demangle");
5855
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005856 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5857
Chandler Carruth94a32012012-05-14 18:31:18 +00005858 if (D.CCCIsCXX &&
5859 !Args.hasArg(options::OPT_nostdlib) &&
5860 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00005861 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5862 !Args.hasArg(options::OPT_static);
5863 if (OnlyLibstdcxxStatic)
5864 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005865 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00005866 if (OnlyLibstdcxxStatic)
5867 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005868 CmdArgs.push_back("-lm");
5869 }
5870
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005871 // Call this before we add the C run-time.
5872 addAsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00005873 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005874
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005875 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00005876 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5877 if (Args.hasArg(options::OPT_static))
5878 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00005879
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005880 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005881
Chandler Carruth94a32012012-05-14 18:31:18 +00005882 if (Args.hasArg(options::OPT_pthread) ||
5883 Args.hasArg(options::OPT_pthreads))
5884 CmdArgs.push_back("-lpthread");
5885
5886 CmdArgs.push_back("-lc");
5887
5888 if (Args.hasArg(options::OPT_static))
5889 CmdArgs.push_back("--end-group");
5890 else
5891 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5892 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00005893
Rafael Espindola81937ec2010-12-01 01:52:43 +00005894 if (!Args.hasArg(options::OPT_nostartfiles)) {
5895 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005896 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005897 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005898 else if (Args.hasArg(options::OPT_pie))
5899 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00005900 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005901 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005902
Rafael Espindola81937ec2010-12-01 01:52:43 +00005903 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005904 if (!isAndroid)
5905 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00005906 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005907 }
5908
Bill Wendling08760582011-06-27 19:15:03 +00005909 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005910
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005911 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5912}
Rafael Espindola92b00932010-08-10 00:25:48 +00005913
Chris Lattner3e2ee142010-07-07 16:01:42 +00005914void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005915 const InputInfo &Output,
5916 const InputInfoList &Inputs,
5917 const ArgList &Args,
5918 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005919 ArgStringList CmdArgs;
5920
5921 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5922 options::OPT_Xassembler);
5923
5924 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005925 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005926
5927 for (InputInfoList::const_iterator
5928 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5929 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005930 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005931 }
5932
5933 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00005934 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005935 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005936}
5937
5938void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005939 const InputInfo &Output,
5940 const InputInfoList &Inputs,
5941 const ArgList &Args,
5942 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005943 const Driver &D = getToolChain().getDriver();
5944 ArgStringList CmdArgs;
5945
Daniel Dunbarb440f562010-08-02 02:38:21 +00005946 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005947 CmdArgs.push_back("-o");
5948 CmdArgs.push_back(Output.getFilename());
5949 } else {
5950 assert(Output.isNothing() && "Invalid output.");
5951 }
5952
5953 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00005954 !Args.hasArg(options::OPT_nostartfiles)) {
5955 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
5956 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5957 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
5958 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
5959 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005960
5961 Args.AddAllArgs(CmdArgs, options::OPT_L);
5962 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5963 Args.AddAllArgs(CmdArgs, options::OPT_e);
5964
Daniel Dunbar54423b22010-09-17 00:24:54 +00005965 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005966
Eli Friedman83de5132011-12-08 23:54:21 +00005967 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5968
Chris Lattner3e2ee142010-07-07 16:01:42 +00005969 if (!Args.hasArg(options::OPT_nostdlib) &&
5970 !Args.hasArg(options::OPT_nodefaultlibs)) {
5971 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005972 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005973 CmdArgs.push_back("-lm");
5974 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005975 }
5976
5977 if (!Args.hasArg(options::OPT_nostdlib) &&
5978 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00005979 if (Args.hasArg(options::OPT_pthread))
5980 CmdArgs.push_back("-lpthread");
5981 CmdArgs.push_back("-lc");
5982 CmdArgs.push_back("-lCompilerRT-Generic");
5983 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
5984 CmdArgs.push_back(
5985 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005986 }
5987
Eli Friedman83de5132011-12-08 23:54:21 +00005988 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005989 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005990}
5991
Daniel Dunbarcc912342009-05-02 18:28:39 +00005992/// DragonFly Tools
5993
5994// For now, DragonFly Assemble does just about the same as for
5995// FreeBSD, but this may change soon.
5996void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005997 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005998 const InputInfoList &Inputs,
5999 const ArgList &Args,
6000 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006001 ArgStringList CmdArgs;
6002
6003 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6004 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006005 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00006006 CmdArgs.push_back("--32");
6007
6008 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6009 options::OPT_Xassembler);
6010
6011 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006012 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006013
6014 for (InputInfoList::const_iterator
6015 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6016 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006017 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006018 }
6019
6020 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006021 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006022 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006023}
6024
6025void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006026 const InputInfo &Output,
6027 const InputInfoList &Inputs,
6028 const ArgList &Args,
6029 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006030 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00006031 ArgStringList CmdArgs;
6032
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006033 if (!D.SysRoot.empty())
6034 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6035
Daniel Dunbarcc912342009-05-02 18:28:39 +00006036 if (Args.hasArg(options::OPT_static)) {
6037 CmdArgs.push_back("-Bstatic");
6038 } else {
6039 if (Args.hasArg(options::OPT_shared))
6040 CmdArgs.push_back("-Bshareable");
6041 else {
6042 CmdArgs.push_back("-dynamic-linker");
6043 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6044 }
6045 }
6046
6047 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6048 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006049 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006050 CmdArgs.push_back("-m");
6051 CmdArgs.push_back("elf_i386");
6052 }
6053
Daniel Dunbarb440f562010-08-02 02:38:21 +00006054 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006055 CmdArgs.push_back("-o");
6056 CmdArgs.push_back(Output.getFilename());
6057 } else {
6058 assert(Output.isNothing() && "Invalid output.");
6059 }
6060
6061 if (!Args.hasArg(options::OPT_nostdlib) &&
6062 !Args.hasArg(options::OPT_nostartfiles)) {
6063 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006064 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006065 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006066 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006067 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006068 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006069 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006070 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006071 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006072 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006073 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006074 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006075 }
6076 }
6077
6078 Args.AddAllArgs(CmdArgs, options::OPT_L);
6079 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6080 Args.AddAllArgs(CmdArgs, options::OPT_e);
6081
Daniel Dunbar54423b22010-09-17 00:24:54 +00006082 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006083
6084 if (!Args.hasArg(options::OPT_nostdlib) &&
6085 !Args.hasArg(options::OPT_nodefaultlibs)) {
6086 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6087 // rpaths
6088 CmdArgs.push_back("-L/usr/lib/gcc41");
6089
6090 if (!Args.hasArg(options::OPT_static)) {
6091 CmdArgs.push_back("-rpath");
6092 CmdArgs.push_back("/usr/lib/gcc41");
6093
6094 CmdArgs.push_back("-rpath-link");
6095 CmdArgs.push_back("/usr/lib/gcc41");
6096
6097 CmdArgs.push_back("-rpath");
6098 CmdArgs.push_back("/usr/lib");
6099
6100 CmdArgs.push_back("-rpath-link");
6101 CmdArgs.push_back("/usr/lib");
6102 }
6103
Rafael Espindola38360b32010-07-20 12:59:03 +00006104 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006105 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006106 CmdArgs.push_back("-lm");
6107 }
6108
Daniel Dunbarcc912342009-05-02 18:28:39 +00006109 if (Args.hasArg(options::OPT_shared)) {
6110 CmdArgs.push_back("-lgcc_pic");
6111 } else {
6112 CmdArgs.push_back("-lgcc");
6113 }
6114
6115
6116 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006117 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006118
6119 if (!Args.hasArg(options::OPT_nolibc)) {
6120 CmdArgs.push_back("-lc");
6121 }
6122
6123 if (Args.hasArg(options::OPT_shared)) {
6124 CmdArgs.push_back("-lgcc_pic");
6125 } else {
6126 CmdArgs.push_back("-lgcc");
6127 }
6128 }
6129
6130 if (!Args.hasArg(options::OPT_nostdlib) &&
6131 !Args.hasArg(options::OPT_nostartfiles)) {
6132 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006133 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006134 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006135 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006136 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006137 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006138 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006139 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006140 }
6141
Bill Wendling08760582011-06-27 19:15:03 +00006142 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006143
Daniel Dunbarcc912342009-05-02 18:28:39 +00006144 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006145 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006146 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006147}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006148
6149void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6150 const InputInfo &Output,
6151 const InputInfoList &Inputs,
6152 const ArgList &Args,
6153 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006154 ArgStringList CmdArgs;
6155
6156 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006157 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6158 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006159 } else {
6160 assert(Output.isNothing() && "Invalid output.");
6161 }
6162
6163 if (!Args.hasArg(options::OPT_nostdlib) &&
6164 !Args.hasArg(options::OPT_nostartfiles)) {
6165 CmdArgs.push_back("-defaultlib:libcmt");
6166 }
6167
6168 CmdArgs.push_back("-nologo");
6169
Michael J. Spencere2f49362012-06-18 16:56:04 +00006170 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6171
6172 // Add filenames immediately.
6173 for (InputInfoList::const_iterator
6174 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6175 if (it->isFilename())
6176 CmdArgs.push_back(it->getFilename());
6177 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006178
6179 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006180 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006181 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6182}