blob: 12564b43f6c9c990c0ae7e01a91cdc11882d379e [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")
Chad Rosier9ac84512011-10-07 17:48:56 +0000449 .Default("");
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000450}
451
Benjamin Kramer09811c72012-06-26 22:20:06 +0000452/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
453//
454// FIXME: tblgen this.
455static std::string getARMTargetCPU(const ArgList &Args,
456 const llvm::Triple &Triple) {
457 // FIXME: Warn on inconsistent use of -mcpu and -march.
458
459 // If we have -mcpu=, use that.
460 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
461 StringRef MCPU = A->getValue(Args);
462 // Handle -mcpu=native.
463 if (MCPU == "native")
464 return llvm::sys::getHostCPUName();
465 else
466 return MCPU;
467 }
468
469 StringRef MArch;
470 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
471 // Otherwise, if we have -march= choose the base CPU for that arch.
472 MArch = A->getValue(Args);
473 } else {
474 // Otherwise, use the Arch from the triple.
475 MArch = Triple.getArchName();
476 }
477
478 // Handle -march=native.
479 std::string NativeMArch;
480 if (MArch == "native") {
481 std::string CPU = llvm::sys::getHostCPUName();
482 if (CPU != "generic") {
483 // Translate the native cpu into the architecture. The switch below will
484 // then chose the minimum cpu for that arch.
485 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
486 MArch = NativeMArch;
487 }
488 }
489
490 return llvm::StringSwitch<const char *>(MArch)
491 .Cases("armv2", "armv2a","arm2")
492 .Case("armv3", "arm6")
493 .Case("armv3m", "arm7m")
494 .Cases("armv4", "armv4t", "arm7tdmi")
495 .Cases("armv5", "armv5t", "arm10tdmi")
496 .Cases("armv5e", "armv5te", "arm1022e")
497 .Case("armv5tej", "arm926ej-s")
498 .Cases("armv6", "armv6k", "arm1136jf-s")
499 .Case("armv6j", "arm1136j-s")
500 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
501 .Case("armv6t2", "arm1156t2-s")
502 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
503 .Cases("armv7r", "armv7-r", "cortex-r4")
504 .Cases("armv7m", "armv7-m", "cortex-m3")
505 .Case("ep9312", "ep9312")
506 .Case("iwmmxt", "iwmmxt")
507 .Case("xscale", "xscale")
508 .Cases("armv6m", "armv6-m", "cortex-m0")
509 // If all else failed, return the most base CPU LLVM supports.
510 .Default("arm7tdmi");
511}
512
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000513// FIXME: Move to target hook.
514static bool isSignedCharDefault(const llvm::Triple &Triple) {
515 switch (Triple.getArch()) {
516 default:
517 return true;
518
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000519 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000520 case llvm::Triple::ppc:
521 case llvm::Triple::ppc64:
Bob Wilson6524dd32011-10-14 05:03:44 +0000522 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000523 return true;
524 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000525 }
526}
527
Chad Rosiercfbfc582012-04-04 20:51:35 +0000528// Handle -mfpu=.
529//
530// FIXME: Centralize feature selection, defaulting shouldn't be also in the
531// frontend target.
532static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
533 ArgStringList &CmdArgs) {
534 StringRef FPU = A->getValue(Args);
535
536 // Set the target features based on the FPU.
537 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
538 // Disable any default FPU support.
539 CmdArgs.push_back("-target-feature");
540 CmdArgs.push_back("-vfp2");
541 CmdArgs.push_back("-target-feature");
542 CmdArgs.push_back("-vfp3");
543 CmdArgs.push_back("-target-feature");
544 CmdArgs.push_back("-neon");
545 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
546 CmdArgs.push_back("-target-feature");
547 CmdArgs.push_back("+vfp3");
548 CmdArgs.push_back("-target-feature");
549 CmdArgs.push_back("+d16");
550 CmdArgs.push_back("-target-feature");
551 CmdArgs.push_back("-neon");
552 } else if (FPU == "vfp") {
553 CmdArgs.push_back("-target-feature");
554 CmdArgs.push_back("+vfp2");
555 CmdArgs.push_back("-target-feature");
556 CmdArgs.push_back("-neon");
557 } else if (FPU == "vfp3" || FPU == "vfpv3") {
558 CmdArgs.push_back("-target-feature");
559 CmdArgs.push_back("+vfp3");
560 CmdArgs.push_back("-target-feature");
561 CmdArgs.push_back("-neon");
562 } else if (FPU == "neon") {
563 CmdArgs.push_back("-target-feature");
564 CmdArgs.push_back("+neon");
565 } else
566 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
567}
568
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000569// Handle -mfpmath=.
570static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
Chad Rosier45619cb2012-04-04 22:13:40 +0000571 ArgStringList &CmdArgs, StringRef CPU) {
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000572 StringRef FPMath = A->getValue(Args);
573
574 // Set the target features based on the FPMath.
575 if (FPMath == "neon") {
576 CmdArgs.push_back("-target-feature");
577 CmdArgs.push_back("+neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000578
Silviu Baranga157f7c62012-09-13 15:06:00 +0000579 if (CPU != "cortex-a8" && CPU != "cortex-a9" && CPU != "cortex-a9-mp" &&
580 CPU != "cortex-a15")
Chad Rosier45619cb2012-04-04 22:13:40 +0000581 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
582
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000583 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
584 FPMath == "vfp4") {
585 CmdArgs.push_back("-target-feature");
586 CmdArgs.push_back("-neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000587
588 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000589 } else
590 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
591}
592
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000593// Select the float ABI as determined by -msoft-float, -mhard-float, and
594// -mfloat-abi=.
595static StringRef getARMFloatABI(const Driver &D,
596 const ArgList &Args,
597 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000598 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000599 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
600 options::OPT_mhard_float,
601 options::OPT_mfloat_abi_EQ)) {
602 if (A->getOption().matches(options::OPT_msoft_float))
603 FloatABI = "soft";
604 else if (A->getOption().matches(options::OPT_mhard_float))
605 FloatABI = "hard";
606 else {
607 FloatABI = A->getValue(Args);
608 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000609 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000610 << A->getAsString(Args);
611 FloatABI = "soft";
612 }
613 }
614 }
615
616 // If unspecified, choose the default based on the platform.
617 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000618 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000619 case llvm::Triple::Darwin:
620 case llvm::Triple::MacOSX:
621 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000622 // Darwin defaults to "softfp" for v6 and v7.
623 //
624 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000625 std::string ArchName =
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000626 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000627 if (StringRef(ArchName).startswith("v6") ||
628 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000629 FloatABI = "softfp";
630 else
631 FloatABI = "soft";
632 break;
633 }
634
635 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000636 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000637 case llvm::Triple::GNUEABIHF:
638 FloatABI = "hard";
639 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000640 case llvm::Triple::GNUEABI:
641 FloatABI = "softfp";
642 break;
643 case llvm::Triple::EABI:
644 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
645 FloatABI = "softfp";
646 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000647 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000648 std::string ArchName =
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000649 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000650 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000651 FloatABI = "softfp";
652 else
653 FloatABI = "soft";
654 break;
655 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000656 default:
657 // Assume "soft", but warn the user we are guessing.
658 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000659 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000660 break;
661 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000662 }
663 }
664
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000665 return FloatABI;
666}
667
668
669void Clang::AddARMTargetArgs(const ArgList &Args,
670 ArgStringList &CmdArgs,
671 bool KernelOrKext) const {
672 const Driver &D = getToolChain().getDriver();
673 llvm::Triple Triple = getToolChain().getTriple();
674
675 // Select the ABI to use.
676 //
677 // FIXME: Support -meabi.
678 const char *ABIName = 0;
679 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
680 ABIName = A->getValue(Args);
681 } else {
682 // Select the default based on the platform.
683 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000684 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000685 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000686 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000687 ABIName = "aapcs-linux";
688 break;
689 case llvm::Triple::EABI:
690 ABIName = "aapcs";
691 break;
692 default:
693 ABIName = "apcs-gnu";
694 }
695 }
696 CmdArgs.push_back("-target-abi");
697 CmdArgs.push_back(ABIName);
698
699 // Set the CPU based on -march= and -mcpu=.
700 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +0000701 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000702
703 // Determine floating point ABI from the options & target defaults.
704 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000705 if (FloatABI == "soft") {
706 // Floating point operations and argument passing are soft.
707 //
708 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000709 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000710 CmdArgs.push_back("-mfloat-abi");
711 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000712 } else if (FloatABI == "softfp") {
713 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000714 CmdArgs.push_back("-mfloat-abi");
715 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000716 } else {
717 // Floating point operations and argument passing are hard.
718 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000719 CmdArgs.push_back("-mfloat-abi");
720 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000721 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000722
723 // Set appropriate target features for floating point mode.
724 //
725 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
726 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
727 // stripped out by the ARM target.
728
729 // Use software floating point operations?
730 if (FloatABI == "soft") {
731 CmdArgs.push_back("-target-feature");
732 CmdArgs.push_back("+soft-float");
733 }
734
735 // Use software floating point argument passing?
736 if (FloatABI != "hard") {
737 CmdArgs.push_back("-target-feature");
738 CmdArgs.push_back("+soft-float-abi");
739 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +0000740
741 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +0000742 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +0000743 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000744
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000745 // Honor -mfpmath=.
746 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +0000747 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000748
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000749 // Setting -msoft-float effectively disables NEON because of the GCC
750 // implementation, although the same isn't true of VFP or VFP3.
751 if (FloatABI == "soft") {
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000752 CmdArgs.push_back("-target-feature");
753 CmdArgs.push_back("-neon");
754 }
755
756 // Kernel code has more strict alignment requirements.
757 if (KernelOrKext) {
Daniel Dunbar12100e22011-03-22 16:48:17 +0000758 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000759 CmdArgs.push_back("-arm-long-calls");
760
Daniel Dunbar12100e22011-03-22 16:48:17 +0000761 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000762 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000763
764 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000765 CmdArgs.push_back("-backend-option");
766 CmdArgs.push_back("-arm-darwin-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000767 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000768
769 // Setting -mno-global-merge disables the codegen global merge pass. Setting
770 // -mglobal-merge has no effect as the pass is enabled by default.
771 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
772 options::OPT_mno_global_merge)) {
773 if (A->getOption().matches(options::OPT_mno_global_merge))
774 CmdArgs.push_back("-mno-global-merge");
775 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000776
Chad Rosierc14ded72012-05-16 21:19:55 +0000777 if (Args.hasArg(options::OPT_mno_implicit_float))
Chad Rosierf1985d22012-05-16 20:40:09 +0000778 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000779}
780
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000781// Translate MIPS CPU name alias option to CPU name.
782static StringRef getMipsCPUFromAlias(const Arg &A) {
783 if (A.getOption().matches(options::OPT_mips32))
784 return "mips32";
785 if (A.getOption().matches(options::OPT_mips32r2))
786 return "mips32r2";
787 if (A.getOption().matches(options::OPT_mips64))
788 return "mips64";
789 if (A.getOption().matches(options::OPT_mips64r2))
790 return "mips64r2";
791 llvm_unreachable("Unexpected option");
792 return "";
793}
794
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000795// Get CPU and ABI names. They are not independent
796// so we have to calculate them together.
797static void getMipsCPUAndABI(const ArgList &Args,
798 const ToolChain &TC,
799 StringRef &CPUName,
800 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000801 const char *DefMips32CPU = "mips32";
802 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000803
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000804 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000805 options::OPT_mcpu_EQ,
806 options::OPT_mips_CPUs_Group)) {
807 if (A->getOption().matches(options::OPT_mips_CPUs_Group))
808 CPUName = getMipsCPUFromAlias(*A);
809 else
810 CPUName = A->getValue(Args);
811 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000812
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000813 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
Eric Christopher0b26a612010-03-02 02:41:08 +0000814 ABIName = A->getValue(Args);
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000815
816 // Setup default CPU and ABI names.
817 if (CPUName.empty() && ABIName.empty()) {
818 switch (TC.getTriple().getArch()) {
819 default:
820 llvm_unreachable("Unexpected triple arch name");
821 case llvm::Triple::mips:
822 case llvm::Triple::mipsel:
823 CPUName = DefMips32CPU;
824 break;
825 case llvm::Triple::mips64:
826 case llvm::Triple::mips64el:
827 CPUName = DefMips64CPU;
828 break;
829 }
830 }
831
832 if (!ABIName.empty()) {
833 // Deduce CPU name from ABI name.
834 CPUName = llvm::StringSwitch<const char *>(ABIName)
835 .Cases("o32", "eabi", DefMips32CPU)
836 .Cases("n32", "n64", DefMips64CPU)
837 .Default("");
838 }
839 else if (!CPUName.empty()) {
840 // Deduce ABI name from CPU name.
841 ABIName = llvm::StringSwitch<const char *>(CPUName)
842 .Cases("mips32", "mips32r2", "o32")
843 .Cases("mips64", "mips64r2", "n64")
844 .Default("");
845 }
846
847 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000848}
849
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000850// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
851// and -mfloat-abi=.
852static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000853 // Select the float ABI as determined by -msoft-float, -mhard-float,
854 // and -mfloat-abi=.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000855 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000856 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000857 options::OPT_mhard_float,
858 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000859 if (A->getOption().matches(options::OPT_msoft_float))
860 FloatABI = "soft";
861 else if (A->getOption().matches(options::OPT_mhard_float))
862 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000863 else {
864 FloatABI = A->getValue(Args);
865 if (FloatABI != "soft" && FloatABI != "single" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000866 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000867 FloatABI = "hard";
868 }
869 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000870 }
871
872 // If unspecified, choose the default based on the platform.
873 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000874 // Assume "hard", because it's a default value used by gcc.
875 // When we start to recognize specific target MIPS processors,
876 // we will be able to select the default more correctly.
877 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000878 }
879
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000880 return FloatABI;
881}
882
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000883static void AddTargetFeature(const ArgList &Args,
884 ArgStringList &CmdArgs,
885 OptSpecifier OnOpt,
886 OptSpecifier OffOpt,
887 StringRef FeatureName) {
888 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
889 CmdArgs.push_back("-target-feature");
890 if (A->getOption().matches(OnOpt))
891 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
892 else
893 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
894 }
895}
896
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000897void Clang::AddMIPSTargetArgs(const ArgList &Args,
898 ArgStringList &CmdArgs) const {
899 const Driver &D = getToolChain().getDriver();
900 StringRef CPUName;
901 StringRef ABIName;
902 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
903
904 CmdArgs.push_back("-target-cpu");
905 CmdArgs.push_back(CPUName.data());
906
907 CmdArgs.push_back("-target-abi");
908 CmdArgs.push_back(ABIName.data());
909
910 StringRef FloatABI = getMipsFloatABI(D, Args);
911
Eric Christopher0b26a612010-03-02 02:41:08 +0000912 if (FloatABI == "soft") {
913 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +0000914 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000915 CmdArgs.push_back("-mfloat-abi");
916 CmdArgs.push_back("soft");
917
918 // FIXME: Note, this is a hack. We need to pass the selected float
919 // mode to the MipsTargetInfoBase to define appropriate macros there.
920 // Now it is the only method.
921 CmdArgs.push_back("-target-feature");
922 CmdArgs.push_back("+soft-float");
923 }
924 else if (FloatABI == "single") {
925 // Restrict the use of hardware floating-point
926 // instructions to 32-bit operations.
927 CmdArgs.push_back("-target-feature");
928 CmdArgs.push_back("+single-float");
929 }
930 else {
931 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +0000932 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000933 CmdArgs.push_back("-mfloat-abi");
934 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +0000935 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +0000936
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000937 AddTargetFeature(Args, CmdArgs,
938 options::OPT_mips16, options::OPT_mno_mips16,
939 "mips16");
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +0000940 AddTargetFeature(Args, CmdArgs,
941 options::OPT_mdsp, options::OPT_mno_dsp,
942 "dsp");
943 AddTargetFeature(Args, CmdArgs,
944 options::OPT_mdspr2, options::OPT_mno_dspr2,
945 "dspr2");
Simon Atanasyanec4b1c12012-08-27 20:55:56 +0000946
947 if (Arg *A = Args.getLastArg(options::OPT_G)) {
948 StringRef v = A->getValue(Args);
949 CmdArgs.push_back("-mllvm");
950 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
951 A->claim();
952 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000953}
954
Hal Finkel8eb59282012-06-11 22:35:19 +0000955/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
956static std::string getPPCTargetCPU(const ArgList &Args) {
957 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
958 StringRef CPUName = A->getValue(Args);
959
960 if (CPUName == "native") {
961 std::string CPU = llvm::sys::getHostCPUName();
962 if (!CPU.empty() && CPU != "generic")
963 return CPU;
964 else
965 return "";
966 }
967
968 return llvm::StringSwitch<const char *>(CPUName)
969 .Case("common", "generic")
970 .Case("440", "440")
971 .Case("440fp", "440")
972 .Case("450", "450")
973 .Case("601", "601")
974 .Case("602", "602")
975 .Case("603", "603")
976 .Case("603e", "603e")
977 .Case("603ev", "603ev")
978 .Case("604", "604")
979 .Case("604e", "604e")
980 .Case("620", "620")
981 .Case("G3", "g3")
982 .Case("7400", "7400")
983 .Case("G4", "g4")
984 .Case("7450", "7450")
985 .Case("G4+", "g4+")
986 .Case("750", "750")
987 .Case("970", "970")
988 .Case("G5", "g5")
989 .Case("a2", "a2")
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000990 .Case("e500mc", "e500mc")
991 .Case("e5500", "e5500")
Hal Finkel8eb59282012-06-11 22:35:19 +0000992 .Case("power6", "pwr6")
993 .Case("power7", "pwr7")
994 .Case("powerpc", "ppc")
995 .Case("powerpc64", "ppc64")
996 .Default("");
997 }
998
999 return "";
1000}
1001
1002void Clang::AddPPCTargetArgs(const ArgList &Args,
1003 ArgStringList &CmdArgs) const {
1004 std::string TargetCPUName = getPPCTargetCPU(Args);
1005
1006 // LLVM may default to generating code for the native CPU,
1007 // but, like gcc, we default to a more generic option for
1008 // each architecture. (except on Darwin)
1009 llvm::Triple Triple = getToolChain().getTriple();
1010 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1011 if (Triple.getArch() == llvm::Triple::ppc64)
1012 TargetCPUName = "ppc64";
1013 else
1014 TargetCPUName = "ppc";
1015 }
1016
1017 if (!TargetCPUName.empty()) {
1018 CmdArgs.push_back("-target-cpu");
1019 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1020 }
1021}
1022
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001023void Clang::AddSparcTargetArgs(const ArgList &Args,
1024 ArgStringList &CmdArgs) const {
1025 const Driver &D = getToolChain().getDriver();
1026
1027 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001028 CmdArgs.push_back("-target-cpu");
Benjamin Kramereed4f2a2011-12-26 14:18:37 +00001029 CmdArgs.push_back(A->getValue(Args));
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001030 }
1031
1032 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001033 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001034 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1035 options::OPT_mhard_float)) {
1036 if (A->getOption().matches(options::OPT_msoft_float))
1037 FloatABI = "soft";
1038 else if (A->getOption().matches(options::OPT_mhard_float))
1039 FloatABI = "hard";
1040 }
1041
1042 // If unspecified, choose the default based on the platform.
1043 if (FloatABI.empty()) {
1044 switch (getToolChain().getTriple().getOS()) {
1045 default:
1046 // Assume "soft", but warn the user we are guessing.
1047 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001048 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001049 break;
1050 }
1051 }
1052
1053 if (FloatABI == "soft") {
1054 // Floating point operations and argument passing are soft.
1055 //
1056 // FIXME: This changes CPP defines, we need -target-soft-float.
1057 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001058 CmdArgs.push_back("-target-feature");
1059 CmdArgs.push_back("+soft-float");
1060 } else {
1061 assert(FloatABI == "hard" && "Invalid float abi!");
1062 CmdArgs.push_back("-mhard-float");
1063 }
1064}
1065
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001066void Clang::AddX86TargetArgs(const ArgList &Args,
1067 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001068 if (!Args.hasFlag(options::OPT_mred_zone,
1069 options::OPT_mno_red_zone,
1070 true) ||
1071 Args.hasArg(options::OPT_mkernel) ||
1072 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001073 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001074
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001075 if (Args.hasFlag(options::OPT_msoft_float,
1076 options::OPT_mno_soft_float,
1077 false))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001078 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001079
Daniel Dunbare13ada62009-11-14 22:04:54 +00001080 const char *CPUName = 0;
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001081 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001082 if (StringRef(A->getValue(Args)) == "native") {
Daniel Dunbare13ada62009-11-14 22:04:54 +00001083 // FIXME: Reject attempts to use -march=native unless the target matches
1084 // the host.
1085 //
1086 // FIXME: We should also incorporate the detected target features for use
1087 // with -native.
1088 std::string CPU = llvm::sys::getHostCPUName();
Bob Wilsone78227b2012-05-09 17:53:10 +00001089 if (!CPU.empty() && CPU != "generic")
Daniel Dunbare13ada62009-11-14 22:04:54 +00001090 CPUName = Args.MakeArgString(CPU);
1091 } else
1092 CPUName = A->getValue(Args);
1093 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001094
Daniel Dunbare13ada62009-11-14 22:04:54 +00001095 // Select the default CPU if none was given (or detection failed).
1096 if (!CPUName) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001097 // FIXME: Need target hooks.
Bob Wilson6524dd32011-10-14 05:03:44 +00001098 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001099 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001100 CPUName = "core2";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001101 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001102 CPUName = "yonah";
Chris Lattnerb986aba2010-04-11 19:29:39 +00001103 } else if (getToolChain().getOS().startswith("haiku")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001104 if (getToolChain().getArch() == llvm::Triple::x86_64)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001105 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001106 else if (getToolChain().getArch() == llvm::Triple::x86)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001107 CPUName = "i586";
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001108 } else if (getToolChain().getOS().startswith("openbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001109 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001110 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001111 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001112 CPUName = "i486";
Eli Friedman9fa28852012-08-08 23:57:20 +00001113 } else if (getToolChain().getOS().startswith("bitrig")) {
1114 if (getToolChain().getArch() == llvm::Triple::x86_64)
1115 CPUName = "x86-64";
1116 else if (getToolChain().getArch() == llvm::Triple::x86)
1117 CPUName = "i686";
Roman Divacky432f10d2011-03-01 18:11:37 +00001118 } else if (getToolChain().getOS().startswith("freebsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001119 if (getToolChain().getArch() == llvm::Triple::x86_64)
Roman Divacky432f10d2011-03-01 18:11:37 +00001120 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001121 else if (getToolChain().getArch() == llvm::Triple::x86)
Roman Divacky432f10d2011-03-01 18:11:37 +00001122 CPUName = "i486";
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001123 } else if (getToolChain().getOS().startswith("netbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001124 if (getToolChain().getArch() == llvm::Triple::x86_64)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001125 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001126 else if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001127 CPUName = "i486";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001128 } else {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001129 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001130 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001131 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001132 CPUName = "pentium4";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001133 }
1134 }
1135
Daniel Dunbare13ada62009-11-14 22:04:54 +00001136 if (CPUName) {
Daniel Dunbara7d02312009-12-18 06:30:12 +00001137 CmdArgs.push_back("-target-cpu");
Daniel Dunbare13ada62009-11-14 22:04:54 +00001138 CmdArgs.push_back(CPUName);
1139 }
1140
Eli Friedmanad811f02011-07-02 00:34:19 +00001141 // The required algorithm here is slightly strange: the options are applied
1142 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1143 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1144 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1145 // former correctly, but not the latter; handle directly-overridden
1146 // attributes here.
1147 llvm::StringMap<unsigned> PrevFeature;
1148 std::vector<const char*> Features;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001149 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1150 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001151 StringRef Name = (*it)->getOption().getName();
Daniel Dunbara442fd52010-06-11 22:00:13 +00001152 (*it)->claim();
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001153
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001154 // Skip over "-m".
1155 assert(Name.startswith("-m") && "Invalid feature name.");
1156 Name = Name.substr(2);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001157
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001158 bool IsNegative = Name.startswith("no-");
1159 if (IsNegative)
1160 Name = Name.substr(3);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001161
Eli Friedmanad811f02011-07-02 00:34:19 +00001162 unsigned& Prev = PrevFeature[Name];
1163 if (Prev)
1164 Features[Prev - 1] = 0;
1165 Prev = Features.size() + 1;
1166 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1167 }
1168 for (unsigned i = 0; i < Features.size(); i++) {
1169 if (Features[i]) {
1170 CmdArgs.push_back("-target-feature");
1171 CmdArgs.push_back(Features[i]);
1172 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001173 }
1174}
1175
Tony Linthicum76329bf2011-12-12 21:14:55 +00001176static Arg* getLastHexagonArchArg (const ArgList &Args)
1177{
1178 Arg * A = NULL;
1179
Sebastian Pop86500282012-01-13 20:37:10 +00001180 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
1181 it != ie; ++it) {
1182 if ((*it)->getOption().matches(options::OPT_march_EQ) ||
Tony Linthicum76329bf2011-12-12 21:14:55 +00001183 (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
1184 A = *it;
1185 A->claim();
1186 }
Sebastian Pop86500282012-01-13 20:37:10 +00001187 else if ((*it)->getOption().matches(options::OPT_m_Joined)){
1188 StringRef Value = (*it)->getValue(Args,0);
1189 if (Value.startswith("v")) {
1190 A = *it;
1191 A->claim();
1192 }
1193 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001194 }
1195 return A;
1196}
1197
Sebastian Pop86500282012-01-13 20:37:10 +00001198static StringRef getHexagonTargetCPU(const ArgList &Args)
Tony Linthicum76329bf2011-12-12 21:14:55 +00001199{
1200 Arg *A;
1201 llvm::StringRef WhichHexagon;
1202
Sebastian Pop86500282012-01-13 20:37:10 +00001203 // Select the default CPU (v4) if none was given or detection failed.
Tony Linthicum76329bf2011-12-12 21:14:55 +00001204 if ((A = getLastHexagonArchArg (Args))) {
Sebastian Pop86500282012-01-13 20:37:10 +00001205 WhichHexagon = A->getValue(Args);
1206 if (WhichHexagon == "")
1207 return "v4";
1208 else
1209 return WhichHexagon;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001210 }
Sebastian Pop86500282012-01-13 20:37:10 +00001211 else
1212 return "v4";
Tony Linthicum76329bf2011-12-12 21:14:55 +00001213}
1214
1215void Clang::AddHexagonTargetArgs(const ArgList &Args,
1216 ArgStringList &CmdArgs) const {
1217 llvm::Triple Triple = getToolChain().getTriple();
1218
1219 CmdArgs.push_back("-target-cpu");
Sebastian Pop86500282012-01-13 20:37:10 +00001220 CmdArgs.push_back(Args.MakeArgString("hexagon" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001221 CmdArgs.push_back("-fno-signed-char");
1222 CmdArgs.push_back("-nobuiltininc");
1223
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001224 if (Args.hasArg(options::OPT_mqdsp6_compat))
Tony Linthicum76329bf2011-12-12 21:14:55 +00001225 CmdArgs.push_back("-mqdsp6-compat");
1226
1227 if (Arg *A = Args.getLastArg(options::OPT_G,
1228 options::OPT_msmall_data_threshold_EQ)) {
1229 std::string SmallDataThreshold="-small-data-threshold=";
1230 SmallDataThreshold += A->getValue(Args);
1231 CmdArgs.push_back ("-mllvm");
1232 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
1233 A->claim();
1234 }
1235
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001236 if (!Args.hasArg(options::OPT_fno_short_enums))
1237 CmdArgs.push_back("-fshort-enums");
1238 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1239 CmdArgs.push_back ("-mllvm");
1240 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1241 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001242 CmdArgs.push_back ("-mllvm");
1243 CmdArgs.push_back ("-machine-sink-split=0");
1244}
1245
Eric Christopher84fbdb42011-08-19 00:30:14 +00001246static bool
John McCall5fb5df92012-06-20 06:18:46 +00001247shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001248 const llvm::Triple &Triple) {
1249 // We use the zero-cost exception tables for Objective-C if the non-fragile
1250 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1251 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001252 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001253 return true;
1254
Bob Wilson6524dd32011-10-14 05:03:44 +00001255 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001256 return false;
1257
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001258 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001259 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001260 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001261}
1262
Anders Carlssone96ab552011-02-28 02:27:16 +00001263/// addExceptionArgs - Adds exception related arguments to the driver command
1264/// arguments. There's a master flag, -fexceptions and also language specific
1265/// flags to enable/disable C++ and Objective-C exceptions.
1266/// This makes it possible to for example disable C++ exceptions but enable
1267/// Objective-C exceptions.
1268static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1269 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001270 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001271 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001272 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001273 if (KernelOrKext) {
1274 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1275 // arguments now to avoid warnings about unused arguments.
1276 Args.ClaimAllArgs(options::OPT_fexceptions);
1277 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1278 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1279 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1280 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1281 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001282 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001283 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001284
1285 // Exceptions are enabled by default.
1286 bool ExceptionsEnabled = true;
1287
1288 // This keeps track of whether exceptions were explicitly turned on or off.
1289 bool DidHaveExplicitExceptionFlag = false;
1290
Rafael Espindola00a66572009-10-01 13:33:33 +00001291 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1292 options::OPT_fno_exceptions)) {
1293 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001294 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001295 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001296 ExceptionsEnabled = false;
1297
1298 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001299 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001300
Anders Carlssone96ab552011-02-28 02:27:16 +00001301 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001302
Anders Carlssone96ab552011-02-28 02:27:16 +00001303 // Exception tables and cleanups can be enabled with -fexceptions even if the
1304 // language itself doesn't support exceptions.
1305 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1306 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001307
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001308 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1309 // is not necessarily sensible, but follows GCC.
1310 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001311 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001312 options::OPT_fno_objc_exceptions,
1313 true)) {
1314 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001315
Eric Christopher84fbdb42011-08-19 00:30:14 +00001316 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001317 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001318 }
1319
1320 if (types::isCXX(InputType)) {
1321 bool CXXExceptionsEnabled = ExceptionsEnabled;
1322
Eric Christopher84fbdb42011-08-19 00:30:14 +00001323 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1324 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001325 options::OPT_fexceptions,
1326 options::OPT_fno_exceptions)) {
1327 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1328 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001329 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001330 CXXExceptionsEnabled = false;
1331 }
1332
1333 if (CXXExceptionsEnabled) {
1334 CmdArgs.push_back("-fcxx-exceptions");
1335
1336 ShouldUseExceptionTables = true;
1337 }
1338 }
1339
1340 if (ShouldUseExceptionTables)
1341 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001342}
1343
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001344static bool ShouldDisableCFI(const ArgList &Args,
1345 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001346 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001347 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001348 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001349 // we disable them if we think the .s file will be passed to it.
Rafael Espindolac41db922012-03-08 14:39:55 +00001350 Default = Args.hasFlag(options::OPT_integrated_as,
1351 options::OPT_no_integrated_as,
1352 TC.IsIntegratedAssemblerDefault());
Rafael Espindolaf934f982011-05-17 16:26:17 +00001353 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001354 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
1355 options::OPT_fno_dwarf2_cfi_asm,
1356 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001357}
1358
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001359static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1360 const ToolChain &TC) {
1361 bool IsIADefault = TC.IsIntegratedAssemblerDefault();
1362 bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
1363 options::OPT_no_integrated_as,
1364 IsIADefault);
1365 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1366 options::OPT_fno_dwarf_directory_asm,
1367 UseIntegratedAs);
1368 return !UseDwarfDirectory;
1369}
1370
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001371/// \brief Check whether the given input tree contains any compilation actions.
1372static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001373 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001374 return true;
1375
1376 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1377 if (ContainsCompileAction(*it))
1378 return true;
1379
1380 return false;
1381}
1382
1383/// \brief Check if -relax-all should be passed to the internal assembler.
1384/// This is done by default when compiling non-assembler source with -O0.
1385static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1386 bool RelaxDefault = true;
1387
1388 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1389 RelaxDefault = A->getOption().matches(options::OPT_O0);
1390
1391 if (RelaxDefault) {
1392 RelaxDefault = false;
1393 for (ActionList::const_iterator it = C.getActions().begin(),
1394 ie = C.getActions().end(); it != ie; ++it) {
1395 if (ContainsCompileAction(*it)) {
1396 RelaxDefault = true;
1397 break;
1398 }
1399 }
1400 }
1401
1402 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1403 RelaxDefault);
1404}
1405
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001406/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1407/// This needs to be called before we add the C run-time (malloc, etc).
1408static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001409 ArgStringList &CmdArgs) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001410 if (!Args.hasFlag(options::OPT_faddress_sanitizer,
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001411 options::OPT_fno_address_sanitizer, false))
1412 return;
Logan Chienc6fd8202012-09-02 09:30:11 +00001413 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001414 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanovea155f02012-06-04 11:15:05 +00001415 if (!Args.hasArg(options::OPT_pie))
1416 TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001417 }
Daniel Dunbar3ca41d42011-12-07 23:22:17 +00001418
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001419 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1420 llvm::sys::path::append(LibAsan, "lib", "linux",
1421 (Twine("libclang_rt.asan-") +
1422 TC.getArchName() + "-android.so"));
1423 CmdArgs.push_back(Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001424 } else {
1425 if (!Args.hasArg(options::OPT_shared)) {
1426 // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
1427 // resource directory.
1428 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1429 llvm::sys::path::append(LibAsan, "lib", "linux",
1430 (Twine("libclang_rt.asan-") +
1431 TC.getArchName() + ".a"));
1432 CmdArgs.push_back(Args.MakeArgString(LibAsan));
1433 CmdArgs.push_back("-lpthread");
1434 CmdArgs.push_back("-ldl");
1435 CmdArgs.push_back("-export-dynamic");
1436 }
1437 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001438}
1439
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001440/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1441/// This needs to be called before we add the C run-time (malloc, etc).
1442static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1443 ArgStringList &CmdArgs) {
1444 if (!Args.hasFlag(options::OPT_fthread_sanitizer,
1445 options::OPT_fno_thread_sanitizer, false))
1446 return;
1447 if (!Args.hasArg(options::OPT_shared)) {
1448 // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library
1449 // resource directory.
1450 SmallString<128> LibTsan(TC.getDriver().ResourceDir);
1451 llvm::sys::path::append(LibTsan, "lib", "linux",
1452 (Twine("libclang_rt.tsan-") +
1453 TC.getArchName() + ".a"));
1454 CmdArgs.push_back(Args.MakeArgString(LibTsan));
1455 CmdArgs.push_back("-lpthread");
1456 CmdArgs.push_back("-ldl");
1457 CmdArgs.push_back("-export-dynamic");
1458 }
1459}
1460
Rafael Espindola224dd632011-12-14 21:02:23 +00001461static bool shouldUseFramePointer(const ArgList &Args,
1462 const llvm::Triple &Triple) {
1463 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1464 options::OPT_fomit_frame_pointer))
1465 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1466
Rafael Espindola00b29182011-12-14 21:50:24 +00001467 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001468 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1469 Triple.getArch() == llvm::Triple::x86) &&
1470 Triple.getOS() == llvm::Triple::Linux) {
1471 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1472 if (!A->getOption().matches(options::OPT_O0))
1473 return false;
1474 }
1475
1476 return true;
1477}
1478
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001479void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001480 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001481 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001482 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001483 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001484 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1485 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001486 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001487 ArgStringList CmdArgs;
1488
Daniel Dunbare521a892009-03-31 20:53:55 +00001489 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1490
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001491 // Invoke ourselves in -cc1 mode.
1492 //
1493 // FIXME: Implement custom jobs for internal actions.
1494 CmdArgs.push_back("-cc1");
1495
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001496 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001497 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001498 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001499 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001500
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001501 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001502 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001503
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001504 if (isa<AnalyzeJobAction>(JA)) {
1505 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1506 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001507 } else if (isa<MigrateJobAction>(JA)) {
1508 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001509 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001510 if (Output.getType() == types::TY_Dependencies)
1511 CmdArgs.push_back("-Eonly");
1512 else
1513 CmdArgs.push_back("-E");
Daniel Dunbarc4343942010-02-03 03:07:56 +00001514 } else if (isa<AssembleJobAction>(JA)) {
1515 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001516
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001517 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001518 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001519
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001520 // When using an integrated assembler, translate -Wa, and -Xassembler
1521 // options.
1522 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1523 options::OPT_Xassembler),
1524 ie = Args.filtered_end(); it != ie; ++it) {
1525 const Arg *A = *it;
1526 A->claim();
1527
1528 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001529 StringRef Value = A->getValue(Args, i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001530
1531 if (Value == "-force_cpusubtype_ALL") {
1532 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001533 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001534 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001535 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001536 CmdArgs.push_back("-mllvm");
1537 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001538 } else if (Value == "--noexecstack") {
1539 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001540 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001541 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001542 << A->getOption().getName() << Value;
1543 }
1544 }
1545 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001546
1547 // Also ignore explicit -force_cpusubtype_ALL option.
1548 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001549 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001550 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001551 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001552
Aaron Ballman1f10cc52012-07-31 01:21:00 +00001553 if (JA.getType() == types::TY_Nothing)
1554 CmdArgs.push_back("-fsyntax-only");
1555 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001556 CmdArgs.push_back("-emit-pch");
1557 else
1558 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001559 } else {
1560 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001561
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001562 if (JA.getType() == types::TY_Nothing) {
1563 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001564 } else if (JA.getType() == types::TY_LLVM_IR ||
1565 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001566 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001567 } else if (JA.getType() == types::TY_LLVM_BC ||
1568 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001569 CmdArgs.push_back("-emit-llvm-bc");
1570 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00001571 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00001572 } else if (JA.getType() == types::TY_AST) {
1573 CmdArgs.push_back("-emit-pch");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001574 } else if (JA.getType() == types::TY_RewrittenObjC) {
1575 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001576 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00001577 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1578 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001579 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001580 } else {
1581 assert(JA.getType() == types::TY_PP_Asm &&
1582 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001583 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00001584 }
1585
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001586 // The make clang go fast button.
1587 CmdArgs.push_back("-disable-free");
1588
John McCallbb79b5f2010-02-13 03:50:24 +00001589 // Disable the verification pass in -asserts builds.
1590#ifdef NDEBUG
1591 CmdArgs.push_back("-disable-llvm-verifier");
1592#endif
1593
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001594 // Set the main file name, so that debug info works even with
1595 // -save-temps.
1596 CmdArgs.push_back("-main-file-name");
1597 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1598
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001599 // Some flags which affect the language (via preprocessor
1600 // defines). See darwin::CC1::AddCPPArgs.
1601 if (Args.hasArg(options::OPT_static))
1602 CmdArgs.push_back("-static-define");
1603
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001604 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00001605 // Enable region store model by default.
1606 CmdArgs.push_back("-analyzer-store=region");
1607
Ted Kremenek7bea9a12009-12-07 22:26:14 +00001608 // Treat blocks as analysis entry points.
1609 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1610
Ted Kremenek49c79792011-03-24 00:28:47 +00001611 CmdArgs.push_back("-analyzer-eagerly-assume");
1612
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001613 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001614 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001615 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00001616
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001617 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1618 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00001619
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001620 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00001621 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00001622
1623 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00001624
1625 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00001626 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1627 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1628 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1629 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1630 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1631 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001632 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001633
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001634 // Set the output format. The default is plist, for (lame) historical
1635 // reasons.
1636 CmdArgs.push_back("-analyzer-output");
1637 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
1638 CmdArgs.push_back(A->getValue(Args));
1639 else
1640 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001641
Ted Kremenekfe449a22010-03-22 22:32:05 +00001642 // Disable the presentation of standard compiler warnings when
1643 // using --analyze. We only want to show static analyzer diagnostics
1644 // or frontend errors.
1645 CmdArgs.push_back("-w");
1646
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001647 // Add -Xanalyzer arguments when running as analyzer.
1648 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00001649 }
1650
Daniel Dunbar4eadb602009-09-10 01:21:12 +00001651 CheckCodeGenerationOptions(D, Args);
1652
Daniel Dunbar44e71222009-04-29 18:32:25 +00001653 // Perform argument translation for LLVM backend. This
1654 // takes some care in reconciling with llvm-gcc. The
1655 // issue is that llvm-gcc translates these options based on
1656 // the values in cc1, whereas we are processing based on
1657 // the driver arguments.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001658
Daniel Dunbar44e71222009-04-29 18:32:25 +00001659 // This comes from the default translation the driver + cc1
1660 // would do to enable flag_pic.
Simon Atanasyana16b7fd2012-05-29 18:50:33 +00001661
1662 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1663 options::OPT_fpic, options::OPT_fno_pic,
1664 options::OPT_fPIE, options::OPT_fno_PIE,
1665 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruthc0c04552012-04-08 16:40:35 +00001666 bool PICDisabled = false;
1667 bool PICEnabled = false;
1668 bool PICForPIE = false;
1669 if (LastPICArg) {
1670 PICForPIE = (LastPICArg->getOption().matches(options::OPT_fPIE) ||
1671 LastPICArg->getOption().matches(options::OPT_fpie));
1672 PICEnabled = (PICForPIE ||
1673 LastPICArg->getOption().matches(options::OPT_fPIC) ||
1674 LastPICArg->getOption().matches(options::OPT_fpic));
1675 PICDisabled = !PICEnabled;
1676 }
1677 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1678 // PIC or PIE options above, if these show up, PIC is disabled.
1679 if (Args.hasArg(options::OPT_mkernel))
1680 PICDisabled = true;
1681 if (Args.hasArg(options::OPT_static))
1682 PICDisabled = true;
1683 bool DynamicNoPIC = Args.hasArg(options::OPT_mdynamic_no_pic);
1684
1685 // Select the relocation model.
Daniel Dunbar44e71222009-04-29 18:32:25 +00001686 const char *Model = getToolChain().GetForcedPicModel();
1687 if (!Model) {
Chandler Carruthc0c04552012-04-08 16:40:35 +00001688 if (DynamicNoPIC)
Daniel Dunbar44e71222009-04-29 18:32:25 +00001689 Model = "dynamic-no-pic";
1690 else if (PICDisabled)
1691 Model = "static";
1692 else if (PICEnabled)
1693 Model = "pic";
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001694 else
Daniel Dunbar44e71222009-04-29 18:32:25 +00001695 Model = getToolChain().GetDefaultRelocationModel();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001696 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001697 StringRef ModelStr = Model ? Model : "";
1698 if (Model && ModelStr != "pic") {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001699 CmdArgs.push_back("-mrelocation-model");
1700 CmdArgs.push_back(Model);
1701 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001702
Chandler Carruthc0c04552012-04-08 16:40:35 +00001703 // Infer the __PIC__ and __PIE__ values.
1704 if (ModelStr == "pic" && PICForPIE) {
1705 CmdArgs.push_back("-pie-level");
1706 CmdArgs.push_back((LastPICArg &&
1707 LastPICArg->getOption().matches(options::OPT_fPIE)) ?
1708 "2" : "1");
1709 } else if (ModelStr == "pic" || ModelStr == "dynamic-no-pic") {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00001710 CmdArgs.push_back("-pic-level");
Chandler Carruthc0c04552012-04-08 16:40:35 +00001711 CmdArgs.push_back(((ModelStr != "dynamic-no-pic" && LastPICArg &&
1712 LastPICArg->getOption().matches(options::OPT_fPIC)) ||
1713 getToolChain().getTriple().isOSDarwin()) ? "2" : "1");
Daniel Dunbar44e71222009-04-29 18:32:25 +00001714 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001715
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00001716 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1717 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00001718 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00001719
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001720 // LLVM Code Generator Options.
1721
Daniel Dunbar0bb03312011-02-09 17:54:19 +00001722 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
1723 CmdArgs.push_back("-mregparm");
1724 CmdArgs.push_back(A->getValue(Args));
1725 }
1726
Roman Divacky65b88cd2011-03-01 17:40:53 +00001727 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1728 CmdArgs.push_back("-mrtd");
1729
Rafael Espindola224dd632011-12-14 21:02:23 +00001730 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001731 CmdArgs.push_back("-mdisable-fp-elim");
1732 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1733 options::OPT_fno_zero_initialized_in_bss))
1734 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00001735 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1736 options::OPT_fno_strict_aliasing,
1737 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00001738 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00001739 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
1740 false))
1741 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00001742 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
1743 options::OPT_fno_optimize_sibling_calls))
1744 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001745
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001746 // Handle various floating point optimization flags, mapping them to the
1747 // appropriate LLVM code generation flags. The pattern for all of these is to
1748 // default off the codegen optimizations, and if any flag enables them and no
1749 // flag disables them after the flag enabling them, enable the codegen
1750 // optimization. This is complicated by several "umbrella" flags.
1751 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001752 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001753 options::OPT_ffinite_math_only,
1754 options::OPT_fno_finite_math_only,
1755 options::OPT_fhonor_infinities,
1756 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001757 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1758 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001759 A->getOption().getID() != options::OPT_fhonor_infinities)
1760 CmdArgs.push_back("-menable-no-infs");
1761 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001762 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001763 options::OPT_ffinite_math_only,
1764 options::OPT_fno_finite_math_only,
1765 options::OPT_fhonor_nans,
1766 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001767 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1768 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001769 A->getOption().getID() != options::OPT_fhonor_nans)
1770 CmdArgs.push_back("-menable-no-nans");
1771
Benjamin Kramerc242ef22012-05-02 14:55:48 +00001772 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
1773 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001774 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001775 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001776 options::OPT_fmath_errno,
Chandler Carruth3634c662012-04-26 02:10:51 +00001777 options::OPT_fno_math_errno))
1778 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
1779 if (MathErrno)
1780 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001781
1782 // There are several flags which require disabling very specific
1783 // optimizations. Any of these being disabled forces us to turn off the
1784 // entire set of LLVM optimizations, so collect them through all the flag
1785 // madness.
1786 bool AssociativeMath = false;
1787 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001788 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001789 options::OPT_funsafe_math_optimizations,
1790 options::OPT_fno_unsafe_math_optimizations,
1791 options::OPT_fassociative_math,
1792 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001793 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1794 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001795 A->getOption().getID() != options::OPT_fno_associative_math)
1796 AssociativeMath = true;
1797 bool ReciprocalMath = false;
1798 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001799 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001800 options::OPT_funsafe_math_optimizations,
1801 options::OPT_fno_unsafe_math_optimizations,
1802 options::OPT_freciprocal_math,
1803 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001804 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1805 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001806 A->getOption().getID() != options::OPT_fno_reciprocal_math)
1807 ReciprocalMath = true;
1808 bool SignedZeros = true;
1809 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001810 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001811 options::OPT_funsafe_math_optimizations,
1812 options::OPT_fno_unsafe_math_optimizations,
1813 options::OPT_fsigned_zeros,
1814 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001815 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1816 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001817 A->getOption().getID() != options::OPT_fsigned_zeros)
1818 SignedZeros = false;
1819 bool TrappingMath = true;
1820 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001821 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001822 options::OPT_funsafe_math_optimizations,
1823 options::OPT_fno_unsafe_math_optimizations,
1824 options::OPT_ftrapping_math,
1825 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001826 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1827 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001828 A->getOption().getID() != options::OPT_ftrapping_math)
1829 TrappingMath = false;
1830 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
1831 !TrappingMath)
1832 CmdArgs.push_back("-menable-unsafe-fp-math");
1833
Lang Hamesaa53b932012-07-06 00:59:19 +00001834
1835 // Validate and pass through -fp-contract option.
1836 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001837 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00001838 options::OPT_ffp_contract)) {
1839 if (A->getOption().getID() == options::OPT_ffp_contract) {
1840 StringRef Val = A->getValue(Args);
1841 if (Val == "fast" || Val == "on" || Val == "off") {
1842 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
1843 } else {
1844 D.Diag(diag::err_drv_unsupported_option_argument)
1845 << A->getOption().getName() << Val;
1846 }
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001847 } else if (A->getOption().getID() == options::OPT_ffast_math) {
Lang Hamesaa53b932012-07-06 00:59:19 +00001848 // If fast-math is set then set the fp-contract mode to fast.
1849 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
1850 }
1851 }
1852
Bob Wilson6a039162012-07-19 03:52:53 +00001853 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
1854 // and if we find them, tell the frontend to provide the appropriate
1855 // preprocessor macros. This is distinct from enabling any optimizations as
1856 // these options induce language changes which must survive serialization
1857 // and deserialization, etc.
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001858 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, options::OPT_fno_fast_math))
1859 if (A->getOption().matches(options::OPT_ffast_math))
1860 CmdArgs.push_back("-ffast-math");
1861 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
1862 if (A->getOption().matches(options::OPT_ffinite_math_only))
1863 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001864
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001865 // Decide whether to use verbose asm. Verbose assembly is the default on
1866 // toolchains which have the integrated assembler on by default.
1867 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
1868 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001869 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001870 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001871 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001872
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001873 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
1874 CmdArgs.push_back("-mdebug-pass");
1875 CmdArgs.push_back("Structure");
1876 }
1877 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
1878 CmdArgs.push_back("-mdebug-pass");
1879 CmdArgs.push_back("Arguments");
1880 }
1881
John McCall8517abc2010-02-19 02:45:38 +00001882 // Enable -mconstructor-aliases except on darwin, where we have to
1883 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00001884 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00001885 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00001886
John McCall7ef5cb32011-03-18 02:56:14 +00001887 // Darwin's kernel doesn't support guard variables; just die if we
1888 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00001889 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00001890 CmdArgs.push_back("-fforbid-guard-variables");
1891
Douglas Gregordbe39272011-02-01 15:15:22 +00001892 if (Args.hasArg(options::OPT_mms_bitfields)) {
1893 CmdArgs.push_back("-mms-bitfields");
1894 }
John McCall8517abc2010-02-19 02:45:38 +00001895
Daniel Dunbar306945d2009-09-16 06:17:29 +00001896 // This is a coarse approximation of what llvm-gcc actually does, both
1897 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
1898 // complicated ways.
1899 bool AsynchronousUnwindTables =
1900 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
1901 options::OPT_fno_asynchronous_unwind_tables,
1902 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001903 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00001904 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
1905 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001906 CmdArgs.push_back("-munwind-tables");
1907
Rafael Espindola66aa0452012-06-19 01:26:10 +00001908 getToolChain().addClangTargetOptions(CmdArgs);
1909
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001910 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
1911 CmdArgs.push_back("-mlimit-float-precision");
1912 CmdArgs.push_back(A->getValue(Args));
1913 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001914
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001915 // FIXME: Handle -mtune=.
1916 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00001917
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001918 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001919 CmdArgs.push_back("-mcode-model");
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001920 CmdArgs.push_back(A->getValue(Args));
1921 }
1922
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001923 // Add target specific cpu and features flags.
1924 switch(getToolChain().getTriple().getArch()) {
1925 default:
1926 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001927
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001928 case llvm::Triple::arm:
1929 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00001930 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001931 break;
1932
Eric Christopher0b26a612010-03-02 02:41:08 +00001933 case llvm::Triple::mips:
1934 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00001935 case llvm::Triple::mips64:
1936 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00001937 AddMIPSTargetArgs(Args, CmdArgs);
1938 break;
1939
Hal Finkel8eb59282012-06-11 22:35:19 +00001940 case llvm::Triple::ppc:
1941 case llvm::Triple::ppc64:
1942 AddPPCTargetArgs(Args, CmdArgs);
1943 break;
1944
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001945 case llvm::Triple::sparc:
1946 AddSparcTargetArgs(Args, CmdArgs);
1947 break;
1948
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001949 case llvm::Triple::x86:
1950 case llvm::Triple::x86_64:
1951 AddX86TargetArgs(Args, CmdArgs);
1952 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001953
1954 case llvm::Triple::hexagon:
1955 AddHexagonTargetArgs(Args, CmdArgs);
1956 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00001957 }
1958
Tony Linthicum76329bf2011-12-12 21:14:55 +00001959
1960
Daniel Dunbar976a2f52010-08-11 23:07:47 +00001961 // Pass the linker version in use.
1962 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1963 CmdArgs.push_back("-target-linker-version");
1964 CmdArgs.push_back(A->getValue(Args));
1965 }
1966
Nick Lewycky75033772011-02-02 06:43:03 +00001967 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00001968 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewycky75033772011-02-02 06:43:03 +00001969 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson6524dd32011-10-14 05:03:44 +00001970 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00001971 CmdArgs.push_back("-momit-leaf-frame-pointer");
1972
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00001973 // Explicitly error on some things we know we don't support and can't just
1974 // ignore.
1975 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001976 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
1977 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001978 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00001979 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001980 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00001981 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
1982 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001983 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001984 << Unsupported->getOption().getName();
1985 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00001986 }
1987
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001988 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00001989 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00001990 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00001991 CmdArgs.push_back("-header-include-file");
1992 CmdArgs.push_back(D.CCPrintHeadersFilename ?
1993 D.CCPrintHeadersFilename : "-");
1994 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001995 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00001996 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001997
Chad Rosierbe10f982011-08-02 17:58:04 +00001998 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00001999 CmdArgs.push_back("-diagnostic-log-file");
2000 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2001 D.CCLogDiagnosticsFilename : "-");
2002 }
2003
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002004 // Use the last option from "-g" group. "-gline-tables-only" is
2005 // preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002006 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002007 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
2008 if (A->getOption().matches(options::OPT_gline_tables_only)) {
2009 CmdArgs.push_back("-gline-tables-only");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002010 } else if (!A->getOption().matches(options::OPT_g0) &&
2011 !A->getOption().matches(options::OPT_ggdb0)) {
Chad Rosier8fe3b112011-11-07 19:52:29 +00002012 CmdArgs.push_back("-g");
Chad Rosierc2bf3382011-11-04 19:28:44 +00002013 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002014 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002015
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002016 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2017 Args.ClaimAllArgs(options::OPT_g_flags_Group);
2018
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002019 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2020 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2021
Chris Lattner3c77a352010-06-22 00:03:40 +00002022 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2023
Nick Lewycky207bce32011-04-21 23:44:07 +00002024 if (Args.hasArg(options::OPT_ftest_coverage) ||
2025 Args.hasArg(options::OPT_coverage))
2026 CmdArgs.push_back("-femit-coverage-notes");
2027 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2028 Args.hasArg(options::OPT_coverage))
2029 CmdArgs.push_back("-femit-coverage-data");
2030
Nick Lewycky480cb992011-05-04 20:46:58 +00002031 if (C.getArgs().hasArg(options::OPT_c) ||
2032 C.getArgs().hasArg(options::OPT_S)) {
2033 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002034 CmdArgs.push_back("-coverage-file");
Bill Wendling8c0b4bc2012-08-30 00:43:41 +00002035 SmallString<128> absFilename(Output.getFilename());
2036 llvm::sys::fs::make_absolute(absFilename);
2037 CmdArgs.push_back(Args.MakeArgString(absFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002038 }
2039 }
2040
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002041 // Pass options for controlling the default header search paths.
2042 if (Args.hasArg(options::OPT_nostdinc)) {
2043 CmdArgs.push_back("-nostdsysteminc");
2044 CmdArgs.push_back("-nobuiltininc");
2045 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002046 if (Args.hasArg(options::OPT_nostdlibinc))
2047 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002048 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2049 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2050 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002051
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002052 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002053 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002054 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002055
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002056 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2057
Ted Kremenekf7639e12012-03-06 20:06:33 +00002058 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002059 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002060 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002061 options::OPT_ccc_arcmt_modify,
2062 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002063 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002064 switch (A->getOption().getID()) {
2065 default:
2066 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002067 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002068 CmdArgs.push_back("-arcmt-check");
2069 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002070 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002071 CmdArgs.push_back("-arcmt-modify");
2072 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002073 case options::OPT_ccc_arcmt_migrate:
2074 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002075 CmdArgs.push_back("-mt-migrate-directory");
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002076 CmdArgs.push_back(A->getValue(Args));
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002077
2078 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2079 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002080 break;
John McCalld70fb982011-06-15 23:25:17 +00002081 }
2082 }
2083 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002084
Ted Kremenekf7639e12012-03-06 20:06:33 +00002085 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2086 if (ARCMTEnabled) {
2087 D.Diag(diag::err_drv_argument_not_allowed_with)
2088 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2089 }
2090 CmdArgs.push_back("-mt-migrate-directory");
2091 CmdArgs.push_back(A->getValue(Args));
2092
2093 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2094 options::OPT_objcmt_migrate_subscripting)) {
2095 // None specified, means enable them all.
2096 CmdArgs.push_back("-objcmt-migrate-literals");
2097 CmdArgs.push_back("-objcmt-migrate-subscripting");
2098 } else {
2099 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2100 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2101 }
2102 }
2103
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002104 // Add preprocessing options like -I, -D, etc. if we are using the
2105 // preprocessor.
2106 //
2107 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002108 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Peter Collingbourne9b515cb2011-11-06 00:40:05 +00002109 AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002110
Rafael Espindolaa7431922011-07-21 23:40:37 +00002111 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2112 // that "The compiler can only warn and ignore the option if not recognized".
2113 // When building with ccache, it will pass -D options to clang even on
2114 // preprocessed inputs and configure concludes that -fPIC is not supported.
2115 Args.ClaimAllArgs(options::OPT_D);
2116
Daniel Dunbar58f78332009-09-17 06:53:36 +00002117 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002118 // others.
2119 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002120 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002121 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002122 else if (A->getOption().matches(options::OPT_O) &&
2123 A->getValue(Args)[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002124 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002125 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002126 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002127 }
2128
Daniel Dunbar945577c2009-10-29 02:24:45 +00002129 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002130 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2131 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002132 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002133 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002134
2135 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2136 // (-ansi is equivalent to -std=c89).
2137 //
2138 // If a std is supplied, only add -trigraphs if it follows the
2139 // option.
2140 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2141 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002142 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002143 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002144 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002145 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002146 else
2147 Std->render(Args, CmdArgs);
2148
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002149 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2150 options::OPT_trigraphs))
2151 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002152 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002153 } else {
2154 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002155 //
2156 // FIXME: Clang doesn't correctly handle -std= when the input language
2157 // doesn't match. For the time being just ignore this for C++ inputs;
2158 // eventually we want to do all the standard defaulting here instead of
2159 // splitting it between the driver and clang -cc1.
2160 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002161 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2162 "-std=", /*Joined=*/true);
2163 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2164 CmdArgs.push_back("-std=c++11");
2165
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002166 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002167 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002168
Chandler Carruthb009b142011-04-23 06:30:43 +00002169 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2170 // '-fconst-strings'; this better indicates its actual behavior.
2171 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2172 false)) {
2173 // For perfect compatibility with GCC, we do this even in the presence of
2174 // '-w'. This flag names something other than a warning for GCC.
2175 CmdArgs.push_back("-fconst-strings");
2176 }
2177
Chandler Carruth61fbf622011-04-23 09:27:53 +00002178 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002179 // during C++ compilation, which it is by default. GCC keeps this define even
2180 // in the presence of '-w', match this behavior bug-for-bug.
2181 if (types::isCXX(InputType) &&
2182 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2183 true)) {
2184 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002185 }
2186
Chandler Carruthe0391482010-05-22 02:21:53 +00002187 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2188 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2189 if (Asm->getOption().matches(options::OPT_fasm))
2190 CmdArgs.push_back("-fgnu-keywords");
2191 else
2192 CmdArgs.push_back("-fno-gnu-keywords");
2193 }
2194
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002195 if (ShouldDisableCFI(Args, getToolChain()))
2196 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002197
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002198 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2199 CmdArgs.push_back("-fno-dwarf-directory-asm");
2200
Nick Lewyckyba743b72011-10-21 02:32:14 +00002201 if (const char *pwd = ::getenv("PWD")) {
2202 // GCC also verifies that stat(pwd) and stat(".") have the same inode
2203 // number. Not doing those because stats are slow, but we could.
NAKAMURA Takumib5e6fa22011-10-22 10:25:25 +00002204 if (llvm::sys::path::is_absolute(pwd)) {
Nick Lewyckyba743b72011-10-21 02:32:14 +00002205 std::string CompDir = pwd;
2206 CmdArgs.push_back("-fdebug-compilation-dir");
2207 CmdArgs.push_back(Args.MakeArgString(CompDir));
2208 }
2209 }
2210
Richard Smith9a568822011-11-21 19:36:32 +00002211 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2212 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002213 CmdArgs.push_back("-ftemplate-depth");
2214 CmdArgs.push_back(A->getValue(Args));
2215 }
2216
Richard Smith9a568822011-11-21 19:36:32 +00002217 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2218 CmdArgs.push_back("-fconstexpr-depth");
2219 CmdArgs.push_back(A->getValue(Args));
2220 }
2221
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002222 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2223 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002224 if (A->getNumValues()) {
2225 StringRef bytes = A->getValue(Args);
2226 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2227 } else
2228 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002229 }
2230
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002231 if (Arg *A = Args.getLastArg(options::OPT_fbounds_checking,
2232 options::OPT_fbounds_checking_EQ)) {
2233 if (A->getNumValues()) {
2234 StringRef val = A->getValue(Args);
2235 CmdArgs.push_back(Args.MakeArgString("-fbounds-checking=" + val));
2236 } else
2237 CmdArgs.push_back("-fbounds-checking=1");
2238 }
2239
Daniel Dunbarfffd1812009-11-19 04:00:53 +00002240 if (Args.hasArg(options::OPT__relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002241 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002242
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002243 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2244 CmdArgs.push_back("-fconstant-string-class");
2245 CmdArgs.push_back(A->getValue(Args));
2246 }
David Chisnall5778fce2009-08-31 16:41:57 +00002247
Chris Lattnere23003d2010-01-09 21:54:33 +00002248 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2249 CmdArgs.push_back("-ftabstop");
2250 CmdArgs.push_back(A->getValue(Args));
2251 }
2252
Chris Lattnerb35583d2010-04-07 20:49:23 +00002253 CmdArgs.push_back("-ferror-limit");
2254 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
2255 CmdArgs.push_back(A->getValue(Args));
2256 else
2257 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002258
Chandler Carrutha77a7272010-05-06 04:55:18 +00002259 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2260 CmdArgs.push_back("-fmacro-backtrace-limit");
Douglas Gregorcd121fb2010-05-04 17:13:42 +00002261 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002262 }
2263
2264 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2265 CmdArgs.push_back("-ftemplate-backtrace-limit");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002266 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002267 }
2268
Richard Smithf6f003a2011-12-16 19:06:07 +00002269 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2270 CmdArgs.push_back("-fconstexpr-backtrace-limit");
2271 CmdArgs.push_back(A->getValue(Args));
2272 }
2273
Daniel Dunbar2c978472009-11-04 06:24:47 +00002274 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002275 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002276 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002277 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002278 } else {
2279 // If -fmessage-length=N was not specified, determine whether this is a
2280 // terminal and, if so, implicitly define -fmessage-length appropriately.
2281 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002282 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002283 }
2284
Daniel Dunbare357d562009-12-03 18:42:11 +00002285 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2286 CmdArgs.push_back("-fvisibility");
2287 CmdArgs.push_back(A->getValue(Args));
2288 }
2289
Douglas Gregor08329632010-06-15 17:05:35 +00002290 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002291
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002292 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2293
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002294 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002295 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2296 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002297 CmdArgs.push_back("-ffreestanding");
2298
Daniel Dunbare357d562009-12-03 18:42:11 +00002299 // Forward -f (flag) options which we can pass directly.
Mike Stumpd9546382009-12-12 01:27:46 +00002300 Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002301 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002302 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002303 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002304 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002305 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002306 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002307 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2308 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002309
2310 // Report and error for -faltivec on anything other then PowerPC.
2311 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2312 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2313 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2314 D.Diag(diag::err_drv_argument_only_allowed_with)
2315 << A->getAsString(Args) << "ppc/ppc64";
2316
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002317 if (getToolChain().SupportsProfiling())
2318 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002319
Kostya Serebryany8855ff62011-11-16 17:34:26 +00002320 if (Args.hasFlag(options::OPT_faddress_sanitizer,
2321 options::OPT_fno_address_sanitizer, false))
2322 CmdArgs.push_back("-faddress-sanitizer");
2323
Kostya Serebryany28a7a112012-03-01 22:27:08 +00002324 if (Args.hasFlag(options::OPT_fthread_sanitizer,
2325 options::OPT_fno_thread_sanitizer, false))
2326 CmdArgs.push_back("-fthread-sanitizer");
2327
Daniel Dunbar35621a92010-03-16 16:57:46 +00002328 // -flax-vector-conversions is default.
2329 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2330 options::OPT_fno_lax_vector_conversions))
2331 CmdArgs.push_back("-fno-lax-vector-conversions");
2332
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002333 if (Args.getLastArg(options::OPT_fapple_kext))
2334 CmdArgs.push_back("-fapple-kext");
2335
David Blaikie690f21e2012-06-14 18:55:27 +00002336 if (Args.hasFlag(options::OPT_frewrite_includes,
2337 options::OPT_fno_rewrite_includes, false))
2338 CmdArgs.push_back("-frewrite-includes");
2339
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002340 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002341 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002342 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002343 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2344 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002345
2346 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2347 CmdArgs.push_back("-ftrapv-handler");
2348 CmdArgs.push_back(A->getValue(Args));
2349 }
2350
Bob Wilson14adb362012-02-03 06:27:22 +00002351 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002352
Chandler Carruth6e501032011-03-27 00:04:55 +00002353 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2354 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2355 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2356 options::OPT_fno_wrapv)) {
2357 if (A->getOption().matches(options::OPT_fwrapv))
2358 CmdArgs.push_back("-fwrapv");
2359 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2360 options::OPT_fno_strict_overflow)) {
2361 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2362 CmdArgs.push_back("-fwrapv");
2363 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002364 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002365 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002366
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002367 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2368
Daniel Dunbar4930e332009-11-17 08:07:36 +00002369 // -stack-protector=0 is default.
2370 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002371 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2372 options::OPT_fstack_protector_all,
2373 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002374 if (A->getOption().matches(options::OPT_fstack_protector))
2375 StackProtectorLevel = 1;
2376 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2377 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002378 } else {
2379 StackProtectorLevel =
2380 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2381 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002382 if (StackProtectorLevel) {
2383 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002384 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002385 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002386
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002387 // --param ssp-buffer-size=
2388 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2389 ie = Args.filtered_end(); it != ie; ++it) {
2390 StringRef Str((*it)->getValue(Args));
2391 if (Str.startswith("ssp-buffer-size=")) {
2392 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00002393 CmdArgs.push_back("-stack-protector-buffer-size");
2394 // FIXME: Verify the argument is a valid integer.
2395 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002396 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002397 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00002398 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002399 }
2400
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002401 // Translate -mstackrealign
2402 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2403 false)) {
2404 CmdArgs.push_back("-backend-option");
2405 CmdArgs.push_back("-force-align-stack");
2406 }
2407 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2408 false)) {
2409 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2410 }
2411
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002412 if (Args.hasArg(options::OPT_mstack_alignment)) {
2413 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2414 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002415 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002416
Daniel Dunbard18049a2009-04-07 21:16:11 +00002417 // Forward -f options with positive and negative forms; we translate
2418 // these by hand.
2419
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002420 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002421 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002422 CmdArgs.push_back("-fapple-kext");
2423 if (!Args.hasArg(options::OPT_fbuiltin))
2424 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002425 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002426 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002427 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002428 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002429 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002430
Nuno Lopes13c88c72009-12-16 16:59:22 +00002431 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2432 options::OPT_fno_assume_sane_operator_new))
2433 CmdArgs.push_back("-fno-assume-sane-operator-new");
2434
Daniel Dunbar4930e332009-11-17 08:07:36 +00002435 // -fblocks=0 is default.
2436 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002437 getToolChain().IsBlocksDefault()) ||
2438 (Args.hasArg(options::OPT_fgnu_runtime) &&
2439 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2440 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002441 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002442
2443 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2444 !getToolChain().hasBlocksRuntime())
2445 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002446 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002447
Douglas Gregor226173a2012-01-18 15:19:58 +00002448 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2449 // users must also pass -fcxx-modules. The latter flag will disappear once the
2450 // modules implementation is solid for C++/Objective-C++ programs as well.
2451 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2452 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2453 options::OPT_fno_cxx_modules,
2454 false);
2455 if (AllowedInCXX || !types::isCXX(InputType))
2456 CmdArgs.push_back("-fmodules");
2457 }
Douglas Gregor787869b2012-01-03 17:13:05 +00002458
John McCalldfea9982010-04-09 19:12:06 +00002459 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002460 if (Args.hasFlag(options::OPT_fno_access_control,
2461 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002462 false))
John McCall3155f572010-04-09 19:03:51 +00002463 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00002464
Anders Carlssond470fef2010-11-21 00:09:52 +00002465 // -felide-constructors is the default.
2466 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2467 options::OPT_felide_constructors,
2468 false))
2469 CmdArgs.push_back("-fno-elide-constructors");
2470
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002471 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002472 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
2473 KernelOrKext)
Daniel Dunbar484afa22009-11-19 04:55:23 +00002474 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00002475
Tony Linthicum76329bf2011-12-12 21:14:55 +00002476 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002477 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00002478 options::OPT_fno_short_enums,
2479 getToolChain().getTriple().getArch() ==
2480 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002481 CmdArgs.push_back("-fshort-enums");
2482
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002483 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002484 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002485 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00002486 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00002487
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002488 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002489 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002490 options::OPT_fno_threadsafe_statics))
2491 CmdArgs.push_back("-fno-threadsafe-statics");
2492
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002493 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002494 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2495 options::OPT_fno_use_cxa_atexit,
2496 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00002497 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00002498 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2499 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002500 CmdArgs.push_back("-fno-use-cxa-atexit");
2501
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002502 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002503 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002504 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2505 CmdArgs.push_back("-fms-extensions");
2506
Chad Rosiered943242012-07-20 21:20:33 +00002507 // -fms-inline-asm.
Chad Rosierd3957e52012-07-20 23:12:26 +00002508 if (Args.hasArg(options::OPT_fenable_experimental_ms_inline_asm))
2509 CmdArgs.push_back("-fenable-experimental-ms-inline-asm");
Chad Rosiered943242012-07-20 21:20:33 +00002510
Francois Pichet1b4f1632011-09-17 04:32:15 +00002511 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00002512 if (Args.hasFlag(options::OPT_fms_compatibility,
2513 options::OPT_fno_ms_compatibility,
2514 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2515 Args.hasFlag(options::OPT_fms_extensions,
2516 options::OPT_fno_ms_extensions,
2517 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00002518 CmdArgs.push_back("-fms-compatibility");
2519
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002520 // -fmsc-version=1300 is default.
2521 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2522 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2523 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002524 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002525 if (msc_ver.empty())
2526 CmdArgs.push_back("-fmsc-version=1300");
2527 else
2528 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2529 }
2530
2531
Dawn Perchik68bb1b42010-09-02 23:59:25 +00002532 // -fborland-extensions=0 is default.
2533 if (Args.hasFlag(options::OPT_fborland_extensions,
2534 options::OPT_fno_borland_extensions, false))
2535 CmdArgs.push_back("-fborland-extensions");
2536
Francois Pichet02744872011-09-01 16:38:08 +00002537 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2538 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00002539 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2540 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00002541 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00002542 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00002543
Chandler Carruthe03aa552010-04-17 20:17:31 +00002544 // -fgnu-keywords default varies depending on language; only pass if
2545 // specified.
2546 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00002547 options::OPT_fno_gnu_keywords))
2548 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00002549
Rafael Espindola922a6242011-06-02 17:30:53 +00002550 if (Args.hasFlag(options::OPT_fgnu89_inline,
2551 options::OPT_fno_gnu89_inline,
2552 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00002553 CmdArgs.push_back("-fgnu89-inline");
2554
Chad Rosier9c76d242012-03-15 22:31:42 +00002555 if (Args.hasArg(options::OPT_fno_inline))
2556 CmdArgs.push_back("-fno-inline");
2557
Chad Rosier64d6be92012-03-06 21:17:19 +00002558 if (Args.hasArg(options::OPT_fno_inline_functions))
2559 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00002560
John McCall5fb5df92012-06-20 06:18:46 +00002561 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00002562
John McCall5fb5df92012-06-20 06:18:46 +00002563 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2564 // legacy is the default.
2565 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00002566 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2567 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00002568 objcRuntime.isLegacyDispatchDefaultForArch(
2569 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00002570 if (getToolChain().UseObjCMixedDispatch())
2571 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2572 else
2573 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2574 }
2575 }
2576
Nico Weber97bd94b2012-03-09 21:19:44 +00002577 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2578 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00002579 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00002580 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2581 }
2582
John McCall24fc0de2011-07-06 00:26:06 +00002583 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2584 // NOTE: This logic is duplicated in ToolChains.cpp.
2585 bool ARC = isObjCAutoRefCount(Args);
2586 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00002587 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00002588
John McCall24fc0de2011-07-06 00:26:06 +00002589 CmdArgs.push_back("-fobjc-arc");
2590
Chandler Carruth491db322011-11-04 07:34:47 +00002591 // FIXME: It seems like this entire block, and several around it should be
2592 // wrapped in isObjC, but for now we just use it here as this is where it
2593 // was being used previously.
2594 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2595 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2596 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2597 else
2598 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2599 }
2600
John McCall24fc0de2011-07-06 00:26:06 +00002601 // Allow the user to enable full exceptions code emission.
2602 // We define off for Objective-CC, on for Objective-C++.
2603 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2604 options::OPT_fno_objc_arc_exceptions,
2605 /*default*/ types::isCXX(InputType)))
2606 CmdArgs.push_back("-fobjc-arc-exceptions");
2607 }
2608
2609 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2610 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00002611 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00002612 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002613
John McCall24fc0de2011-07-06 00:26:06 +00002614 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2615 // takes precedence.
2616 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2617 if (!GCArg)
2618 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2619 if (GCArg) {
2620 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002621 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00002622 << GCArg->getAsString(Args);
2623 } else if (getToolChain().SupportsObjCGC()) {
2624 GCArg->render(Args, CmdArgs);
2625 } else {
2626 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002627 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00002628 << GCArg->getAsString(Args);
2629 }
2630 }
2631
John McCallb5f652e2011-06-22 00:53:57 +00002632 // Add exception args.
2633 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00002634 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00002635
2636 if (getToolChain().UseSjLjExceptions())
2637 CmdArgs.push_back("-fsjlj-exceptions");
2638
2639 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00002640 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2641 options::OPT_fno_assume_sane_operator_new))
2642 CmdArgs.push_back("-fno-assume-sane-operator-new");
2643
Daniel Dunbar34d7a992010-04-27 15:34:57 +00002644 // -fconstant-cfstrings is default, and may be subject to argument translation
2645 // on Darwin.
2646 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2647 options::OPT_fno_constant_cfstrings) ||
2648 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2649 options::OPT_mno_constant_cfstrings))
2650 CmdArgs.push_back("-fno-constant-cfstrings");
2651
John Thompsoned4e2952009-11-05 20:14:16 +00002652 // -fshort-wchar default varies depending on platform; only
2653 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00002654 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2655 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00002656
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00002657 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2658 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00002659 //
2660 // FIXME: This is gross; that translation should be pulled from the
2661 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002662 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00002663 options::OPT_fno_pascal_strings,
2664 false) ||
2665 Args.hasFlag(options::OPT_mpascal_strings,
2666 options::OPT_mno_pascal_strings,
2667 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002668 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002669
Daniel Dunbar096ed292011-10-05 21:04:55 +00002670 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2671 // -fno-pack-struct doesn't apply to -fpack-struct=.
2672 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00002673 std::string PackStructStr = "-fpack-struct=";
2674 PackStructStr += A->getValue(Args);
2675 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00002676 } else if (Args.hasFlag(options::OPT_fpack_struct,
2677 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00002678 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00002679 }
2680
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002681 if (Args.hasArg(options::OPT_mkernel) ||
2682 Args.hasArg(options::OPT_fapple_kext)) {
2683 if (!Args.hasArg(options::OPT_fcommon))
2684 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00002685 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002686 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00002687
Daniel Dunbard18049a2009-04-07 21:16:11 +00002688 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002689 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002690 CmdArgs.push_back("-fno-common");
2691
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002692 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00002693 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00002694 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002695 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002696 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002697 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2698
Daniel Dunbar6358d682010-10-15 22:30:42 +00002699 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2700 if (!Args.hasFlag(options::OPT_ffor_scope,
2701 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002702 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00002703 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2704
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00002705 // -fcaret-diagnostics is default.
2706 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2707 options::OPT_fno_caret_diagnostics, true))
2708 CmdArgs.push_back("-fno-caret-diagnostics");
2709
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002710 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00002711 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002712 options::OPT_fno_diagnostics_fixit_info))
2713 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002714
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002715 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00002716 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002717 options::OPT_fno_diagnostics_show_option))
2718 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002719
Chris Lattnerbf6fac82010-05-04 21:55:25 +00002720 if (const Arg *A =
2721 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
2722 CmdArgs.push_back("-fdiagnostics-show-category");
2723 CmdArgs.push_back(A->getValue(Args));
2724 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002725
Douglas Gregor643c9222011-05-21 17:07:29 +00002726 if (const Arg *A =
2727 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
2728 CmdArgs.push_back("-fdiagnostics-format");
2729 CmdArgs.push_back(A->getValue(Args));
2730 }
2731
Chandler Carruthb6766f02011-03-27 01:50:55 +00002732 if (Arg *A = Args.getLastArg(
2733 options::OPT_fdiagnostics_show_note_include_stack,
2734 options::OPT_fno_diagnostics_show_note_include_stack)) {
2735 if (A->getOption().matches(
2736 options::OPT_fdiagnostics_show_note_include_stack))
2737 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
2738 else
2739 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
2740 }
2741
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002742 // Color diagnostics are the default, unless the terminal doesn't support
2743 // them.
2744 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidis4f920162010-09-23 12:56:06 +00002745 options::OPT_fno_color_diagnostics,
2746 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002747 CmdArgs.push_back("-fcolor-diagnostics");
2748
Daniel Dunbardb097022009-06-08 21:13:54 +00002749 if (!Args.hasFlag(options::OPT_fshow_source_location,
2750 options::OPT_fno_show_source_location))
2751 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002752
Douglas Gregor643c9222011-05-21 17:07:29 +00002753 if (!Args.hasFlag(options::OPT_fshow_column,
2754 options::OPT_fno_show_column,
2755 true))
2756 CmdArgs.push_back("-fno-show-column");
2757
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00002758 if (!Args.hasFlag(options::OPT_fspell_checking,
2759 options::OPT_fno_spell_checking))
2760 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002761
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002762
Daniel Dunbar3ada2b72010-11-02 19:42:04 +00002763 // Silently ignore -fasm-blocks for now.
2764 (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
2765 false);
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002766
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00002767 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
2768 A->render(Args, CmdArgs);
2769
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002770 // -fdollars-in-identifiers default varies depending on platform and
2771 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00002772 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002773 options::OPT_fno_dollars_in_identifiers)) {
2774 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002775 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002776 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002777 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002778 }
2779
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002780 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
2781 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00002782 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002783 options::OPT_fno_unit_at_a_time)) {
2784 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002785 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002786 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002787
Eli Friedman055c9702011-11-02 01:53:16 +00002788 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
2789 options::OPT_fno_apple_pragma_pack, false))
2790 CmdArgs.push_back("-fapple-pragma-pack");
2791
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002792 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002793 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002794 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002795#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00002796 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002797 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
2798 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
2799 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
2800 CmdArgs.push_back("-fno-builtin-strcat");
2801 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
2802 CmdArgs.push_back("-fno-builtin-strcpy");
2803 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002804#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002805
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002806 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00002807 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002808 options::OPT_traditional_cpp)) {
2809 if (isa<PreprocessJobAction>(JA))
2810 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002811 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002812 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002813 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002814
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002815 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00002816 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00002817
2818 // Handle serialized diagnostics.
2819 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
2820 CmdArgs.push_back("-serialize-diagnostic-file");
2821 CmdArgs.push_back(Args.MakeArgString(A->getValue(Args)));
2822 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002823
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00002824 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
2825 CmdArgs.push_back("-fretain-comments-from-system-headers");
2826
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002827 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
2828 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002829 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002830 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
2831 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00002832 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00002833
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002834 // We translate this by hand to the -cc1 argument, since nightly test uses
2835 // it and developers have been trained to spell it with -mllvm.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002836 if (StringRef((*it)->getValue(Args, 0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002837 CmdArgs.push_back("-disable-llvm-optzns");
2838 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00002839 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002840 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002841
Daniel Dunbard67a3222009-03-30 06:36:42 +00002842 if (Output.getType() == types::TY_Dependencies) {
2843 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002844 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00002845 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002846 CmdArgs.push_back(Output.getFilename());
2847 } else {
2848 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002849 }
2850
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002851 for (InputInfoList::const_iterator
2852 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2853 const InputInfo &II = *it;
2854 CmdArgs.push_back("-x");
2855 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00002856 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002857 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002858 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002859 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002860 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002861
Chris Lattnere9d7d782009-11-03 19:50:27 +00002862 Args.AddAllArgs(CmdArgs, options::OPT_undef);
2863
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00002864 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002865
2866 // Optionally embed the -cc1 level arguments into the debug info, for build
2867 // analysis.
2868 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002869 ArgStringList OriginalArgs;
2870 for (ArgList::const_iterator it = Args.begin(),
2871 ie = Args.end(); it != ie; ++it)
2872 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002873
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00002874 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002875 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002876 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002877 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002878 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002879 }
2880 CmdArgs.push_back("-dwarf-debug-flags");
2881 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
2882 }
2883
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00002884 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00002885
Roman Divacky178e01602011-02-10 16:52:03 +00002886 if (Arg *A = Args.getLastArg(options::OPT_pg))
2887 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002888 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00002889 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002890
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002891 // Claim some arguments which clang supports automatically.
2892
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00002893 // -fpch-preprocess is used with gcc to add a special marker in the output to
2894 // include the PCH file. Clang's PTH solution is completely transparent, so we
2895 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002896 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002897
Daniel Dunbar17731772009-03-23 19:03:36 +00002898 // Claim some arguments which clang doesn't support, but we don't
2899 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00002900 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
2901 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00002902
Rafael Espindolad95a8122011-03-01 05:25:27 +00002903 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00002904 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00002905 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002906}
2907
Jim Grosbach576452b2012-02-10 20:37:10 +00002908void ClangAs::AddARMTargetArgs(const ArgList &Args,
2909 ArgStringList &CmdArgs) const {
2910 const Driver &D = getToolChain().getDriver();
2911 llvm::Triple Triple = getToolChain().getTriple();
2912
2913 // Set the CPU based on -march= and -mcpu=.
2914 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00002915 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00002916
2917 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00002918 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00002919 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00002920
2921 // Honor -mfpmath=.
2922 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00002923 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00002924}
2925
John McCall5fb5df92012-06-20 06:18:46 +00002926/// Add options related to the Objective-C runtime/ABI.
2927///
2928/// Returns true if the runtime is non-fragile.
2929ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
2930 ArgStringList &cmdArgs,
2931 RewriteKind rewriteKind) const {
2932 // Look for the controlling runtime option.
2933 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
2934 options::OPT_fgnu_runtime,
2935 options::OPT_fobjc_runtime_EQ);
2936
2937 // Just forward -fobjc-runtime= to the frontend. This supercedes
2938 // options about fragility.
2939 if (runtimeArg &&
2940 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
2941 ObjCRuntime runtime;
2942 StringRef value = runtimeArg->getValue(args);
2943 if (runtime.tryParse(value)) {
2944 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
2945 << value;
2946 }
2947
2948 runtimeArg->render(args, cmdArgs);
2949 return runtime;
2950 }
2951
2952 // Otherwise, we'll need the ABI "version". Version numbers are
2953 // slightly confusing for historical reasons:
2954 // 1 - Traditional "fragile" ABI
2955 // 2 - Non-fragile ABI, version 1
2956 // 3 - Non-fragile ABI, version 2
2957 unsigned objcABIVersion = 1;
2958 // If -fobjc-abi-version= is present, use that to set the version.
2959 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
2960 StringRef value = abiArg->getValue(args);
2961 if (value == "1")
2962 objcABIVersion = 1;
2963 else if (value == "2")
2964 objcABIVersion = 2;
2965 else if (value == "3")
2966 objcABIVersion = 3;
2967 else
2968 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2969 << value;
2970 } else {
2971 // Otherwise, determine if we are using the non-fragile ABI.
2972 bool nonFragileABIIsDefault =
2973 (rewriteKind == RK_NonFragile ||
2974 (rewriteKind == RK_None &&
2975 getToolChain().IsObjCNonFragileABIDefault()));
2976 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
2977 options::OPT_fno_objc_nonfragile_abi,
2978 nonFragileABIIsDefault)) {
2979 // Determine the non-fragile ABI version to use.
2980#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
2981 unsigned nonFragileABIVersion = 1;
2982#else
2983 unsigned nonFragileABIVersion = 2;
2984#endif
2985
2986 if (Arg *abiArg = args.getLastArg(
2987 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
2988 StringRef value = abiArg->getValue(args);
2989 if (value == "1")
2990 nonFragileABIVersion = 1;
2991 else if (value == "2")
2992 nonFragileABIVersion = 2;
2993 else
2994 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2995 << value;
2996 }
2997
2998 objcABIVersion = 1 + nonFragileABIVersion;
2999 } else {
3000 objcABIVersion = 1;
3001 }
3002 }
3003
3004 // We don't actually care about the ABI version other than whether
3005 // it's non-fragile.
3006 bool isNonFragile = objcABIVersion != 1;
3007
3008 // If we have no runtime argument, ask the toolchain for its default runtime.
3009 // However, the rewriter only really supports the Mac runtime, so assume that.
3010 ObjCRuntime runtime;
3011 if (!runtimeArg) {
3012 switch (rewriteKind) {
3013 case RK_None:
3014 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3015 break;
3016 case RK_Fragile:
3017 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3018 break;
3019 case RK_NonFragile:
3020 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3021 break;
3022 }
3023
3024 // -fnext-runtime
3025 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3026 // On Darwin, make this use the default behavior for the toolchain.
3027 if (getToolChain().getTriple().isOSDarwin()) {
3028 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3029
3030 // Otherwise, build for a generic macosx port.
3031 } else {
3032 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3033 }
3034
3035 // -fgnu-runtime
3036 } else {
3037 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003038 // Legacy behaviour is to target the gnustep runtime if we are i
3039 // non-fragile mode or the GCC runtime in fragile mode.
3040 if (isNonFragile)
3041 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple());
3042 else
3043 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003044 }
3045
3046 cmdArgs.push_back(args.MakeArgString(
3047 "-fobjc-runtime=" + runtime.getAsString()));
3048 return runtime;
3049}
3050
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003051void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003052 const InputInfo &Output,
3053 const InputInfoList &Inputs,
3054 const ArgList &Args,
3055 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003056 ArgStringList CmdArgs;
3057
3058 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3059 const InputInfo &Input = Inputs[0];
3060
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003061 // Don't warn about "clang -w -c foo.s"
3062 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003063 // and "clang -emit-llvm -c foo.s"
3064 Args.ClaimAllArgs(options::OPT_emit_llvm);
3065 // and "clang -use-gold-plugin -c foo.s"
3066 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003067
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003068 // Invoke ourselves in -cc1as mode.
3069 //
3070 // FIXME: Implement custom jobs for internal actions.
3071 CmdArgs.push_back("-cc1as");
3072
3073 // Add the "effective" target triple.
3074 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003075 std::string TripleStr =
3076 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003077 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3078
3079 // Set the output mode, we currently only expect to be used as a real
3080 // assembler.
3081 CmdArgs.push_back("-filetype");
3082 CmdArgs.push_back("obj");
3083
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003084 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003085 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003086
Jim Grosbach576452b2012-02-10 20:37:10 +00003087 // Add target specific cpu and features flags.
3088 switch(getToolChain().getTriple().getArch()) {
3089 default:
3090 break;
3091
3092 case llvm::Triple::arm:
3093 case llvm::Triple::thumb:
3094 AddARMTargetArgs(Args, CmdArgs);
3095 break;
3096 }
3097
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003098 // Ignore explicit -force_cpusubtype_ALL option.
3099 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003100
Eric Christopherfc3ee562012-01-10 00:38:01 +00003101 // Determine the original source input.
3102 const Action *SourceAction = &JA;
3103 while (SourceAction->getKind() != Action::InputClass) {
3104 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3105 SourceAction = SourceAction->getInputs()[0];
3106 }
3107
3108 // Forward -g, assuming we are dealing with an actual assembly file.
3109 if (SourceAction->getType() == types::TY_Asm ||
3110 SourceAction->getType() == types::TY_PP_Asm) {
3111 Args.ClaimAllArgs(options::OPT_g_Group);
3112 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3113 if (!A->getOption().matches(options::OPT_g0))
3114 CmdArgs.push_back("-g");
3115 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003116
3117 // Optionally embed the -cc1as level arguments into the debug info, for build
3118 // analysis.
3119 if (getToolChain().UseDwarfDebugFlags()) {
3120 ArgStringList OriginalArgs;
3121 for (ArgList::const_iterator it = Args.begin(),
3122 ie = Args.end(); it != ie; ++it)
3123 (*it)->render(Args, OriginalArgs);
3124
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003125 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003126 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3127 Flags += Exec;
3128 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3129 Flags += " ";
3130 Flags += OriginalArgs[i];
3131 }
3132 CmdArgs.push_back("-dwarf-debug-flags");
3133 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3134 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003135
3136 // FIXME: Add -static support, once we have it.
3137
3138 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3139 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003140 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003141
3142 assert(Output.isFilename() && "Unexpected lipo output.");
3143 CmdArgs.push_back("-o");
3144 CmdArgs.push_back(Output.getFilename());
3145
Daniel Dunbarb440f562010-08-02 02:38:21 +00003146 assert(Input.isFilename() && "Invalid input.");
3147 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003148
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003149 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003150 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003151}
3152
Daniel Dunbara3246a02009-03-18 08:07:30 +00003153void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003154 const InputInfo &Output,
3155 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003156 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003157 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003158 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003159 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003160
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003161 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003162 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003163 Arg *A = *it;
Daniel Dunbar2da02722009-03-19 07:55:12 +00003164 if (A->getOption().hasForwardToGCC()) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003165 // Don't forward any -g arguments to assembly steps.
3166 if (isa<AssembleJobAction>(JA) &&
3167 A->getOption().matches(options::OPT_g_Group))
3168 continue;
3169
Daniel Dunbar2da02722009-03-19 07:55:12 +00003170 // It is unfortunate that we have to claim here, as this means
3171 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003172 // platforms using a generic gcc, even if we are just using gcc
3173 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003174 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003175 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003176 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003177 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003178
Daniel Dunbar4e295052010-01-25 22:35:08 +00003179 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003180
3181 // If using a driver driver, force the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003182 const std::string &Arch = getToolChain().getArchName();
Bob Wilson6524dd32011-10-14 05:03:44 +00003183 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003184 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003185
3186 // FIXME: Remove these special cases.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003187 if (Arch == "powerpc")
3188 CmdArgs.push_back("ppc");
3189 else if (Arch == "powerpc64")
3190 CmdArgs.push_back("ppc64");
3191 else
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003192 CmdArgs.push_back(Args.MakeArgString(Arch));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003193 }
3194
Daniel Dunbar5716d872009-05-02 21:41:52 +00003195 // Try to force gcc to match the tool chain we want, if we recognize
3196 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003197 //
3198 // FIXME: The triple class should directly provide the information we want
3199 // here.
3200 if (Arch == "i386" || Arch == "powerpc")
Daniel Dunbar5716d872009-05-02 21:41:52 +00003201 CmdArgs.push_back("-m32");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003202 else if (Arch == "x86_64" || Arch == "powerpc64")
Daniel Dunbar5716d872009-05-02 21:41:52 +00003203 CmdArgs.push_back("-m64");
3204
Daniel Dunbarb440f562010-08-02 02:38:21 +00003205 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003206 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003207 CmdArgs.push_back(Output.getFilename());
3208 } else {
3209 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003210 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003211 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003212
Tony Linthicum76329bf2011-12-12 21:14:55 +00003213 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3214 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003215
3216 // Only pass -x if gcc will understand it; otherwise hope gcc
3217 // understands the suffix correctly. The main use case this would go
3218 // wrong in is for linker inputs if they happened to have an odd
3219 // suffix; really the only way to get this to happen is a command
3220 // like '-x foobar a.c' which will treat a.c like a linker input.
3221 //
3222 // FIXME: For the linker case specifically, can we safely convert
3223 // inputs into '-Wl,' options?
3224 for (InputInfoList::const_iterator
3225 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3226 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003227
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003228 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003229 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3230 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003231 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003232 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003233 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003234 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003235 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003236
Daniel Dunbara3246a02009-03-18 08:07:30 +00003237 if (types::canTypeBeUserSpecified(II.getType())) {
3238 CmdArgs.push_back("-x");
3239 CmdArgs.push_back(types::getTypeName(II.getType()));
3240 }
3241
Daniel Dunbarb440f562010-08-02 02:38:21 +00003242 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003243 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003244 else {
3245 const Arg &A = II.getInputArg();
3246
3247 // Reverse translate some rewritten options.
3248 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3249 CmdArgs.push_back("-lstdc++");
3250 continue;
3251 }
3252
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003253 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003254 A.render(Args, CmdArgs);
3255 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003256 }
3257
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003258 const std::string customGCCName = D.getCCCGenericGCCName();
3259 const char *GCCName;
3260 if (!customGCCName.empty())
3261 GCCName = customGCCName.c_str();
3262 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003263 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003264 } else
3265 GCCName = "gcc";
3266
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003267 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003268 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003269 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003270}
3271
Daniel Dunbar4e295052010-01-25 22:35:08 +00003272void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3273 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003274 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003275}
3276
Daniel Dunbar4e295052010-01-25 22:35:08 +00003277void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3278 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003279 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003280}
3281
Daniel Dunbar4e295052010-01-25 22:35:08 +00003282void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3283 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003284 const Driver &D = getToolChain().getDriver();
3285
Daniel Dunbar4e295052010-01-25 22:35:08 +00003286 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003287 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3288 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003289 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003290 else {
3291 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003292 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003293 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003294
Daniel Dunbar4e295052010-01-25 22:35:08 +00003295 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003296 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003297}
3298
Daniel Dunbar4e295052010-01-25 22:35:08 +00003299void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3300 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003301 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003302}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003303
Daniel Dunbar4e295052010-01-25 22:35:08 +00003304void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3305 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003306 // The types are (hopefully) good enough.
3307}
3308
Tony Linthicum76329bf2011-12-12 21:14:55 +00003309// Hexagon tools start.
3310void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3311 ArgStringList &CmdArgs) const {
3312
3313}
3314void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3315 const InputInfo &Output,
3316 const InputInfoList &Inputs,
3317 const ArgList &Args,
3318 const char *LinkingOutput) const {
3319
3320 const Driver &D = getToolChain().getDriver();
3321 ArgStringList CmdArgs;
3322
3323 std::string MarchString = "-march=";
3324 MarchString += getHexagonTargetCPU(Args);
3325 CmdArgs.push_back(Args.MakeArgString(MarchString));
3326
3327 RenderExtraToolArgs(JA, CmdArgs);
3328
3329 if (Output.isFilename()) {
3330 CmdArgs.push_back("-o");
3331 CmdArgs.push_back(Output.getFilename());
3332 } else {
3333 assert(Output.isNothing() && "Unexpected output");
3334 CmdArgs.push_back("-fsyntax-only");
3335 }
3336
3337
3338 // Only pass -x if gcc will understand it; otherwise hope gcc
3339 // understands the suffix correctly. The main use case this would go
3340 // wrong in is for linker inputs if they happened to have an odd
3341 // suffix; really the only way to get this to happen is a command
3342 // like '-x foobar a.c' which will treat a.c like a linker input.
3343 //
3344 // FIXME: For the linker case specifically, can we safely convert
3345 // inputs into '-Wl,' options?
3346 for (InputInfoList::const_iterator
3347 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3348 const InputInfo &II = *it;
3349
3350 // Don't try to pass LLVM or AST inputs to a generic gcc.
3351 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3352 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3353 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3354 << getToolChain().getTripleString();
3355 else if (II.getType() == types::TY_AST)
3356 D.Diag(clang::diag::err_drv_no_ast_support)
3357 << getToolChain().getTripleString();
3358
3359 if (II.isFilename())
3360 CmdArgs.push_back(II.getFilename());
3361 else
3362 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3363 II.getInputArg().render(Args, CmdArgs);
3364 }
3365
3366 const char *GCCName = "hexagon-as";
3367 const char *Exec =
3368 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3369 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3370
3371}
3372void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3373 ArgStringList &CmdArgs) const {
3374 // The types are (hopefully) good enough.
3375}
3376
3377void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3378 const InputInfo &Output,
3379 const InputInfoList &Inputs,
3380 const ArgList &Args,
3381 const char *LinkingOutput) const {
3382
3383 const Driver &D = getToolChain().getDriver();
3384 ArgStringList CmdArgs;
3385
3386 for (ArgList::const_iterator
3387 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3388 Arg *A = *it;
3389 if (A->getOption().hasForwardToGCC()) {
3390 // Don't forward any -g arguments to assembly steps.
3391 if (isa<AssembleJobAction>(JA) &&
3392 A->getOption().matches(options::OPT_g_Group))
3393 continue;
3394
3395 // It is unfortunate that we have to claim here, as this means
3396 // we will basically never report anything interesting for
3397 // platforms using a generic gcc, even if we are just using gcc
3398 // to get to the assembler.
3399 A->claim();
3400 A->render(Args, CmdArgs);
3401 }
3402 }
3403
3404 RenderExtraToolArgs(JA, CmdArgs);
3405
3406 // Add Arch Information
3407 Arg *A;
Sebastian Pop86500282012-01-13 20:37:10 +00003408 if ((A = getLastHexagonArchArg(Args))) {
3409 if (A->getOption().matches(options::OPT_m_Joined))
3410 A->render(Args, CmdArgs);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003411 else
Sebastian Pop86500282012-01-13 20:37:10 +00003412 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003413 }
Sebastian Pop86500282012-01-13 20:37:10 +00003414 else {
3415 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
3416 }
3417
Tony Linthicum76329bf2011-12-12 21:14:55 +00003418 CmdArgs.push_back("-mqdsp6-compat");
3419
3420 const char *GCCName;
3421 if (C.getDriver().CCCIsCXX)
3422 GCCName = "hexagon-g++";
3423 else
3424 GCCName = "hexagon-gcc";
3425 const char *Exec =
3426 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3427
3428 if (Output.isFilename()) {
3429 CmdArgs.push_back("-o");
3430 CmdArgs.push_back(Output.getFilename());
3431 }
3432
3433 for (InputInfoList::const_iterator
3434 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3435 const InputInfo &II = *it;
3436
3437 // Don't try to pass LLVM or AST inputs to a generic gcc.
3438 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3439 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3440 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3441 << getToolChain().getTripleString();
3442 else if (II.getType() == types::TY_AST)
3443 D.Diag(clang::diag::err_drv_no_ast_support)
3444 << getToolChain().getTripleString();
3445
3446 if (II.isFilename())
3447 CmdArgs.push_back(II.getFilename());
3448 else
3449 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3450 II.getInputArg().render(Args, CmdArgs);
3451 }
3452 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3453
3454}
3455// Hexagon tools end.
3456
3457
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003458const char *darwin::CC1::getCC1Name(types::ID Type) const {
3459 switch (Type) {
3460 default:
David Blaikie83d382b2011-09-23 05:06:16 +00003461 llvm_unreachable("Unexpected type for Darwin CC1 tool.");
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003462 case types::TY_Asm:
3463 case types::TY_C: case types::TY_CHeader:
3464 case types::TY_PP_C: case types::TY_PP_CHeader:
3465 return "cc1";
3466 case types::TY_ObjC: case types::TY_ObjCHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003467 case types::TY_PP_ObjC: case types::TY_PP_ObjC_Alias:
3468 case types::TY_PP_ObjCHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003469 return "cc1obj";
3470 case types::TY_CXX: case types::TY_CXXHeader:
3471 case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
3472 return "cc1plus";
3473 case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003474 case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXX_Alias:
3475 case types::TY_PP_ObjCXXHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003476 return "cc1objplus";
3477 }
3478}
3479
David Blaikie68e081d2011-12-20 02:48:34 +00003480void darwin::CC1::anchor() {}
3481
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003482const char *darwin::CC1::getBaseInputName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003483 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00003484 return Args.MakeArgString(
3485 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003486}
3487
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003488const char *darwin::CC1::getBaseInputStem(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003489 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003490 const char *Str = getBaseInputName(Args, Inputs);
3491
Chris Lattner906bb902011-01-16 08:14:11 +00003492 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003493 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003494
3495 return Str;
3496}
3497
3498const char *
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003499darwin::CC1::getDependencyFileName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003500 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003501 // FIXME: Think about this more.
3502 std::string Res;
3503
3504 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3505 std::string Str(OutputOpt->getValue(Args));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003506 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003507 } else {
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003508 Res = darwin::CC1::getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003509 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003510 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003511}
3512
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003513void darwin::CC1::RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const {
Eric Christopher84fbdb42011-08-19 00:30:14 +00003514 for (ArgStringList::iterator it = CmdArgs.begin(), ie = CmdArgs.end();
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003515 it != ie;) {
Chad Rosier2f818792011-08-18 17:56:32 +00003516
3517 StringRef Option = *it;
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003518 bool RemoveOption = false;
Chad Rosier30453862011-08-18 01:18:28 +00003519
Bob Wilson7ecbd322012-02-07 01:17:55 +00003520 // Erase both -fmodule-cache-path and its argument.
3521 if (Option.equals("-fmodule-cache-path") && it+2 != ie) {
3522 it = CmdArgs.erase(it, it+2);
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003523 ie = CmdArgs.end();
Chad Rosier30453862011-08-18 01:18:28 +00003524 continue;
3525 }
3526
Bob Wilson7ecbd322012-02-07 01:17:55 +00003527 // Remove unsupported -f options.
3528 if (Option.startswith("-f")) {
3529 // Remove -f/-fno- to reduce the number of cases.
3530 if (Option.startswith("-fno-"))
3531 Option = Option.substr(5);
3532 else
3533 Option = Option.substr(2);
3534 RemoveOption = llvm::StringSwitch<bool>(Option)
3535 .Case("altivec", true)
3536 .Case("modules", true)
3537 .Case("diagnostics-show-note-include-stack", true)
3538 .Default(false);
3539 }
3540
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003541 // Handle machine specific options.
3542 if (Option.startswith("-m")) {
3543 RemoveOption = llvm::StringSwitch<bool>(Option)
3544 .Case("-mthumb", true)
3545 .Case("-mno-thumb", true)
3546 .Case("-mno-fused-madd", true)
3547 .Case("-mlong-branch", true)
3548 .Case("-mlongcall", true)
3549 .Case("-mcpu=G4", true)
3550 .Case("-mcpu=G5", true)
3551 .Default(false);
3552 }
3553
3554 // Handle warning options.
3555 if (Option.startswith("-W")) {
3556 // Remove -W/-Wno- to reduce the number of cases.
3557 if (Option.startswith("-Wno-"))
3558 Option = Option.substr(5);
3559 else
3560 Option = Option.substr(2);
3561
3562 RemoveOption = llvm::StringSwitch<bool>(Option)
3563 .Case("address-of-temporary", true)
3564 .Case("ambiguous-member-template", true)
3565 .Case("analyzer-incompatible-plugin", true)
3566 .Case("array-bounds", true)
3567 .Case("array-bounds-pointer-arithmetic", true)
3568 .Case("bind-to-temporary-copy", true)
3569 .Case("bitwise-op-parentheses", true)
3570 .Case("bool-conversions", true)
3571 .Case("builtin-macro-redefined", true)
3572 .Case("c++-hex-floats", true)
3573 .Case("c++0x-compat", true)
3574 .Case("c++0x-extensions", true)
3575 .Case("c++0x-narrowing", true)
Richard Smith31ce7932011-10-13 23:32:09 +00003576 .Case("c++11-compat", true)
3577 .Case("c++11-extensions", true)
3578 .Case("c++11-narrowing", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003579 .Case("conditional-uninitialized", true)
3580 .Case("constant-conversion", true)
David Blaikieebcbe4b2012-03-15 04:50:32 +00003581 .Case("conversion-null", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003582 .Case("CFString-literal", true)
3583 .Case("constant-logical-operand", true)
3584 .Case("custom-atomic-properties", true)
3585 .Case("default-arg-special-member", true)
3586 .Case("delegating-ctor-cycles", true)
3587 .Case("delete-non-virtual-dtor", true)
3588 .Case("deprecated-implementations", true)
3589 .Case("deprecated-writable-strings", true)
3590 .Case("distributed-object-modifiers", true)
3591 .Case("duplicate-method-arg", true)
3592 .Case("dynamic-class-memaccess", true)
3593 .Case("enum-compare", true)
3594 .Case("exit-time-destructors", true)
3595 .Case("gnu", true)
3596 .Case("gnu-designator", true)
3597 .Case("header-hygiene", true)
3598 .Case("idiomatic-parentheses", true)
3599 .Case("ignored-qualifiers", true)
3600 .Case("implicit-atomic-properties", true)
3601 .Case("incompatible-pointer-types", true)
3602 .Case("incomplete-implementation", true)
3603 .Case("initializer-overrides", true)
3604 .Case("invalid-noreturn", true)
3605 .Case("invalid-token-paste", true)
Ivan Krasin31f74112011-10-06 02:46:34 +00003606 .Case("language-extension-token", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003607 .Case("literal-conversion", true)
3608 .Case("literal-range", true)
3609 .Case("local-type-template-args", true)
3610 .Case("logical-op-parentheses", true)
3611 .Case("method-signatures", true)
3612 .Case("microsoft", true)
3613 .Case("mismatched-tags", true)
3614 .Case("missing-method-return-type", true)
3615 .Case("non-pod-varargs", true)
3616 .Case("nonfragile-abi2", true)
3617 .Case("null-arithmetic", true)
3618 .Case("null-dereference", true)
3619 .Case("out-of-line-declaration", true)
3620 .Case("overriding-method-mismatch", true)
3621 .Case("readonly-setter-attrs", true)
3622 .Case("return-stack-address", true)
3623 .Case("self-assign", true)
3624 .Case("semicolon-before-method-body", true)
3625 .Case("sentinel", true)
3626 .Case("shift-overflow", true)
3627 .Case("shift-sign-overflow", true)
3628 .Case("sign-conversion", true)
3629 .Case("sizeof-array-argument", true)
3630 .Case("sizeof-pointer-memaccess", true)
3631 .Case("string-compare", true)
3632 .Case("super-class-method-mismatch", true)
3633 .Case("tautological-compare", true)
3634 .Case("typedef-redefinition", true)
3635 .Case("typename-missing", true)
3636 .Case("undefined-reinterpret-cast", true)
3637 .Case("unknown-warning-option", true)
3638 .Case("unnamed-type-template-args", true)
3639 .Case("unneeded-internal-declaration", true)
3640 .Case("unneeded-member-function", true)
3641 .Case("unused-comparison", true)
3642 .Case("unused-exception-parameter", true)
3643 .Case("unused-member-function", true)
3644 .Case("unused-result", true)
3645 .Case("vector-conversions", true)
3646 .Case("vla", true)
3647 .Case("used-but-marked-unused", true)
3648 .Case("weak-vtables", true)
3649 .Default(false);
3650 } // if (Option.startswith("-W"))
Chad Rosier30453862011-08-18 01:18:28 +00003651 if (RemoveOption) {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003652 it = CmdArgs.erase(it);
Chad Rosier23594f62011-08-17 18:51:56 +00003653 ie = CmdArgs.end();
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003654 } else {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003655 ++it;
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003656 }
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003657 }
3658}
3659
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003660void darwin::CC1::AddCC1Args(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003661 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003662 const Driver &D = getToolChain().getDriver();
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003663
3664 CheckCodeGenerationOptions(D, Args);
3665
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003666 // Derived from cc1 spec.
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003667 if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) &&
3668 !Args.hasArg(options::OPT_mdynamic_no_pic))
3669 CmdArgs.push_back("-fPIC");
3670
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003671 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3672 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3673 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3674 CmdArgs.push_back("-fno-builtin-strcat");
3675 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3676 CmdArgs.push_back("-fno-builtin-strcpy");
3677 }
3678
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003679 if (Args.hasArg(options::OPT_g_Flag) &&
3680 !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
3681 CmdArgs.push_back("-feliminate-unused-debug-symbols");
3682}
3683
3684void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3685 const InputInfoList &Inputs,
3686 const ArgStringList &OutputArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003687 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003688
3689 // Derived from cc1_options spec.
3690 if (Args.hasArg(options::OPT_fast) ||
3691 Args.hasArg(options::OPT_fastf) ||
3692 Args.hasArg(options::OPT_fastcp))
3693 CmdArgs.push_back("-O3");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003694
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003695 if (Arg *A = Args.getLastArg(options::OPT_pg))
3696 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003697 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003698 << A->getAsString(Args) << "-fomit-frame-pointer";
3699
3700 AddCC1Args(Args, CmdArgs);
3701
3702 if (!Args.hasArg(options::OPT_Q))
3703 CmdArgs.push_back("-quiet");
3704
3705 CmdArgs.push_back("-dumpbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003706 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003707
3708 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3709
3710 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
3711 Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
3712
3713 // FIXME: The goal is to use the user provided -o if that is our
3714 // final output, otherwise to drive from the original input
3715 // name. Find a clean way to go about this.
3716 if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
3717 Args.hasArg(options::OPT_o)) {
3718 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
3719 CmdArgs.push_back("-auxbase-strip");
3720 CmdArgs.push_back(OutputOpt->getValue(Args));
3721 } else {
3722 CmdArgs.push_back("-auxbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003723 CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003724 }
3725
3726 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3727
3728 Args.AddAllArgs(CmdArgs, options::OPT_O);
3729 // FIXME: -Wall is getting some special treatment. Investigate.
3730 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3731 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003732 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003733 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003734 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3735 // Honor -std-default.
3736 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3737 "-std=", /*Joined=*/true);
3738 }
3739
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003740 if (Args.hasArg(options::OPT_v))
3741 CmdArgs.push_back("-version");
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003742 if (Args.hasArg(options::OPT_pg) &&
3743 getToolChain().SupportsProfiling())
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003744 CmdArgs.push_back("-p");
3745 Args.AddLastArg(CmdArgs, options::OPT_p);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003746
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003747 // The driver treats -fsyntax-only specially.
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003748 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3749 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3750 // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
3751 // used to inhibit the default -fno-builtin-str{cat,cpy}.
3752 //
3753 // FIXME: Should we grow a better way to deal with "removing" args?
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003754 for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
3755 options::OPT_fsyntax_only),
3756 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003757 if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
3758 !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
3759 (*it)->claim();
3760 (*it)->render(Args, CmdArgs);
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003761 }
3762 }
3763 } else
3764 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003765
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003766 // Claim Clang only -f options, they aren't worth warning about.
3767 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3768
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003769 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3770 if (Args.hasArg(options::OPT_Qn))
3771 CmdArgs.push_back("-fno-ident");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003772
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003773 // FIXME: This isn't correct.
3774 //Args.AddLastArg(CmdArgs, options::OPT__help)
3775 //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
3776
3777 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3778
3779 // FIXME: Still don't get what is happening here. Investigate.
3780 Args.AddAllArgs(CmdArgs, options::OPT__param);
3781
3782 if (Args.hasArg(options::OPT_fmudflap) ||
3783 Args.hasArg(options::OPT_fmudflapth)) {
3784 CmdArgs.push_back("-fno-builtin");
3785 CmdArgs.push_back("-fno-merge-constants");
3786 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003787
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003788 if (Args.hasArg(options::OPT_coverage)) {
3789 CmdArgs.push_back("-fprofile-arcs");
3790 CmdArgs.push_back("-ftest-coverage");
3791 }
3792
3793 if (types::isCXX(Inputs[0].getType()))
3794 CmdArgs.push_back("-D__private_extern__=extern");
3795}
3796
3797void darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3798 const InputInfoList &Inputs,
3799 const ArgStringList &OutputArgs) const {
3800 // Derived from cpp_options
3801 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003802
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003803 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3804
3805 AddCC1Args(Args, CmdArgs);
3806
3807 // NOTE: The code below has some commonality with cpp_options, but
3808 // in classic gcc style ends up sending things in different
3809 // orders. This may be a good merge candidate once we drop pedantic
3810 // compatibility.
3811
3812 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003813 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003814 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003815 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3816 // Honor -std-default.
3817 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3818 "-std=", /*Joined=*/true);
3819 }
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003820 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3821 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003822
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003823 // The driver treats -fsyntax-only specially.
3824 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
3825
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003826 // Claim Clang only -f options, they aren't worth warning about.
3827 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3828
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003829 if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
3830 !Args.hasArg(options::OPT_fno_working_directory))
3831 CmdArgs.push_back("-fworking-directory");
3832
3833 Args.AddAllArgs(CmdArgs, options::OPT_O);
3834 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3835 if (Args.hasArg(options::OPT_save_temps))
3836 CmdArgs.push_back("-fpch-preprocess");
3837}
3838
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003839void darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003840 ArgStringList &CmdArgs,
Mike Stump11289f42009-09-09 15:08:12 +00003841 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003842 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003843
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003844 CheckPreprocessingOptions(D, Args);
3845
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003846 // Derived from cpp_unique_options.
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003847 // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
3848 Args.AddLastArg(CmdArgs, options::OPT_C);
3849 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003850 if (!Args.hasArg(options::OPT_Q))
3851 CmdArgs.push_back("-quiet");
3852 Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
Douglas Gregor64b046f2010-03-24 20:13:48 +00003853 Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003854 Args.AddLastArg(CmdArgs, options::OPT_v);
3855 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
3856 Args.AddLastArg(CmdArgs, options::OPT_P);
3857
3858 // FIXME: Handle %I properly.
3859 if (getToolChain().getArchName() == "x86_64") {
3860 CmdArgs.push_back("-imultilib");
3861 CmdArgs.push_back("x86_64");
3862 }
3863
3864 if (Args.hasArg(options::OPT_MD)) {
3865 CmdArgs.push_back("-MD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003866 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003867 }
3868
3869 if (Args.hasArg(options::OPT_MMD)) {
3870 CmdArgs.push_back("-MMD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003871 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003872 }
3873
3874 Args.AddLastArg(CmdArgs, options::OPT_M);
3875 Args.AddLastArg(CmdArgs, options::OPT_MM);
3876 Args.AddAllArgs(CmdArgs, options::OPT_MF);
3877 Args.AddLastArg(CmdArgs, options::OPT_MG);
3878 Args.AddLastArg(CmdArgs, options::OPT_MP);
3879 Args.AddAllArgs(CmdArgs, options::OPT_MQ);
3880 Args.AddAllArgs(CmdArgs, options::OPT_MT);
3881 if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
3882 (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
3883 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3884 CmdArgs.push_back("-MQ");
3885 CmdArgs.push_back(OutputOpt->getValue(Args));
3886 }
3887 }
3888
3889 Args.AddLastArg(CmdArgs, options::OPT_remap);
3890 if (Args.hasArg(options::OPT_g3))
3891 CmdArgs.push_back("-dD");
3892 Args.AddLastArg(CmdArgs, options::OPT_H);
3893
3894 AddCPPArgs(Args, CmdArgs);
3895
3896 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
3897 Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
3898
3899 for (InputInfoList::const_iterator
3900 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3901 const InputInfo &II = *it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003902
Daniel Dunbarb440f562010-08-02 02:38:21 +00003903 CmdArgs.push_back(II.getFilename());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003904 }
3905
3906 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
3907 options::OPT_Xpreprocessor);
3908
3909 if (Args.hasArg(options::OPT_fmudflap)) {
3910 CmdArgs.push_back("-D_MUDFLAP");
3911 CmdArgs.push_back("-include");
3912 CmdArgs.push_back("mf-runtime.h");
3913 }
3914
3915 if (Args.hasArg(options::OPT_fmudflapth)) {
3916 CmdArgs.push_back("-D_MUDFLAP");
3917 CmdArgs.push_back("-D_MUDFLAPTH");
3918 CmdArgs.push_back("-include");
3919 CmdArgs.push_back("mf-runtime.h");
3920 }
3921}
3922
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003923void darwin::CC1::AddCPPArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003924 ArgStringList &CmdArgs) const {
3925 // Derived from cpp spec.
3926
3927 if (Args.hasArg(options::OPT_static)) {
3928 // The gcc spec is broken here, it refers to dynamic but
3929 // that has been translated. Start by being bug compatible.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003930
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003931 // if (!Args.hasArg(arglist.parser.dynamicOption))
3932 CmdArgs.push_back("-D__STATIC__");
3933 } else
3934 CmdArgs.push_back("-D__DYNAMIC__");
3935
3936 if (Args.hasArg(options::OPT_pthread))
3937 CmdArgs.push_back("-D_REENTRANT");
3938}
3939
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003940void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003941 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003942 const InputInfoList &Inputs,
3943 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003944 const char *LinkingOutput) const {
3945 ArgStringList CmdArgs;
3946
3947 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3948
3949 CmdArgs.push_back("-E");
3950
3951 if (Args.hasArg(options::OPT_traditional) ||
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003952 Args.hasArg(options::OPT_traditional_cpp))
3953 CmdArgs.push_back("-traditional-cpp");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003954
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003955 ArgStringList OutputArgs;
Daniel Dunbarb440f562010-08-02 02:38:21 +00003956 assert(Output.isFilename() && "Unexpected CC1 output.");
3957 OutputArgs.push_back("-o");
3958 OutputArgs.push_back(Output.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003959
Joerg Sonnenbergerb86f5f42011-03-06 23:31:01 +00003960 if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
Daniel Dunbarf64f5302009-03-29 22:27:40 +00003961 AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3962 } else {
3963 AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
3964 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3965 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003966
Daniel Dunbar6a8803a2009-04-03 01:27:06 +00003967 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3968
Chad Rosierc31e48d2011-09-08 00:38:00 +00003969 RemoveCC1UnsupportedArgs(CmdArgs);
3970
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003971 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003972 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003973 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003974 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003975}
3976
3977void darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003978 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003979 const InputInfoList &Inputs,
3980 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003981 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003982 const Driver &D = getToolChain().getDriver();
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003983 ArgStringList CmdArgs;
3984
3985 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3986
Bob Wilson0090df22012-04-01 23:03:29 +00003987 // Silence warning about unused --serialize-diagnostics
3988 Args.ClaimAllArgs(options::OPT__serialize_diags);
3989
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003990 types::ID InputType = Inputs[0].getType();
David Blaikie747ff7e2012-04-04 20:43:14 +00003991 if (const Arg *A = Args.getLastArg(options::OPT_traditional))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003992 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003993 << A->getAsString(Args) << "-E";
3994
Daniel Dunbar24e52992010-06-07 23:28:45 +00003995 if (JA.getType() == types::TY_LLVM_IR ||
3996 JA.getType() == types::TY_LTO_IR)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003997 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003998 else if (JA.getType() == types::TY_LLVM_BC ||
3999 JA.getType() == types::TY_LTO_BC)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004000 CmdArgs.push_back("-emit-llvm-bc");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004001 else if (Output.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004002 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004003 << getToolChain().getTripleString();
Daniel Dunbarbcd554f2010-02-11 17:33:45 +00004004 else if (JA.getType() != types::TY_PP_Asm &&
4005 JA.getType() != types::TY_PCH)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004006 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004007 << getTypeName(JA.getType());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004008
4009 ArgStringList OutputArgs;
4010 if (Output.getType() != types::TY_PCH) {
4011 OutputArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004012 if (Output.isNothing())
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004013 OutputArgs.push_back("/dev/null");
4014 else
4015 OutputArgs.push_back(Output.getFilename());
4016 }
4017
4018 // There is no need for this level of compatibility, but it makes
4019 // diffing easier.
4020 bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
4021 Args.hasArg(options::OPT_S));
4022
4023 if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004024 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004025 if (OutputArgsEarly) {
4026 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4027 } else {
4028 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4029 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4030 }
4031 } else {
4032 CmdArgs.push_back("-fpreprocessed");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004033
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004034 for (InputInfoList::const_iterator
4035 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4036 const InputInfo &II = *it;
4037
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004038 // Reject AST inputs.
4039 if (II.getType() == types::TY_AST) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004040 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004041 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004042 return;
4043 }
4044
Daniel Dunbarb440f562010-08-02 02:38:21 +00004045 CmdArgs.push_back(II.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004046 }
4047
4048 if (OutputArgsEarly) {
4049 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4050 } else {
4051 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4052 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4053 }
4054 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004055
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004056 if (Output.getType() == types::TY_PCH) {
4057 assert(Output.isFilename() && "Invalid PCH output.");
4058
4059 CmdArgs.push_back("-o");
4060 // NOTE: gcc uses a temp .s file for this, but there doesn't seem
4061 // to be a good reason.
Chad Rosier96d690c2011-08-01 19:58:48 +00004062 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004063 D.GetTemporaryPath("cc", "s"));
Chad Rosier96d690c2011-08-01 19:58:48 +00004064 C.addTempFile(TmpPath);
4065 CmdArgs.push_back(TmpPath);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004066
Eric Christopher84fbdb42011-08-19 00:30:14 +00004067 // If we're emitting a pch file with the last 4 characters of ".pth"
4068 // and falling back to llvm-gcc we want to use ".gch" instead.
4069 std::string OutputFile(Output.getFilename());
4070 size_t loc = OutputFile.rfind(".pth");
4071 if (loc != std::string::npos)
4072 OutputFile.replace(loc, 4, ".gch");
4073 const char *Tmp = C.getArgs().MakeArgString("--output-pch="+OutputFile);
4074 CmdArgs.push_back(Tmp);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004075 }
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004076
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00004077 RemoveCC1UnsupportedArgs(CmdArgs);
4078
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004079 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004080 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004081 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004082 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004083}
4084
Daniel Dunbarbe220842009-03-20 16:06:39 +00004085void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004086 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004087 const InputInfoList &Inputs,
4088 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004089 const char *LinkingOutput) const {
4090 ArgStringList CmdArgs;
4091
4092 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4093 const InputInfo &Input = Inputs[0];
4094
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004095 // Determine the original source input.
4096 const Action *SourceAction = &JA;
4097 while (SourceAction->getKind() != Action::InputClass) {
4098 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4099 SourceAction = SourceAction->getInputs()[0];
4100 }
4101
4102 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004103 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004104 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004105 if (Args.hasArg(options::OPT_gstabs))
4106 CmdArgs.push_back("--gstabs");
4107 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004108 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004109 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004110
Daniel Dunbarbe220842009-03-20 16:06:39 +00004111 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004112 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004113
Daniel Dunbar6d484762010-07-22 01:47:22 +00004114 // Use -force_cpusubtype_ALL on x86 by default.
4115 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4116 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004117 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4118 CmdArgs.push_back("-force_cpusubtype_ALL");
4119
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004120 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
4121 (Args.hasArg(options::OPT_mkernel) ||
Daniel Dunbarbe220842009-03-20 16:06:39 +00004122 Args.hasArg(options::OPT_static) ||
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004123 Args.hasArg(options::OPT_fapple_kext)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004124 CmdArgs.push_back("-static");
4125
Daniel Dunbarbe220842009-03-20 16:06:39 +00004126 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4127 options::OPT_Xassembler);
4128
4129 assert(Output.isFilename() && "Unexpected lipo output.");
4130 CmdArgs.push_back("-o");
4131 CmdArgs.push_back(Output.getFilename());
4132
Daniel Dunbarb440f562010-08-02 02:38:21 +00004133 assert(Input.isFilename() && "Invalid input.");
4134 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004135
4136 // asm_final spec is empty.
4137
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004138 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004139 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004140 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004141}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004142
David Blaikie68e081d2011-12-20 02:48:34 +00004143void darwin::DarwinTool::anchor() {}
4144
Daniel Dunbare9ded432009-09-09 18:36:20 +00004145void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4146 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004147 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004148
Daniel Dunbarc1964212009-03-26 16:23:12 +00004149 // Derived from darwin_arch spec.
4150 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004151 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004152
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004153 // FIXME: Is this needed anymore?
4154 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004155 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004156}
4157
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004158void darwin::Link::AddLinkArgs(Compilation &C,
4159 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004160 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004161 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004162 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004163
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004164 unsigned Version[3] = { 0, 0, 0 };
4165 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4166 bool HadExtra;
4167 if (!Driver::GetReleaseVersion(A->getValue(Args), Version[0],
4168 Version[1], Version[2], HadExtra) ||
4169 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004170 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004171 << A->getAsString(Args);
4172 }
4173
4174 // Newer linkers support -demangle, pass it if supported and not disabled by
4175 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004176 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004177 // Don't pass -demangle to ld_classic.
4178 //
4179 // FIXME: This is a temporary workaround, ld should be handling this.
4180 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4181 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004182 if (getToolChain().getArch() == llvm::Triple::x86) {
4183 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4184 options::OPT_Wl_COMMA),
4185 ie = Args.filtered_end(); it != ie; ++it) {
4186 const Arg *A = *it;
4187 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004188 if (StringRef(A->getValue(Args, i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004189 UsesLdClassic = true;
4190 }
4191 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004192 if (!UsesLdClassic)
4193 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004194 }
4195
Daniel Dunbaref889c72011-06-21 20:55:11 +00004196 // If we are using LTO, then automatically create a temporary file path for
4197 // the linker to use, so that it's lifetime will extend past a possible
4198 // dsymutil step.
Daniel Dunbar3d125d32011-06-21 21:18:32 +00004199 if (Version[0] >= 116 && D.IsUsingLTO(Args)) {
Daniel Dunbaref889c72011-06-21 20:55:11 +00004200 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004201 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Daniel Dunbaref889c72011-06-21 20:55:11 +00004202 C.addTempFile(TmpPath);
4203 CmdArgs.push_back("-object_path_lto");
4204 CmdArgs.push_back(TmpPath);
4205 }
4206
Daniel Dunbarc1964212009-03-26 16:23:12 +00004207 // Derived from the "link" spec.
4208 Args.AddAllArgs(CmdArgs, options::OPT_static);
4209 if (!Args.hasArg(options::OPT_static))
4210 CmdArgs.push_back("-dynamic");
4211 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4212 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4213 // here. How do we wish to handle such things?
4214 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004215
Daniel Dunbarc1964212009-03-26 16:23:12 +00004216 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004217 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004218 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004219 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004220
4221 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4222 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4223 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4224
4225 Arg *A;
4226 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4227 (A = Args.getLastArg(options::OPT_current__version)) ||
4228 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004229 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004230 << A->getAsString(Args) << "-dynamiclib";
4231
4232 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4233 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4234 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4235 } else {
4236 CmdArgs.push_back("-dylib");
4237
4238 Arg *A;
4239 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4240 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4241 (A = Args.getLastArg(options::OPT_client__name)) ||
4242 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4243 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4244 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004245 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004246 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004247
Daniel Dunbarc1964212009-03-26 16:23:12 +00004248 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4249 "-dylib_compatibility_version");
4250 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4251 "-dylib_current_version");
4252
Daniel Dunbara48823f2010-01-22 02:04:52 +00004253 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004254
4255 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4256 "-dylib_install_name");
4257 }
4258
4259 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4260 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4261 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004262 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004263 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004264 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4265 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4266 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4267 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4268 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4269 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004270 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004271 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4272 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4273 Args.AddAllArgs(CmdArgs, options::OPT_init);
4274
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004275 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004276 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004277
4278 // If we had an explicit -mios-simulator-version-min argument, honor that,
4279 // otherwise use the traditional deployment targets. We can't just check the
4280 // is-sim attribute because existing code follows this path, and the linker
4281 // may not handle the argument.
4282 //
4283 // FIXME: We may be able to remove this, once we can verify no one depends on
4284 // it.
4285 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4286 CmdArgs.push_back("-ios_simulator_version_min");
4287 else if (DarwinTC.isTargetIPhoneOS())
4288 CmdArgs.push_back("-iphoneos_version_min");
4289 else
4290 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004291 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004292
Daniel Dunbarc1964212009-03-26 16:23:12 +00004293 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4294 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4295 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4296 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4297 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004298
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004299 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4300 options::OPT_fno_pie,
4301 options::OPT_fno_PIE)) {
4302 if (A->getOption().matches(options::OPT_fpie) ||
4303 A->getOption().matches(options::OPT_fPIE))
4304 CmdArgs.push_back("-pie");
4305 else
4306 CmdArgs.push_back("-no_pie");
4307 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004308
4309 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4310 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4311 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4312 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4313 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4314 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4315 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4316 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4317 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4318 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4319 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4320 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4321 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4322 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4323 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4324 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004325
Daniel Dunbar84384642011-05-02 21:03:47 +00004326 // Give --sysroot= preference, over the Apple specific behavior to also use
4327 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004328 StringRef sysroot = C.getSysRoot();
4329 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004330 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004331 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004332 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4333 CmdArgs.push_back("-syslibroot");
4334 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004335 }
4336
Daniel Dunbarc1964212009-03-26 16:23:12 +00004337 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4338 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4339 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4340 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4341 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004342 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004343 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4344 Args.AddAllArgs(CmdArgs, options::OPT_y);
4345 Args.AddLastArg(CmdArgs, options::OPT_w);
4346 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4347 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4348 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4349 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4350 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4351 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4352 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4353 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4354 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4355 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4356 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4357 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4358}
4359
4360void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004361 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004362 const InputInfoList &Inputs,
4363 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004364 const char *LinkingOutput) const {
4365 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004366
Daniel Dunbarc1964212009-03-26 16:23:12 +00004367 // The logic here is derived from gcc's behavior; most of which
4368 // comes from specs (starting with link_command). Consult gcc for
4369 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004370 ArgStringList CmdArgs;
4371
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004372 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4373 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4374 options::OPT_ccc_arcmt_migrate)) {
4375 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4376 (*I)->claim();
4377 const char *Exec =
4378 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4379 CmdArgs.push_back(Output.getFilename());
4380 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4381 return;
4382 }
4383
Daniel Dunbarc1964212009-03-26 16:23:12 +00004384 // I'm not sure why this particular decomposition exists in gcc, but
4385 // we follow suite for ease of comparison.
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004386 AddLinkArgs(C, Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004387
Daniel Dunbarc1964212009-03-26 16:23:12 +00004388 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4389 Args.AddAllArgs(CmdArgs, options::OPT_s);
4390 Args.AddAllArgs(CmdArgs, options::OPT_t);
4391 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4392 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004393 Args.AddLastArg(CmdArgs, options::OPT_e);
4394 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4395 Args.AddAllArgs(CmdArgs, options::OPT_r);
4396
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004397 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4398 // members of static archive libraries which implement Objective-C classes or
4399 // categories.
4400 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4401 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004402
Daniel Dunbarc1964212009-03-26 16:23:12 +00004403 CmdArgs.push_back("-o");
4404 CmdArgs.push_back(Output.getFilename());
4405
Chad Rosier06fd3c62012-05-16 23:45:12 +00004406 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004407 !Args.hasArg(options::OPT_nostartfiles)) {
4408 // Derived from startfile spec.
4409 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004410 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004411 if (getDarwinToolChain().isTargetIOSSimulator()) {
4412 // The simulator doesn't have a versioned crt1 file.
4413 CmdArgs.push_back("-ldylib1.o");
4414 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004415 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4416 CmdArgs.push_back("-ldylib1.o");
4417 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004418 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004419 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004420 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004421 CmdArgs.push_back("-ldylib1.10.5.o");
4422 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004423 } else {
4424 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004425 if (!Args.hasArg(options::OPT_static)) {
4426 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004427 if (getDarwinToolChain().isTargetIOSSimulator()) {
4428 // The simulator doesn't have a versioned crt1 file.
4429 CmdArgs.push_back("-lbundle1.o");
4430 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004431 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4432 CmdArgs.push_back("-lbundle1.o");
4433 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004434 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004435 CmdArgs.push_back("-lbundle1.o");
4436 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004437 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004438 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004439 if (Args.hasArg(options::OPT_pg) &&
4440 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004441 if (Args.hasArg(options::OPT_static) ||
4442 Args.hasArg(options::OPT_object) ||
4443 Args.hasArg(options::OPT_preload)) {
4444 CmdArgs.push_back("-lgcrt0.o");
4445 } else {
4446 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004447
Daniel Dunbarc1964212009-03-26 16:23:12 +00004448 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004449 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004450 // By default on OS X 10.8 and later, we don't link with a crt1.o
4451 // file and the linker knows to use _main as the entry point. But,
4452 // when compiling with -pg, we need to link with the gcrt1.o file,
4453 // so pass the -no_new_main option to tell the linker to use the
4454 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004455 if (getDarwinToolChain().isTargetMacOS() &&
4456 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4457 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004458 } else {
4459 if (Args.hasArg(options::OPT_static) ||
4460 Args.hasArg(options::OPT_object) ||
4461 Args.hasArg(options::OPT_preload)) {
4462 CmdArgs.push_back("-lcrt0.o");
4463 } else {
4464 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004465 if (getDarwinToolChain().isTargetIOSSimulator()) {
4466 // The simulator doesn't have a versioned crt1 file.
4467 CmdArgs.push_back("-lcrt1.o");
4468 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004469 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4470 CmdArgs.push_back("-lcrt1.o");
4471 else
4472 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004473 } else {
4474 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4475 CmdArgs.push_back("-lcrt1.o");
4476 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4477 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004478 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004479 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004480
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004481 // darwin_crt2 spec is empty.
4482 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004483 }
4484 }
4485 }
4486 }
4487
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004488 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4489 Args.hasArg(options::OPT_shared_libgcc) &&
4490 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004491 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004492 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004493 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004494 }
4495 }
4496
4497 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004498
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004499 // If we're building a dynamic lib with -faddress-sanitizer, unresolved
4500 // symbols may appear. Mark all of them as dynamic_lookup.
4501 // Linking executables is handled in lib/Driver/ToolChains.cpp.
4502 if (Args.hasFlag(options::OPT_faddress_sanitizer,
4503 options::OPT_fno_address_sanitizer, false)) {
4504 if (Args.hasArg(options::OPT_dynamiclib) ||
4505 Args.hasArg(options::OPT_bundle)) {
4506 CmdArgs.push_back("-undefined");
4507 CmdArgs.push_back("dynamic_lookup");
4508 }
4509 }
4510
Daniel Dunbarc1964212009-03-26 16:23:12 +00004511 if (Args.hasArg(options::OPT_fopenmp))
4512 // This is more complicated in gcc...
4513 CmdArgs.push_back("-lgomp");
4514
Douglas Gregor9295df02012-05-15 21:00:27 +00004515 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4516
Bob Wilson16d93952012-05-15 18:57:39 +00004517 if (isObjCRuntimeLinked(Args) &&
4518 !Args.hasArg(options::OPT_nostdlib) &&
4519 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004520 // Avoid linking compatibility stubs on i386 mac.
4521 if (!getDarwinToolChain().isTargetMacOS() ||
4522 getDarwinToolChain().getArchName() != "i386") {
4523 // If we don't have ARC or subscripting runtime support, link in the
4524 // runtime stubs. We have to do this *before* adding any of the normal
4525 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004526 ObjCRuntime runtime =
4527 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004528 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004529 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004530 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004531 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004532 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004533 CmdArgs.push_back("-framework");
4534 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004535 // Link libobj.
4536 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004537 }
John McCall31168b02011-06-15 23:02:42 +00004538
Daniel Dunbarc1964212009-03-26 16:23:12 +00004539 if (LinkingOutput) {
4540 CmdArgs.push_back("-arch_multiple");
4541 CmdArgs.push_back("-final_output");
4542 CmdArgs.push_back(LinkingOutput);
4543 }
4544
Daniel Dunbarc1964212009-03-26 16:23:12 +00004545 if (Args.hasArg(options::OPT_fnested_functions))
4546 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004547
Daniel Dunbarc1964212009-03-26 16:23:12 +00004548 if (!Args.hasArg(options::OPT_nostdlib) &&
4549 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004550 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004551 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004552
Daniel Dunbarc1964212009-03-26 16:23:12 +00004553 // link_ssp spec is empty.
4554
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004555 // Let the tool chain choose which runtime library to link.
4556 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004557 }
4558
Chad Rosier06fd3c62012-05-16 23:45:12 +00004559 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004560 !Args.hasArg(options::OPT_nostartfiles)) {
4561 // endfile_spec is empty.
4562 }
4563
4564 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4565 Args.AddAllArgs(CmdArgs, options::OPT_F);
4566
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004567 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004568 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004569 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004570}
4571
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004572void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004573 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004574 const InputInfoList &Inputs,
4575 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004576 const char *LinkingOutput) const {
4577 ArgStringList CmdArgs;
4578
4579 CmdArgs.push_back("-create");
4580 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004581
4582 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004583 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004584
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004585 for (InputInfoList::const_iterator
4586 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4587 const InputInfo &II = *it;
4588 assert(II.isFilename() && "Unexpected lipo input.");
4589 CmdArgs.push_back(II.getFilename());
4590 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004591 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004592 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004593 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004594}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004595
Daniel Dunbar88299622010-06-04 18:28:36 +00004596void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004597 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004598 const InputInfoList &Inputs,
4599 const ArgList &Args,
4600 const char *LinkingOutput) const {
4601 ArgStringList CmdArgs;
4602
Daniel Dunbareb86b042011-05-09 17:23:16 +00004603 CmdArgs.push_back("-o");
4604 CmdArgs.push_back(Output.getFilename());
4605
Daniel Dunbar88299622010-06-04 18:28:36 +00004606 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4607 const InputInfo &Input = Inputs[0];
4608 assert(Input.isFilename() && "Unexpected dsymutil input.");
4609 CmdArgs.push_back(Input.getFilename());
4610
Daniel Dunbar88299622010-06-04 18:28:36 +00004611 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004612 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004613 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004614}
4615
Eric Christopher551ef452011-08-23 17:56:55 +00004616void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4617 const InputInfo &Output,
4618 const InputInfoList &Inputs,
4619 const ArgList &Args,
4620 const char *LinkingOutput) const {
4621 ArgStringList CmdArgs;
4622 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004623 CmdArgs.push_back("--debug-info");
4624 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004625 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004626
4627 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4628 const InputInfo &Input = Inputs[0];
4629 assert(Input.isFilename() && "Unexpected verify input");
4630
4631 // Grabbing the output of the earlier dsymutil run.
4632 CmdArgs.push_back(Input.getFilename());
4633
4634 const char *Exec =
4635 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4636 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4637}
4638
David Chisnallf571cde2012-02-15 13:39:01 +00004639void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4640 const InputInfo &Output,
4641 const InputInfoList &Inputs,
4642 const ArgList &Args,
4643 const char *LinkingOutput) const {
4644 ArgStringList CmdArgs;
4645
4646 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4647 options::OPT_Xassembler);
4648
4649 CmdArgs.push_back("-o");
4650 CmdArgs.push_back(Output.getFilename());
4651
4652 for (InputInfoList::const_iterator
4653 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4654 const InputInfo &II = *it;
4655 CmdArgs.push_back(II.getFilename());
4656 }
4657
4658 const char *Exec =
4659 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4660 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4661}
4662
4663
4664void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4665 const InputInfo &Output,
4666 const InputInfoList &Inputs,
4667 const ArgList &Args,
4668 const char *LinkingOutput) const {
4669 // FIXME: Find a real GCC, don't hard-code versions here
4670 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4671 const llvm::Triple &T = getToolChain().getTriple();
4672 std::string LibPath = "/usr/lib/";
4673 llvm::Triple::ArchType Arch = T.getArch();
4674 switch (Arch) {
4675 case llvm::Triple::x86:
4676 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4677 T.getOSName()).str() + "/4.5.2/";
4678 break;
4679 case llvm::Triple::x86_64:
4680 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4681 T.getOSName()).str();
4682 GCCLibPath += "/4.5.2/amd64/";
4683 LibPath += "amd64/";
4684 break;
4685 default:
4686 assert(0 && "Unsupported architecture");
4687 }
4688
4689 ArgStringList CmdArgs;
4690
David Chisnall272a0712012-02-29 15:06:12 +00004691 // Demangle C++ names in errors
4692 CmdArgs.push_back("-C");
4693
David Chisnallf571cde2012-02-15 13:39:01 +00004694 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4695 (!Args.hasArg(options::OPT_shared))) {
4696 CmdArgs.push_back("-e");
4697 CmdArgs.push_back("_start");
4698 }
4699
4700 if (Args.hasArg(options::OPT_static)) {
4701 CmdArgs.push_back("-Bstatic");
4702 CmdArgs.push_back("-dn");
4703 } else {
4704 CmdArgs.push_back("-Bdynamic");
4705 if (Args.hasArg(options::OPT_shared)) {
4706 CmdArgs.push_back("-shared");
4707 } else {
4708 CmdArgs.push_back("--dynamic-linker");
4709 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4710 }
4711 }
4712
4713 if (Output.isFilename()) {
4714 CmdArgs.push_back("-o");
4715 CmdArgs.push_back(Output.getFilename());
4716 } else {
4717 assert(Output.isNothing() && "Invalid output.");
4718 }
4719
4720 if (!Args.hasArg(options::OPT_nostdlib) &&
4721 !Args.hasArg(options::OPT_nostartfiles)) {
4722 if (!Args.hasArg(options::OPT_shared)) {
4723 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4724 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004725 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004726 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4727 } else {
4728 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004729 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4730 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004731 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004732 if (getToolChain().getDriver().CCCIsCXX)
4733 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004734 }
4735
4736 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4737
4738 Args.AddAllArgs(CmdArgs, options::OPT_L);
4739 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4740 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004741 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00004742
4743 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4744
4745 if (!Args.hasArg(options::OPT_nostdlib) &&
4746 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00004747 if (getToolChain().getDriver().CCCIsCXX)
4748 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00004749 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004750 if (!Args.hasArg(options::OPT_shared)) {
4751 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00004752 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00004753 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004754 }
David Chisnallf571cde2012-02-15 13:39:01 +00004755 }
4756
4757 if (!Args.hasArg(options::OPT_nostdlib) &&
4758 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00004759 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004760 }
David Chisnall96de9932012-02-16 16:00:47 +00004761 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004762
4763 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4764
4765 const char *Exec =
4766 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4767 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4768}
4769
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004770void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004771 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004772 const InputInfoList &Inputs,
4773 const ArgList &Args,
4774 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004775 ArgStringList CmdArgs;
4776
4777 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4778 options::OPT_Xassembler);
4779
4780 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004781 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004782
4783 for (InputInfoList::const_iterator
4784 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4785 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004786 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004787 }
4788
4789 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004790 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004791 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004792}
4793
4794void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004795 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004796 const InputInfoList &Inputs,
4797 const ArgList &Args,
4798 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004799 ArgStringList CmdArgs;
4800
4801 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004802 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004803 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004804 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004805 }
4806
4807 if (Args.hasArg(options::OPT_static)) {
4808 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004809 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004810 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004811// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004812 CmdArgs.push_back("-Bdynamic");
4813 if (Args.hasArg(options::OPT_shared)) {
4814 CmdArgs.push_back("-shared");
4815 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00004816 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004817 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4818 }
4819 }
4820
Daniel Dunbarb440f562010-08-02 02:38:21 +00004821 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004822 CmdArgs.push_back("-o");
4823 CmdArgs.push_back(Output.getFilename());
4824 } else {
4825 assert(Output.isNothing() && "Invalid output.");
4826 }
4827
4828 if (!Args.hasArg(options::OPT_nostdlib) &&
4829 !Args.hasArg(options::OPT_nostartfiles)) {
4830 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004831 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004832 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004833 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004834 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004835 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004836 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004837 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004838 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004839 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004840 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00004841 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004842 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004843 }
4844
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004845 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4846 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004847 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004848
4849 Args.AddAllArgs(CmdArgs, options::OPT_L);
4850 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4851 Args.AddAllArgs(CmdArgs, options::OPT_e);
4852
Daniel Dunbar54423b22010-09-17 00:24:54 +00004853 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004854
4855 if (!Args.hasArg(options::OPT_nostdlib) &&
4856 !Args.hasArg(options::OPT_nodefaultlibs)) {
4857 // FIXME: For some reason GCC passes -lgcc before adding
4858 // the default system libraries. Just mimic this for now.
4859 CmdArgs.push_back("-lgcc");
4860
4861 if (Args.hasArg(options::OPT_pthread))
4862 CmdArgs.push_back("-pthread");
4863 if (!Args.hasArg(options::OPT_shared))
4864 CmdArgs.push_back("-lc");
4865 CmdArgs.push_back("-lgcc");
4866 }
4867
4868 if (!Args.hasArg(options::OPT_nostdlib) &&
4869 !Args.hasArg(options::OPT_nostartfiles)) {
4870 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004871 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004872 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004873 }
4874
Bill Wendling08760582011-06-27 19:15:03 +00004875 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00004876
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004877 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004878 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004879 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004880}
4881
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004882void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004883 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004884 const InputInfoList &Inputs,
4885 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00004886 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004887 ArgStringList CmdArgs;
4888
4889 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4890 options::OPT_Xassembler);
4891
4892 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004893 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004894
4895 for (InputInfoList::const_iterator
4896 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4897 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004898 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004899 }
4900
4901 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004902 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004903 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004904}
4905
4906void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004907 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004908 const InputInfoList &Inputs,
4909 const ArgList &Args,
4910 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004911 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004912 ArgStringList CmdArgs;
4913
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004914 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004915 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004916 CmdArgs.push_back("-e");
4917 CmdArgs.push_back("__start");
4918 }
4919
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004920 if (Args.hasArg(options::OPT_static)) {
4921 CmdArgs.push_back("-Bstatic");
4922 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00004923 if (Args.hasArg(options::OPT_rdynamic))
4924 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004925 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004926 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004927 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004928 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004929 } else {
4930 CmdArgs.push_back("-dynamic-linker");
4931 CmdArgs.push_back("/usr/libexec/ld.so");
4932 }
4933 }
4934
Daniel Dunbarb440f562010-08-02 02:38:21 +00004935 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004936 CmdArgs.push_back("-o");
4937 CmdArgs.push_back(Output.getFilename());
4938 } else {
4939 assert(Output.isNothing() && "Invalid output.");
4940 }
4941
4942 if (!Args.hasArg(options::OPT_nostdlib) &&
4943 !Args.hasArg(options::OPT_nostartfiles)) {
4944 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00004945 if (Args.hasArg(options::OPT_pg))
4946 CmdArgs.push_back(Args.MakeArgString(
4947 getToolChain().GetFilePath("gcrt0.o")));
4948 else
4949 CmdArgs.push_back(Args.MakeArgString(
4950 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004951 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004952 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004953 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004954 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004955 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004956 }
4957 }
4958
Edward O'Callaghan5c521462009-10-28 15:13:08 +00004959 std::string Triple = getToolChain().getTripleString();
4960 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004961 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004962 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004963 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004964
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004965 Args.AddAllArgs(CmdArgs, options::OPT_L);
4966 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4967 Args.AddAllArgs(CmdArgs, options::OPT_e);
4968
Daniel Dunbar54423b22010-09-17 00:24:54 +00004969 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004970
4971 if (!Args.hasArg(options::OPT_nostdlib) &&
4972 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004973 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004974 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00004975 if (Args.hasArg(options::OPT_pg))
4976 CmdArgs.push_back("-lm_p");
4977 else
4978 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004979 }
4980
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004981 // FIXME: For some reason GCC passes -lgcc before adding
4982 // the default system libraries. Just mimic this for now.
4983 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004984
Eric Christopher17674ec2012-09-13 06:32:34 +00004985 if (Args.hasArg(options::OPT_pthread)) {
4986 if (!Args.hasArg(options::OPT_shared) &&
4987 Args.hasArg(options::OPT_pg))
4988 CmdArgs.push_back("-lpthread_p");
4989 else
4990 CmdArgs.push_back("-lpthread");
4991 }
4992
Chandler Carruth45661652011-12-17 22:32:42 +00004993 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00004994 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00004995 CmdArgs.push_back("-lc_p");
4996 else
4997 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00004998 }
Eric Christopher17674ec2012-09-13 06:32:34 +00004999
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005000 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005001 }
5002
5003 if (!Args.hasArg(options::OPT_nostdlib) &&
5004 !Args.hasArg(options::OPT_nostartfiles)) {
5005 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005006 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005007 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005008 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005009 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005010 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005011 }
5012
5013 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005014 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005015 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005016}
Ed Schoutene33194b2009-04-02 19:13:12 +00005017
Eli Friedman9fa28852012-08-08 23:57:20 +00005018void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5019 const InputInfo &Output,
5020 const InputInfoList &Inputs,
5021 const ArgList &Args,
5022 const char *LinkingOutput) const {
5023 ArgStringList CmdArgs;
5024
5025 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5026 options::OPT_Xassembler);
5027
5028 CmdArgs.push_back("-o");
5029 CmdArgs.push_back(Output.getFilename());
5030
5031 for (InputInfoList::const_iterator
5032 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5033 const InputInfo &II = *it;
5034 CmdArgs.push_back(II.getFilename());
5035 }
5036
5037 const char *Exec =
5038 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5039 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5040}
5041
5042void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5043 const InputInfo &Output,
5044 const InputInfoList &Inputs,
5045 const ArgList &Args,
5046 const char *LinkingOutput) const {
5047 const Driver &D = getToolChain().getDriver();
5048 ArgStringList CmdArgs;
5049
5050 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5051 (!Args.hasArg(options::OPT_shared))) {
5052 CmdArgs.push_back("-e");
5053 CmdArgs.push_back("__start");
5054 }
5055
5056 if (Args.hasArg(options::OPT_static)) {
5057 CmdArgs.push_back("-Bstatic");
5058 } else {
5059 if (Args.hasArg(options::OPT_rdynamic))
5060 CmdArgs.push_back("-export-dynamic");
5061 CmdArgs.push_back("--eh-frame-hdr");
5062 CmdArgs.push_back("-Bdynamic");
5063 if (Args.hasArg(options::OPT_shared)) {
5064 CmdArgs.push_back("-shared");
5065 } else {
5066 CmdArgs.push_back("-dynamic-linker");
5067 CmdArgs.push_back("/usr/libexec/ld.so");
5068 }
5069 }
5070
5071 if (Output.isFilename()) {
5072 CmdArgs.push_back("-o");
5073 CmdArgs.push_back(Output.getFilename());
5074 } else {
5075 assert(Output.isNothing() && "Invalid output.");
5076 }
5077
5078 if (!Args.hasArg(options::OPT_nostdlib) &&
5079 !Args.hasArg(options::OPT_nostartfiles)) {
5080 if (!Args.hasArg(options::OPT_shared)) {
5081 if (Args.hasArg(options::OPT_pg))
5082 CmdArgs.push_back(Args.MakeArgString(
5083 getToolChain().GetFilePath("gcrt0.o")));
5084 else
5085 CmdArgs.push_back(Args.MakeArgString(
5086 getToolChain().GetFilePath("crt0.o")));
5087 CmdArgs.push_back(Args.MakeArgString(
5088 getToolChain().GetFilePath("crtbegin.o")));
5089 } else {
5090 CmdArgs.push_back(Args.MakeArgString(
5091 getToolChain().GetFilePath("crtbeginS.o")));
5092 }
5093 }
5094
5095 Args.AddAllArgs(CmdArgs, options::OPT_L);
5096 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5097 Args.AddAllArgs(CmdArgs, options::OPT_e);
5098
5099 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5100
5101 if (!Args.hasArg(options::OPT_nostdlib) &&
5102 !Args.hasArg(options::OPT_nodefaultlibs)) {
5103 if (D.CCCIsCXX) {
5104 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5105 if (Args.hasArg(options::OPT_pg))
5106 CmdArgs.push_back("-lm_p");
5107 else
5108 CmdArgs.push_back("-lm");
5109 }
5110
5111 if (Args.hasArg(options::OPT_pthread))
5112 CmdArgs.push_back("-lpthread");
5113 if (!Args.hasArg(options::OPT_shared)) {
5114 if (Args.hasArg(options::OPT_pg))
5115 CmdArgs.push_back("-lc_p");
5116 else
5117 CmdArgs.push_back("-lc");
5118 }
5119
5120 std::string myarch = "-lclang_rt.";
5121 const llvm::Triple &T = getToolChain().getTriple();
5122 llvm::Triple::ArchType Arch = T.getArch();
5123 switch (Arch) {
5124 case llvm::Triple::arm:
5125 myarch += ("arm");
5126 break;
5127 case llvm::Triple::x86:
5128 myarch += ("i386");
5129 break;
5130 case llvm::Triple::x86_64:
5131 myarch += ("amd64");
5132 break;
5133 default:
5134 assert(0 && "Unsupported architecture");
5135 }
5136 CmdArgs.push_back(Args.MakeArgString(myarch));
5137 }
5138
5139 if (!Args.hasArg(options::OPT_nostdlib) &&
5140 !Args.hasArg(options::OPT_nostartfiles)) {
5141 if (!Args.hasArg(options::OPT_shared))
5142 CmdArgs.push_back(Args.MakeArgString(
5143 getToolChain().GetFilePath("crtend.o")));
5144 else
5145 CmdArgs.push_back(Args.MakeArgString(
5146 getToolChain().GetFilePath("crtendS.o")));
5147 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005148
5149 const char *Exec =
5150 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5151 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005152}
5153
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005154void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005155 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005156 const InputInfoList &Inputs,
5157 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005158 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005159 ArgStringList CmdArgs;
5160
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005161 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5162 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005163 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005164 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005165 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005166 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005167 else if (getToolChain().getArch() == llvm::Triple::mips ||
5168 getToolChain().getArch() == llvm::Triple::mipsel ||
5169 getToolChain().getArch() == llvm::Triple::mips64 ||
5170 getToolChain().getArch() == llvm::Triple::mips64el) {
5171 StringRef CPUName;
5172 StringRef ABIName;
5173 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005174
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005175 CmdArgs.push_back("-march");
5176 CmdArgs.push_back(CPUName.data());
5177
5178 // Convert ABI name to the GNU tools acceptable variant.
5179 if (ABIName == "o32")
5180 ABIName = "32";
5181 else if (ABIName == "n64")
5182 ABIName = "64";
5183
5184 CmdArgs.push_back("-mabi");
5185 CmdArgs.push_back(ABIName.data());
5186
5187 if (getToolChain().getArch() == llvm::Triple::mips ||
5188 getToolChain().getArch() == llvm::Triple::mips64)
5189 CmdArgs.push_back("-EB");
5190 else
5191 CmdArgs.push_back("-EL");
5192
5193 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5194 options::OPT_fpic, options::OPT_fno_pic,
5195 options::OPT_fPIE, options::OPT_fno_PIE,
5196 options::OPT_fpie, options::OPT_fno_pie);
5197 if (LastPICArg &&
5198 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5199 LastPICArg->getOption().matches(options::OPT_fpic) ||
5200 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5201 LastPICArg->getOption().matches(options::OPT_fpie))) {
5202 CmdArgs.push_back("-KPIC");
5203 }
5204 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005205
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005206 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5207 options::OPT_Xassembler);
5208
5209 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005210 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005211
5212 for (InputInfoList::const_iterator
5213 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5214 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005215 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005216 }
5217
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005218 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005219 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005220 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005221}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005222
5223void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005224 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005225 const InputInfoList &Inputs,
5226 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005227 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005228 const toolchains::FreeBSD& ToolChain =
5229 static_cast<const toolchains::FreeBSD&>(getToolChain());
5230 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005231 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005232
5233 // Silence warning for "clang -g foo.o -o foo"
5234 Args.ClaimAllArgs(options::OPT_g_Group);
5235 // and "clang -emit-llvm foo.o -o foo"
5236 Args.ClaimAllArgs(options::OPT_emit_llvm);
5237 // and for "clang -w foo.o -o foo". Other warning options are already
5238 // handled somewhere else.
5239 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005240
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005241 if (!D.SysRoot.empty())
5242 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5243
Roman Divackyafe2f232012-08-28 15:09:03 +00005244 if (Args.hasArg(options::OPT_pie))
5245 CmdArgs.push_back("-pie");
5246
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005247 if (Args.hasArg(options::OPT_static)) {
5248 CmdArgs.push_back("-Bstatic");
5249 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005250 if (Args.hasArg(options::OPT_rdynamic))
5251 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005252 CmdArgs.push_back("--eh-frame-hdr");
5253 if (Args.hasArg(options::OPT_shared)) {
5254 CmdArgs.push_back("-Bshareable");
5255 } else {
5256 CmdArgs.push_back("-dynamic-linker");
5257 CmdArgs.push_back("/libexec/ld-elf.so.1");
5258 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005259 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5260 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005261 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5262 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5263 CmdArgs.push_back("--hash-style=both");
5264 }
5265 }
5266 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005267 }
5268
5269 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5270 // instruct ld in the base system to link 32-bit code.
Roman Divackyafe2f232012-08-28 15:09:03 +00005271 if (ToolChain.getArchName() == "i386") {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005272 CmdArgs.push_back("-m");
5273 CmdArgs.push_back("elf_i386_fbsd");
5274 }
5275
Roman Divackyafe2f232012-08-28 15:09:03 +00005276 if (ToolChain.getArchName() == "powerpc") {
Roman Divacky5e300b82011-06-04 07:40:24 +00005277 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005278 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005279 }
5280
Daniel Dunbarb440f562010-08-02 02:38:21 +00005281 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005282 CmdArgs.push_back("-o");
5283 CmdArgs.push_back(Output.getFilename());
5284 } else {
5285 assert(Output.isNothing() && "Invalid output.");
5286 }
5287
5288 if (!Args.hasArg(options::OPT_nostdlib) &&
5289 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005290 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005291 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005292 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005293 crt1 = "gcrt1.o";
5294 else if (Args.hasArg(options::OPT_pie))
5295 crt1 = "Scrt1.o";
5296 else
5297 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005298 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005299 if (crt1)
5300 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5301
5302 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5303
5304 const char *crtbegin = NULL;
5305 if (Args.hasArg(options::OPT_static))
5306 crtbegin = "crtbeginT.o";
5307 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5308 crtbegin = "crtbeginS.o";
5309 else
5310 crtbegin = "crtbegin.o";
5311
5312 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005313 }
5314
5315 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005316 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005317 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5318 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005319 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005320 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5321 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005322 Args.AddAllArgs(CmdArgs, options::OPT_s);
5323 Args.AddAllArgs(CmdArgs, options::OPT_t);
5324 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5325 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005326
Roman Divackyafe2f232012-08-28 15:09:03 +00005327 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005328
5329 if (!Args.hasArg(options::OPT_nostdlib) &&
5330 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005331 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005332 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005333 if (Args.hasArg(options::OPT_pg))
5334 CmdArgs.push_back("-lm_p");
5335 else
5336 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005337 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005338 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5339 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005340 if (Args.hasArg(options::OPT_pg))
5341 CmdArgs.push_back("-lgcc_p");
5342 else
5343 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005344 if (Args.hasArg(options::OPT_static)) {
5345 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005346 } else if (Args.hasArg(options::OPT_pg)) {
5347 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005348 } else {
5349 CmdArgs.push_back("--as-needed");
5350 CmdArgs.push_back("-lgcc_s");
5351 CmdArgs.push_back("--no-as-needed");
5352 }
5353
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005354 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005355 if (Args.hasArg(options::OPT_pg))
5356 CmdArgs.push_back("-lpthread_p");
5357 else
5358 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005359 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005360
Roman Divacky66f22762011-02-10 16:59:40 +00005361 if (Args.hasArg(options::OPT_pg)) {
5362 if (Args.hasArg(options::OPT_shared))
5363 CmdArgs.push_back("-lc");
5364 else
5365 CmdArgs.push_back("-lc_p");
5366 CmdArgs.push_back("-lgcc_p");
5367 } else {
5368 CmdArgs.push_back("-lc");
5369 CmdArgs.push_back("-lgcc");
5370 }
5371
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005372 if (Args.hasArg(options::OPT_static)) {
5373 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005374 } else if (Args.hasArg(options::OPT_pg)) {
5375 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005376 } else {
5377 CmdArgs.push_back("--as-needed");
5378 CmdArgs.push_back("-lgcc_s");
5379 CmdArgs.push_back("--no-as-needed");
5380 }
5381 }
5382
5383 if (!Args.hasArg(options::OPT_nostdlib) &&
5384 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005385 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005386 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005387 else
5388 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005389 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005390 }
5391
Roman Divackyafe2f232012-08-28 15:09:03 +00005392 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005393
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005394 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005395 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005396 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005397}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005398
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005399void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5400 const InputInfo &Output,
5401 const InputInfoList &Inputs,
5402 const ArgList &Args,
5403 const char *LinkingOutput) const {
5404 ArgStringList CmdArgs;
5405
5406 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5407 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005408 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005409 CmdArgs.push_back("--32");
5410
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005411 // Set byte order explicitly
5412 if (getToolChain().getArchName() == "mips")
5413 CmdArgs.push_back("-EB");
5414 else if (getToolChain().getArchName() == "mipsel")
5415 CmdArgs.push_back("-EL");
5416
5417 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5418 options::OPT_Xassembler);
5419
5420 CmdArgs.push_back("-o");
5421 CmdArgs.push_back(Output.getFilename());
5422
5423 for (InputInfoList::const_iterator
5424 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5425 const InputInfo &II = *it;
5426 CmdArgs.push_back(II.getFilename());
5427 }
5428
David Chisnallddbd68f2011-09-27 22:03:18 +00005429 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005430 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5431}
5432
5433void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5434 const InputInfo &Output,
5435 const InputInfoList &Inputs,
5436 const ArgList &Args,
5437 const char *LinkingOutput) const {
5438 const Driver &D = getToolChain().getDriver();
5439 ArgStringList CmdArgs;
5440
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005441 if (!D.SysRoot.empty())
5442 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5443
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005444 if (Args.hasArg(options::OPT_static)) {
5445 CmdArgs.push_back("-Bstatic");
5446 } else {
5447 if (Args.hasArg(options::OPT_rdynamic))
5448 CmdArgs.push_back("-export-dynamic");
5449 CmdArgs.push_back("--eh-frame-hdr");
5450 if (Args.hasArg(options::OPT_shared)) {
5451 CmdArgs.push_back("-Bshareable");
5452 } else {
5453 CmdArgs.push_back("-dynamic-linker");
5454 CmdArgs.push_back("/libexec/ld.elf_so");
5455 }
5456 }
5457
5458 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5459 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005460 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005461 CmdArgs.push_back("-m");
5462 CmdArgs.push_back("elf_i386");
5463 }
5464
5465 if (Output.isFilename()) {
5466 CmdArgs.push_back("-o");
5467 CmdArgs.push_back(Output.getFilename());
5468 } else {
5469 assert(Output.isNothing() && "Invalid output.");
5470 }
5471
5472 if (!Args.hasArg(options::OPT_nostdlib) &&
5473 !Args.hasArg(options::OPT_nostartfiles)) {
5474 if (!Args.hasArg(options::OPT_shared)) {
5475 CmdArgs.push_back(Args.MakeArgString(
5476 getToolChain().GetFilePath("crt0.o")));
5477 CmdArgs.push_back(Args.MakeArgString(
5478 getToolChain().GetFilePath("crti.o")));
5479 CmdArgs.push_back(Args.MakeArgString(
5480 getToolChain().GetFilePath("crtbegin.o")));
5481 } else {
5482 CmdArgs.push_back(Args.MakeArgString(
5483 getToolChain().GetFilePath("crti.o")));
5484 CmdArgs.push_back(Args.MakeArgString(
5485 getToolChain().GetFilePath("crtbeginS.o")));
5486 }
5487 }
5488
5489 Args.AddAllArgs(CmdArgs, options::OPT_L);
5490 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5491 Args.AddAllArgs(CmdArgs, options::OPT_e);
5492 Args.AddAllArgs(CmdArgs, options::OPT_s);
5493 Args.AddAllArgs(CmdArgs, options::OPT_t);
5494 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5495 Args.AddAllArgs(CmdArgs, options::OPT_r);
5496
5497 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5498
5499 if (!Args.hasArg(options::OPT_nostdlib) &&
5500 !Args.hasArg(options::OPT_nodefaultlibs)) {
5501 if (D.CCCIsCXX) {
5502 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5503 CmdArgs.push_back("-lm");
5504 }
5505 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5506 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005507 if (Args.hasArg(options::OPT_static)) {
5508 CmdArgs.push_back("-lgcc_eh");
5509 } else {
5510 CmdArgs.push_back("--as-needed");
5511 CmdArgs.push_back("-lgcc_s");
5512 CmdArgs.push_back("--no-as-needed");
5513 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005514 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005515
5516 if (Args.hasArg(options::OPT_pthread))
5517 CmdArgs.push_back("-lpthread");
5518 CmdArgs.push_back("-lc");
5519
5520 CmdArgs.push_back("-lgcc");
5521 if (Args.hasArg(options::OPT_static)) {
5522 CmdArgs.push_back("-lgcc_eh");
5523 } else {
5524 CmdArgs.push_back("--as-needed");
5525 CmdArgs.push_back("-lgcc_s");
5526 CmdArgs.push_back("--no-as-needed");
5527 }
5528 }
5529
5530 if (!Args.hasArg(options::OPT_nostdlib) &&
5531 !Args.hasArg(options::OPT_nostartfiles)) {
5532 if (!Args.hasArg(options::OPT_shared))
5533 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5534 "crtend.o")));
5535 else
5536 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5537 "crtendS.o")));
5538 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5539 "crtn.o")));
5540 }
5541
Bill Wendling08760582011-06-27 19:15:03 +00005542 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005543
David Chisnallddbd68f2011-09-27 22:03:18 +00005544 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005545 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5546}
5547
Rafael Espindola92b00932010-08-10 00:25:48 +00005548void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5549 const InputInfo &Output,
5550 const InputInfoList &Inputs,
5551 const ArgList &Args,
5552 const char *LinkingOutput) const {
5553 ArgStringList CmdArgs;
5554
5555 // Add --32/--64 to make sure we get the format we want.
5556 // This is incomplete
5557 if (getToolChain().getArch() == llvm::Triple::x86) {
5558 CmdArgs.push_back("--32");
5559 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5560 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005561 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5562 CmdArgs.push_back("-a32");
5563 CmdArgs.push_back("-mppc");
5564 CmdArgs.push_back("-many");
5565 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5566 CmdArgs.push_back("-a64");
5567 CmdArgs.push_back("-mppc64");
5568 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005569 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005570 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005571 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5572 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005573
5574 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5575 getToolChain().getTriple());
5576 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005577
5578 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5579 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5580 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005581 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5582 getToolChain().getArch() == llvm::Triple::mipsel ||
5583 getToolChain().getArch() == llvm::Triple::mips64 ||
5584 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005585 StringRef CPUName;
5586 StringRef ABIName;
5587 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005588
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005589 CmdArgs.push_back("-march");
5590 CmdArgs.push_back(CPUName.data());
5591
5592 // Convert ABI name to the GNU tools acceptable variant.
5593 if (ABIName == "o32")
5594 ABIName = "32";
5595 else if (ABIName == "n64")
5596 ABIName = "64";
5597
5598 CmdArgs.push_back("-mabi");
5599 CmdArgs.push_back(ABIName.data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005600
5601 if (getToolChain().getArch() == llvm::Triple::mips ||
5602 getToolChain().getArch() == llvm::Triple::mips64)
5603 CmdArgs.push_back("-EB");
5604 else
5605 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005606
5607 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5608 options::OPT_fpic, options::OPT_fno_pic,
5609 options::OPT_fPIE, options::OPT_fno_PIE,
5610 options::OPT_fpie, options::OPT_fno_pie);
5611 if (LastPICArg &&
5612 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5613 LastPICArg->getOption().matches(options::OPT_fpic) ||
5614 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5615 LastPICArg->getOption().matches(options::OPT_fpie))) {
5616 CmdArgs.push_back("-KPIC");
5617 }
Rafael Espindola92b00932010-08-10 00:25:48 +00005618 }
5619
5620 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5621 options::OPT_Xassembler);
5622
5623 CmdArgs.push_back("-o");
5624 CmdArgs.push_back(Output.getFilename());
5625
5626 for (InputInfoList::const_iterator
5627 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5628 const InputInfo &II = *it;
5629 CmdArgs.push_back(II.getFilename());
5630 }
5631
5632 const char *Exec =
5633 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5634 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5635}
5636
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005637static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5638 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00005639 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005640 bool StaticLibgcc = isAndroid || Args.hasArg(options::OPT_static) ||
Rafael Espindolacc354322011-10-17 21:39:04 +00005641 Args.hasArg(options::OPT_static_libgcc);
5642 if (!D.CCCIsCXX)
5643 CmdArgs.push_back("-lgcc");
5644
5645 if (StaticLibgcc) {
5646 if (D.CCCIsCXX)
5647 CmdArgs.push_back("-lgcc");
5648 } else {
5649 if (!D.CCCIsCXX)
5650 CmdArgs.push_back("--as-needed");
5651 CmdArgs.push_back("-lgcc_s");
5652 if (!D.CCCIsCXX)
5653 CmdArgs.push_back("--no-as-needed");
5654 }
5655
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005656 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005657 CmdArgs.push_back("-lgcc_eh");
5658 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5659 CmdArgs.push_back("-lgcc");
5660}
5661
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005662void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5663 const InputInfo &Output,
5664 const InputInfoList &Inputs,
5665 const ArgList &Args,
5666 const char *LinkingOutput) const {
5667 const toolchains::Linux& ToolChain =
5668 static_cast<const toolchains::Linux&>(getToolChain());
5669 const Driver &D = ToolChain.getDriver();
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005670 const bool isAndroid = ToolChain.getTriple().getEnvironment() ==
Logan Chienc6fd8202012-09-02 09:30:11 +00005671 llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005672
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005673 ArgStringList CmdArgs;
5674
Rafael Espindolad1002f62010-11-15 18:28:16 +00005675 // Silence warning for "clang -g foo.o -o foo"
5676 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005677 // and "clang -emit-llvm foo.o -o foo"
5678 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00005679 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005680 // handled somewhere else.
5681 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005682
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005683 if (!D.SysRoot.empty())
5684 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005685
Rafael Espindolad47ac232010-11-17 22:26:15 +00005686 if (Args.hasArg(options::OPT_pie))
5687 CmdArgs.push_back("-pie");
5688
Rafael Espindola1c76c592010-11-07 22:57:16 +00005689 if (Args.hasArg(options::OPT_rdynamic))
5690 CmdArgs.push_back("-export-dynamic");
5691
Rafael Espindola34d77dc2010-11-11 19:34:42 +00005692 if (Args.hasArg(options::OPT_s))
5693 CmdArgs.push_back("-s");
5694
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005695 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5696 e = ToolChain.ExtraOpts.end();
5697 i != e; ++i)
5698 CmdArgs.push_back(i->c_str());
5699
5700 if (!Args.hasArg(options::OPT_static)) {
5701 CmdArgs.push_back("--eh-frame-hdr");
5702 }
5703
5704 CmdArgs.push_back("-m");
5705 if (ToolChain.getArch() == llvm::Triple::x86)
5706 CmdArgs.push_back("elf_i386");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005707 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00005708 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005709 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005710 else if (ToolChain.getArch() == llvm::Triple::ppc)
5711 CmdArgs.push_back("elf32ppclinux");
5712 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5713 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005714 else if (ToolChain.getArch() == llvm::Triple::mips)
5715 CmdArgs.push_back("elf32btsmip");
5716 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5717 CmdArgs.push_back("elf32ltsmip");
5718 else if (ToolChain.getArch() == llvm::Triple::mips64)
5719 CmdArgs.push_back("elf64btsmip");
5720 else if (ToolChain.getArch() == llvm::Triple::mips64el)
5721 CmdArgs.push_back("elf64ltsmip");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005722 else
5723 CmdArgs.push_back("elf_x86_64");
5724
5725 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00005726 if (ToolChain.getArch() == llvm::Triple::arm
5727 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005728 CmdArgs.push_back("-Bstatic");
5729 else
5730 CmdArgs.push_back("-static");
5731 } else if (Args.hasArg(options::OPT_shared)) {
5732 CmdArgs.push_back("-shared");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005733 if ((ToolChain.getArch() == llvm::Triple::arm
5734 || ToolChain.getArch() == llvm::Triple::thumb) && isAndroid) {
5735 CmdArgs.push_back("-Bsymbolic");
5736 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005737 }
5738
5739 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00005740 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005741 (!Args.hasArg(options::OPT_static) &&
5742 !Args.hasArg(options::OPT_shared))) {
5743 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005744 if (isAndroid)
5745 CmdArgs.push_back("/system/bin/linker");
5746 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005747 CmdArgs.push_back("/lib/ld-linux.so.2");
Douglas Gregord9bb1522011-03-06 19:11:49 +00005748 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liueabbf922012-07-30 11:05:56 +00005749 ToolChain.getArch() == llvm::Triple::thumb) {
5750 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5751 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5752 else
5753 CmdArgs.push_back("/lib/ld-linux.so.3");
5754 }
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005755 else if (ToolChain.getArch() == llvm::Triple::mips ||
5756 ToolChain.getArch() == llvm::Triple::mipsel)
5757 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan1e1e2e22012-04-06 20:14:27 +00005758 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
5759 ToolChain.getArch() == llvm::Triple::mips64el)
5760 CmdArgs.push_back("/lib64/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005761 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner20b90d02011-04-11 21:15:37 +00005762 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005763 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner20b90d02011-04-11 21:15:37 +00005764 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005765 else
5766 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5767 }
5768
5769 CmdArgs.push_back("-o");
5770 CmdArgs.push_back(Output.getFilename());
5771
Rafael Espindola81937ec2010-12-01 01:52:43 +00005772 if (!Args.hasArg(options::OPT_nostdlib) &&
5773 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005774 if (!isAndroid) {
5775 const char *crt1 = NULL;
5776 if (!Args.hasArg(options::OPT_shared)){
5777 if (Args.hasArg(options::OPT_pie))
5778 crt1 = "Scrt1.o";
5779 else
5780 crt1 = "crt1.o";
5781 }
5782 if (crt1)
5783 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005784
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005785 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5786 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005787
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005788 const char *crtbegin;
5789 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005790 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005791 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005792 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005793 else if (Args.hasArg(options::OPT_pie))
5794 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005795 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005796 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005797 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
5798 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005799
5800 Args.AddAllArgs(CmdArgs, options::OPT_L);
5801
5802 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5803
Roman Divackyee8188a2011-03-01 17:53:14 +00005804 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5805 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005806 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005807
Rafael Espindola9446d762012-04-09 23:53:34 +00005808 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5809 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5810 // forward.
5811 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5812 CmdArgs.push_back("-plugin");
5813 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5814 CmdArgs.push_back(Args.MakeArgString(Plugin));
5815 }
5816
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00005817 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5818 CmdArgs.push_back("--no-demangle");
5819
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005820 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5821
Chandler Carruth94a32012012-05-14 18:31:18 +00005822 if (D.CCCIsCXX &&
5823 !Args.hasArg(options::OPT_nostdlib) &&
5824 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00005825 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5826 !Args.hasArg(options::OPT_static);
5827 if (OnlyLibstdcxxStatic)
5828 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005829 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00005830 if (OnlyLibstdcxxStatic)
5831 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005832 CmdArgs.push_back("-lm");
5833 }
5834
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005835 // Call this before we add the C run-time.
5836 addAsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00005837 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005838
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005839 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00005840 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5841 if (Args.hasArg(options::OPT_static))
5842 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00005843
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005844 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005845
Chandler Carruth94a32012012-05-14 18:31:18 +00005846 if (Args.hasArg(options::OPT_pthread) ||
5847 Args.hasArg(options::OPT_pthreads))
5848 CmdArgs.push_back("-lpthread");
5849
5850 CmdArgs.push_back("-lc");
5851
5852 if (Args.hasArg(options::OPT_static))
5853 CmdArgs.push_back("--end-group");
5854 else
5855 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5856 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00005857
Rafael Espindola81937ec2010-12-01 01:52:43 +00005858 if (!Args.hasArg(options::OPT_nostartfiles)) {
5859 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005860 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005861 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005862 else if (Args.hasArg(options::OPT_pie))
5863 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00005864 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005865 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005866
Rafael Espindola81937ec2010-12-01 01:52:43 +00005867 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005868 if (!isAndroid)
5869 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00005870 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005871 }
5872
Bill Wendling08760582011-06-27 19:15:03 +00005873 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005874
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005875 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5876}
Rafael Espindola92b00932010-08-10 00:25:48 +00005877
Chris Lattner3e2ee142010-07-07 16:01:42 +00005878void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005879 const InputInfo &Output,
5880 const InputInfoList &Inputs,
5881 const ArgList &Args,
5882 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005883 ArgStringList CmdArgs;
5884
5885 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5886 options::OPT_Xassembler);
5887
5888 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005889 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005890
5891 for (InputInfoList::const_iterator
5892 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5893 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005894 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005895 }
5896
5897 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00005898 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005899 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005900}
5901
5902void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005903 const InputInfo &Output,
5904 const InputInfoList &Inputs,
5905 const ArgList &Args,
5906 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005907 const Driver &D = getToolChain().getDriver();
5908 ArgStringList CmdArgs;
5909
Daniel Dunbarb440f562010-08-02 02:38:21 +00005910 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005911 CmdArgs.push_back("-o");
5912 CmdArgs.push_back(Output.getFilename());
5913 } else {
5914 assert(Output.isNothing() && "Invalid output.");
5915 }
5916
5917 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00005918 !Args.hasArg(options::OPT_nostartfiles)) {
5919 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
5920 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5921 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
5922 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
5923 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005924
5925 Args.AddAllArgs(CmdArgs, options::OPT_L);
5926 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5927 Args.AddAllArgs(CmdArgs, options::OPT_e);
5928
Daniel Dunbar54423b22010-09-17 00:24:54 +00005929 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005930
Eli Friedman83de5132011-12-08 23:54:21 +00005931 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5932
Chris Lattner3e2ee142010-07-07 16:01:42 +00005933 if (!Args.hasArg(options::OPT_nostdlib) &&
5934 !Args.hasArg(options::OPT_nodefaultlibs)) {
5935 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005936 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005937 CmdArgs.push_back("-lm");
5938 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005939 }
5940
5941 if (!Args.hasArg(options::OPT_nostdlib) &&
5942 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00005943 if (Args.hasArg(options::OPT_pthread))
5944 CmdArgs.push_back("-lpthread");
5945 CmdArgs.push_back("-lc");
5946 CmdArgs.push_back("-lCompilerRT-Generic");
5947 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
5948 CmdArgs.push_back(
5949 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005950 }
5951
Eli Friedman83de5132011-12-08 23:54:21 +00005952 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005953 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005954}
5955
Daniel Dunbarcc912342009-05-02 18:28:39 +00005956/// DragonFly Tools
5957
5958// For now, DragonFly Assemble does just about the same as for
5959// FreeBSD, but this may change soon.
5960void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005961 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005962 const InputInfoList &Inputs,
5963 const ArgList &Args,
5964 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005965 ArgStringList CmdArgs;
5966
5967 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5968 // instruct as in the base system to assemble 32-bit code.
5969 if (getToolChain().getArchName() == "i386")
5970 CmdArgs.push_back("--32");
5971
5972 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5973 options::OPT_Xassembler);
5974
5975 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005976 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005977
5978 for (InputInfoList::const_iterator
5979 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5980 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005981 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005982 }
5983
5984 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005985 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005986 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005987}
5988
5989void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005990 const InputInfo &Output,
5991 const InputInfoList &Inputs,
5992 const ArgList &Args,
5993 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005994 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00005995 ArgStringList CmdArgs;
5996
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005997 if (!D.SysRoot.empty())
5998 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5999
Daniel Dunbarcc912342009-05-02 18:28:39 +00006000 if (Args.hasArg(options::OPT_static)) {
6001 CmdArgs.push_back("-Bstatic");
6002 } else {
6003 if (Args.hasArg(options::OPT_shared))
6004 CmdArgs.push_back("-Bshareable");
6005 else {
6006 CmdArgs.push_back("-dynamic-linker");
6007 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6008 }
6009 }
6010
6011 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6012 // instruct ld in the base system to link 32-bit code.
6013 if (getToolChain().getArchName() == "i386") {
6014 CmdArgs.push_back("-m");
6015 CmdArgs.push_back("elf_i386");
6016 }
6017
Daniel Dunbarb440f562010-08-02 02:38:21 +00006018 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006019 CmdArgs.push_back("-o");
6020 CmdArgs.push_back(Output.getFilename());
6021 } else {
6022 assert(Output.isNothing() && "Invalid output.");
6023 }
6024
6025 if (!Args.hasArg(options::OPT_nostdlib) &&
6026 !Args.hasArg(options::OPT_nostartfiles)) {
6027 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006028 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006029 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006030 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006031 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006032 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006033 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006034 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006035 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006036 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006037 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006038 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006039 }
6040 }
6041
6042 Args.AddAllArgs(CmdArgs, options::OPT_L);
6043 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6044 Args.AddAllArgs(CmdArgs, options::OPT_e);
6045
Daniel Dunbar54423b22010-09-17 00:24:54 +00006046 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006047
6048 if (!Args.hasArg(options::OPT_nostdlib) &&
6049 !Args.hasArg(options::OPT_nodefaultlibs)) {
6050 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6051 // rpaths
6052 CmdArgs.push_back("-L/usr/lib/gcc41");
6053
6054 if (!Args.hasArg(options::OPT_static)) {
6055 CmdArgs.push_back("-rpath");
6056 CmdArgs.push_back("/usr/lib/gcc41");
6057
6058 CmdArgs.push_back("-rpath-link");
6059 CmdArgs.push_back("/usr/lib/gcc41");
6060
6061 CmdArgs.push_back("-rpath");
6062 CmdArgs.push_back("/usr/lib");
6063
6064 CmdArgs.push_back("-rpath-link");
6065 CmdArgs.push_back("/usr/lib");
6066 }
6067
Rafael Espindola38360b32010-07-20 12:59:03 +00006068 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006069 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006070 CmdArgs.push_back("-lm");
6071 }
6072
Daniel Dunbarcc912342009-05-02 18:28:39 +00006073 if (Args.hasArg(options::OPT_shared)) {
6074 CmdArgs.push_back("-lgcc_pic");
6075 } else {
6076 CmdArgs.push_back("-lgcc");
6077 }
6078
6079
6080 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006081 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006082
6083 if (!Args.hasArg(options::OPT_nolibc)) {
6084 CmdArgs.push_back("-lc");
6085 }
6086
6087 if (Args.hasArg(options::OPT_shared)) {
6088 CmdArgs.push_back("-lgcc_pic");
6089 } else {
6090 CmdArgs.push_back("-lgcc");
6091 }
6092 }
6093
6094 if (!Args.hasArg(options::OPT_nostdlib) &&
6095 !Args.hasArg(options::OPT_nostartfiles)) {
6096 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006097 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006098 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006099 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006100 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006101 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006102 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006103 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006104 }
6105
Bill Wendling08760582011-06-27 19:15:03 +00006106 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006107
Daniel Dunbarcc912342009-05-02 18:28:39 +00006108 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006109 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006110 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006111}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006112
6113void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6114 const InputInfo &Output,
6115 const InputInfoList &Inputs,
6116 const ArgList &Args,
6117 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006118 ArgStringList CmdArgs;
6119
6120 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006121 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6122 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006123 } else {
6124 assert(Output.isNothing() && "Invalid output.");
6125 }
6126
6127 if (!Args.hasArg(options::OPT_nostdlib) &&
6128 !Args.hasArg(options::OPT_nostartfiles)) {
6129 CmdArgs.push_back("-defaultlib:libcmt");
6130 }
6131
6132 CmdArgs.push_back("-nologo");
6133
Michael J. Spencere2f49362012-06-18 16:56:04 +00006134 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6135
6136 // Add filenames immediately.
6137 for (InputInfoList::const_iterator
6138 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6139 if (it->isFilename())
6140 CmdArgs.push_back(it->getFilename());
6141 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006142
6143 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006144 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006145 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6146}