blob: 63182f8c28da453d82a685cccba3d3530290bd13 [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
11
Daniel Dunbara2aedc62009-03-18 10:01:51 +000012#include "clang/Driver/Action.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000013#include "clang/Driver/Arg.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000014#include "clang/Driver/ArgList.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000015#include "clang/Driver/Driver.h"
16#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000017#include "clang/Driver/Compilation.h"
18#include "clang/Driver/Job.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000019#include "clang/Driver/Option.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000020#include "clang/Driver/Options.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000021#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Util.h"
John McCall5fb5df92012-06-20 06:18:46 +000023#include "clang/Basic/ObjCRuntime.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000024
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000025#include "llvm/ADT/SmallString.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000026#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000027#include "llvm/ADT/Twine.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000028#include "llvm/Support/FileSystem.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000029#include "llvm/Support/Format.h"
30#include "llvm/Support/raw_ostream.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000031#include "llvm/Support/Host.h"
32#include "llvm/Support/Process.h"
John McCall31168b02011-06-15 23:02:42 +000033#include "llvm/Support/ErrorHandling.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000034
35#include "InputInfo.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000036#include "ToolChains.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000037
Daniel Dunbar1a093d22009-03-18 06:00:36 +000038using namespace clang::driver;
39using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000040using namespace clang;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000041
Daniel Dunbar64198ef2009-09-10 01:21:05 +000042/// CheckPreprocessingOptions - Perform some validation of preprocessing
43/// arguments that is shared with gcc.
44static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
45 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
Joerg Sonnenbergerb86f5f42011-03-06 23:31:01 +000046 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP)
Chris Lattner0e62c1c2011-07-23 10:55:15 +000047 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar64198ef2009-09-10 01:21:05 +000048 << A->getAsString(Args) << "-E";
49}
50
Daniel Dunbar4eadb602009-09-10 01:21:12 +000051/// CheckCodeGenerationOptions - Perform some validation of code generation
52/// arguments that is shared with gcc.
53static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
54 // In gcc, only ARM checks this, but it seems reasonable to check universally.
55 if (Args.hasArg(options::OPT_static))
56 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
57 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000058 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000059 << A->getAsString(Args) << "-static";
60}
61
Chris Lattnerbf2803f2010-03-29 17:55:58 +000062// Quote target names for inclusion in GNU Make dependency files.
63// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000064static void QuoteTarget(StringRef Target,
65 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +000066 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
67 switch (Target[i]) {
68 case ' ':
69 case '\t':
70 // Escape the preceding backslashes
71 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
72 Res.push_back('\\');
73
74 // Escape the space/tab
75 Res.push_back('\\');
76 break;
77 case '$':
78 Res.push_back('$');
79 break;
80 case '#':
81 Res.push_back('\\');
82 break;
83 default:
84 break;
85 }
86
87 Res.push_back(Target[i]);
88 }
89}
90
Bill Wendlingc0938f32012-03-12 22:10:06 +000091static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +000092 ArgStringList &CmdArgs,
93 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +000094 const char *EnvVar) {
95 const char *DirList = ::getenv(EnvVar);
Bill Wendling281ca292012-03-12 21:22:35 +000096 if (!DirList)
97 return; // Nothing to do.
98
99 StringRef Dirs(DirList);
100 if (Dirs.empty()) // Empty string should not add '.'.
101 return;
102
103 StringRef::size_type Delim;
104 while ((Delim = Dirs.find(llvm::sys::PathSeparator)) != StringRef::npos) {
105 if (Delim == 0) { // Leading colon.
106 CmdArgs.push_back(ArgName);
107 CmdArgs.push_back(".");
108 } else {
109 CmdArgs.push_back(ArgName);
Nico Weber89355782012-03-19 15:00:03 +0000110 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
Bill Wendling281ca292012-03-12 21:22:35 +0000111 }
Nico Weber89355782012-03-19 15:00:03 +0000112 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000113 }
114
115 if (Dirs.empty()) { // Trailing colon.
116 CmdArgs.push_back(ArgName);
117 CmdArgs.push_back(".");
118 } else { // Add the last path.
119 CmdArgs.push_back(ArgName);
120 CmdArgs.push_back(Args.MakeArgString(Dirs));
121 }
122}
123
Daniel Dunbar54423b22010-09-17 00:24:54 +0000124static void AddLinkerInputs(const ToolChain &TC,
125 const InputInfoList &Inputs, const ArgList &Args,
126 ArgStringList &CmdArgs) {
127 const Driver &D = TC.getDriver();
128
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000129 // Add extra linker input arguments which are not treated as inputs
130 // (constructed via -Xarch_).
131 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
132
Daniel Dunbar54423b22010-09-17 00:24:54 +0000133 for (InputInfoList::const_iterator
134 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
135 const InputInfo &II = *it;
136
137 if (!TC.HasNativeLLVMSupport()) {
138 // Don't try to pass LLVM inputs unless we have native support.
139 if (II.getType() == types::TY_LLVM_IR ||
140 II.getType() == types::TY_LTO_IR ||
141 II.getType() == types::TY_LLVM_BC ||
142 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000143 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000144 << TC.getTripleString();
145 }
146
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000147 // Add filenames immediately.
148 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000149 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000150 continue;
151 }
152
153 // Otherwise, this is a linker input argument.
154 const Arg &A = II.getInputArg();
155
156 // Handle reserved library options.
157 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000158 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Senafeb03b2010-09-17 18:39:08 +0000159 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
160 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000161 } else
162 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar54423b22010-09-17 00:24:54 +0000163 }
Bill Wendling281ca292012-03-12 21:22:35 +0000164
165 // LIBRARY_PATH - included following the user specified library paths.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000166 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000167}
168
John McCall31168b02011-06-15 23:02:42 +0000169/// \brief Determine whether Objective-C automated reference counting is
170/// enabled.
171static bool isObjCAutoRefCount(const ArgList &Args) {
172 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
173}
174
Ted Kremeneke65b0862012-03-06 20:05:56 +0000175/// \brief Determine whether we are linking the ObjC runtime.
176static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000177 if (isObjCAutoRefCount(Args)) {
178 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000179 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000180 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000181 return Args.hasArg(options::OPT_fobjc_link_runtime);
182}
183
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000184static void addProfileRT(const ToolChain &TC, const ArgList &Args,
Bill Wendling08760582011-06-27 19:15:03 +0000185 ArgStringList &CmdArgs,
186 llvm::Triple Triple) {
187 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
188 Args.hasArg(options::OPT_fprofile_generate) ||
189 Args.hasArg(options::OPT_fcreate_profile) ||
190 Args.hasArg(options::OPT_coverage)))
191 return;
192
193 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
194 // the link line. We cannot do the same thing because unlike gcov there is a
195 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
196 // not supported by old linkers.
Benjamin Kramerf5fbe432011-11-07 16:02:25 +0000197 std::string ProfileRT =
198 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
Bill Wendling08760582011-06-27 19:15:03 +0000199
Bill Wendling08760582011-06-27 19:15:03 +0000200 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000201}
202
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000203void Clang::AddPreprocessingOptions(Compilation &C,
204 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000205 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000206 ArgStringList &CmdArgs,
207 const InputInfo &Output,
208 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000209 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000210
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000211 CheckPreprocessingOptions(D, Args);
212
213 Args.AddLastArg(CmdArgs, options::OPT_C);
214 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000215
216 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000217 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000218 (A = Args.getLastArg(options::OPT_MD)) ||
219 (A = Args.getLastArg(options::OPT_MMD))) {
220 // Determine the output location.
221 const char *DepFile;
222 if (Output.getType() == types::TY_Dependencies) {
Daniel Dunbarb440f562010-08-02 02:38:21 +0000223 DepFile = Output.getFilename();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000224 } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
225 DepFile = MF->getValue(Args);
Peter Collingbourne119cfaa2011-11-21 00:01:05 +0000226 C.addFailureResultFile(DepFile);
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000227 } else if (A->getOption().matches(options::OPT_M) ||
228 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000229 DepFile = "-";
230 } else {
231 DepFile = darwin::CC1::getDependencyFileName(Args, Inputs);
Peter Collingbourne119cfaa2011-11-21 00:01:05 +0000232 C.addFailureResultFile(DepFile);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000233 }
234 CmdArgs.push_back("-dependency-file");
235 CmdArgs.push_back(DepFile);
236
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000237 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000238 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
239 const char *DepTarget;
240
241 // If user provided -o, that is the dependency target, except
242 // when we are only generating a dependency file.
243 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
244 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
245 DepTarget = OutputOpt->getValue(Args);
246 } else {
247 // Otherwise derive from the base input.
248 //
249 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000250 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000251 llvm::sys::path::replace_extension(P, "o");
252 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000253 }
254
255 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000256 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000257 QuoteTarget(DepTarget, Quoted);
258 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000259 }
260
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000261 if (A->getOption().matches(options::OPT_M) ||
262 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000263 CmdArgs.push_back("-sys-header-deps");
264 }
265
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000266 if (Args.hasArg(options::OPT_MG)) {
267 if (!A || A->getOption().matches(options::OPT_MD) ||
268 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000269 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000270 CmdArgs.push_back("-MG");
271 }
272
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000273 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000274
275 // Convert all -MQ <target> args to -MT <quoted target>
276 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
277 options::OPT_MQ),
278 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000279 const Arg *A = *it;
280 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000281
Daniel Dunbara442fd52010-06-11 22:00:13 +0000282 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000283 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000284 SmallString<128> Quoted;
Daniel Dunbara442fd52010-06-11 22:00:13 +0000285 QuoteTarget(A->getValue(Args), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000286 CmdArgs.push_back(Args.MakeArgString(Quoted));
287
288 // -MT flag - no change
289 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000290 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000291 }
292 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293
Douglas Gregor111af7d2009-04-18 00:34:01 +0000294 // Add -i* options, and automatically translate to
295 // -include-pch/-include-pth for transparent PCH support. It's
296 // wonky, but we include looking for .gch so we can support seamless
297 // replacement into a build system already set up to be generating
298 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000299 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000300 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
301 ie = Args.filtered_end(); it != ie; ++it) {
302 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000303
304 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000305 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
306 RenderedImplicitInclude = true;
307
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000308 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000309 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000310
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000311 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000312 bool FoundPCH = false;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000313 llvm::sys::Path P(A->getValue(Args));
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000314 bool Exists;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000315 if (UsePCH) {
Douglas Gregor111af7d2009-04-18 00:34:01 +0000316 P.appendSuffix("pch");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000317 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregor111af7d2009-04-18 00:34:01 +0000318 FoundPCH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000319 else
Douglas Gregor111af7d2009-04-18 00:34:01 +0000320 P.eraseSuffix();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321 }
322
Douglas Gregor111af7d2009-04-18 00:34:01 +0000323 if (!FoundPCH) {
324 P.appendSuffix("pth");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000325 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregor111af7d2009-04-18 00:34:01 +0000326 FoundPTH = true;
327 else
328 P.eraseSuffix();
Mike Stump11289f42009-09-09 15:08:12 +0000329 }
330
Douglas Gregor111af7d2009-04-18 00:34:01 +0000331 if (!FoundPCH && !FoundPTH) {
332 P.appendSuffix("gch");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000333 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000334 FoundPCH = UsePCH;
335 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000336 }
Mike Stump11289f42009-09-09 15:08:12 +0000337 else
Douglas Gregor111af7d2009-04-18 00:34:01 +0000338 P.eraseSuffix();
339 }
340
341 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000342 if (IsFirstImplicitInclude) {
343 A->claim();
344 if (UsePCH)
345 CmdArgs.push_back("-include-pch");
346 else
347 CmdArgs.push_back("-include-pth");
348 CmdArgs.push_back(Args.MakeArgString(P.str()));
349 continue;
350 } else {
351 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000352 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000353 << P.str() << A->getAsString(Args);
354 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000355 }
356 }
357
358 // Not translated, render as usual.
359 A->claim();
360 A->render(Args, CmdArgs);
361 }
362
363 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000364 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
365 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000366
367 // Add -Wp, and -Xassembler if using the preprocessor.
368
369 // FIXME: There is a very unfortunate problem here, some troubled
370 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
371 // really support that we would have to parse and then translate
372 // those options. :(
373 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
374 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000375
376 // -I- is a deprecated GCC feature, reject it.
377 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000378 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000379
380 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
381 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000382 StringRef sysroot = C.getSysRoot();
383 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000384 if (!Args.hasArg(options::OPT_isysroot)) {
385 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000386 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000387 }
388 }
Douglas Gregorf936f782011-09-14 20:28:46 +0000389
390 // If a module path was provided, pass it along. Otherwise, use a temporary
391 // directory.
392 if (Arg *A = Args.getLastArg(options::OPT_fmodule_cache_path)) {
Douglas Gregorf936f782011-09-14 20:28:46 +0000393 A->claim();
394 A->render(Args, CmdArgs);
395 } else {
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000396 SmallString<128> DefaultModuleCache;
Douglas Gregorf936f782011-09-14 20:28:46 +0000397 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
398 DefaultModuleCache);
399 llvm::sys::path::append(DefaultModuleCache, "clang-module-cache");
400 CmdArgs.push_back("-fmodule-cache-path");
401 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
402 }
Douglas Gregor97eec242011-09-15 22:00:41 +0000403
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000404 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000405 // FIXME: We should probably sink the logic for handling these from the
406 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000407 // CPATH - included following the user specified includes (but prior to
408 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000409 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000410 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000411 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000412 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000413 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000414 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000415 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000416 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000417 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000418
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000419 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000420 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000421 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000422
423 // Add system include arguments.
424 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000425}
426
Daniel Dunbarf492c922009-09-10 22:59:51 +0000427/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000428/// CPU.
429//
430// FIXME: This is redundant with -mcpu, why does LLVM use this.
431// FIXME: tblgen this, or kill it!
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000432static const char *getLLVMArchSuffixForARM(StringRef CPU) {
Chad Rosier9ac84512011-10-07 17:48:56 +0000433 return llvm::StringSwitch<const char *>(CPU)
434 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
435 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
436 .Cases("arm920", "arm920t", "arm922t", "v4t")
437 .Cases("arm940t", "ep9312","v4t")
438 .Cases("arm10tdmi", "arm1020t", "v5")
439 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
440 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
441 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
442 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
443 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
444 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
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 Atanasyan3b7589a2012-04-07 22:09:23 +0000781// Get CPU and ABI names. They are not independent
782// so we have to calculate them together.
783static void getMipsCPUAndABI(const ArgList &Args,
784 const ToolChain &TC,
785 StringRef &CPUName,
786 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000787 const char *DefMips32CPU = "mips32";
788 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000789
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000790 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
791 options::OPT_mcpu_EQ))
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000792 CPUName = A->getValue(Args);
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000793
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000794 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
Eric Christopher0b26a612010-03-02 02:41:08 +0000795 ABIName = A->getValue(Args);
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000796
797 // Setup default CPU and ABI names.
798 if (CPUName.empty() && ABIName.empty()) {
799 switch (TC.getTriple().getArch()) {
800 default:
801 llvm_unreachable("Unexpected triple arch name");
802 case llvm::Triple::mips:
803 case llvm::Triple::mipsel:
804 CPUName = DefMips32CPU;
805 break;
806 case llvm::Triple::mips64:
807 case llvm::Triple::mips64el:
808 CPUName = DefMips64CPU;
809 break;
810 }
811 }
812
813 if (!ABIName.empty()) {
814 // Deduce CPU name from ABI name.
815 CPUName = llvm::StringSwitch<const char *>(ABIName)
816 .Cases("o32", "eabi", DefMips32CPU)
817 .Cases("n32", "n64", DefMips64CPU)
818 .Default("");
819 }
820 else if (!CPUName.empty()) {
821 // Deduce ABI name from CPU name.
822 ABIName = llvm::StringSwitch<const char *>(CPUName)
823 .Cases("mips32", "mips32r2", "o32")
824 .Cases("mips64", "mips64r2", "n64")
825 .Default("");
826 }
827
828 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000829}
830
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000831// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
832// and -mfloat-abi=.
833static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000834 // Select the float ABI as determined by -msoft-float, -mhard-float,
835 // and -mfloat-abi=.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000836 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000837 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000838 options::OPT_mhard_float,
839 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000840 if (A->getOption().matches(options::OPT_msoft_float))
841 FloatABI = "soft";
842 else if (A->getOption().matches(options::OPT_mhard_float))
843 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000844 else {
845 FloatABI = A->getValue(Args);
846 if (FloatABI != "soft" && FloatABI != "single" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000847 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000848 FloatABI = "hard";
849 }
850 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000851 }
852
853 // If unspecified, choose the default based on the platform.
854 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000855 // Assume "hard", because it's a default value used by gcc.
856 // When we start to recognize specific target MIPS processors,
857 // we will be able to select the default more correctly.
858 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000859 }
860
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000861 return FloatABI;
862}
863
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000864static void AddTargetFeature(const ArgList &Args,
865 ArgStringList &CmdArgs,
866 OptSpecifier OnOpt,
867 OptSpecifier OffOpt,
868 StringRef FeatureName) {
869 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
870 CmdArgs.push_back("-target-feature");
871 if (A->getOption().matches(OnOpt))
872 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
873 else
874 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
875 }
876}
877
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000878void Clang::AddMIPSTargetArgs(const ArgList &Args,
879 ArgStringList &CmdArgs) const {
880 const Driver &D = getToolChain().getDriver();
881 StringRef CPUName;
882 StringRef ABIName;
883 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
884
885 CmdArgs.push_back("-target-cpu");
886 CmdArgs.push_back(CPUName.data());
887
888 CmdArgs.push_back("-target-abi");
889 CmdArgs.push_back(ABIName.data());
890
891 StringRef FloatABI = getMipsFloatABI(D, Args);
892
Eric Christopher0b26a612010-03-02 02:41:08 +0000893 if (FloatABI == "soft") {
894 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +0000895 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000896 CmdArgs.push_back("-mfloat-abi");
897 CmdArgs.push_back("soft");
898
899 // FIXME: Note, this is a hack. We need to pass the selected float
900 // mode to the MipsTargetInfoBase to define appropriate macros there.
901 // Now it is the only method.
902 CmdArgs.push_back("-target-feature");
903 CmdArgs.push_back("+soft-float");
904 }
905 else if (FloatABI == "single") {
906 // Restrict the use of hardware floating-point
907 // instructions to 32-bit operations.
908 CmdArgs.push_back("-target-feature");
909 CmdArgs.push_back("+single-float");
910 }
911 else {
912 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +0000913 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000914 CmdArgs.push_back("-mfloat-abi");
915 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +0000916 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +0000917
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000918 AddTargetFeature(Args, CmdArgs,
919 options::OPT_mips16, options::OPT_mno_mips16,
920 "mips16");
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +0000921 AddTargetFeature(Args, CmdArgs,
922 options::OPT_mdsp, options::OPT_mno_dsp,
923 "dsp");
924 AddTargetFeature(Args, CmdArgs,
925 options::OPT_mdspr2, options::OPT_mno_dspr2,
926 "dspr2");
Simon Atanasyanec4b1c12012-08-27 20:55:56 +0000927
928 if (Arg *A = Args.getLastArg(options::OPT_G)) {
929 StringRef v = A->getValue(Args);
930 CmdArgs.push_back("-mllvm");
931 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
932 A->claim();
933 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000934}
935
Hal Finkel8eb59282012-06-11 22:35:19 +0000936/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
937static std::string getPPCTargetCPU(const ArgList &Args) {
938 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
939 StringRef CPUName = A->getValue(Args);
940
941 if (CPUName == "native") {
942 std::string CPU = llvm::sys::getHostCPUName();
943 if (!CPU.empty() && CPU != "generic")
944 return CPU;
945 else
946 return "";
947 }
948
949 return llvm::StringSwitch<const char *>(CPUName)
950 .Case("common", "generic")
951 .Case("440", "440")
952 .Case("440fp", "440")
953 .Case("450", "450")
954 .Case("601", "601")
955 .Case("602", "602")
956 .Case("603", "603")
957 .Case("603e", "603e")
958 .Case("603ev", "603ev")
959 .Case("604", "604")
960 .Case("604e", "604e")
961 .Case("620", "620")
962 .Case("G3", "g3")
963 .Case("7400", "7400")
964 .Case("G4", "g4")
965 .Case("7450", "7450")
966 .Case("G4+", "g4+")
967 .Case("750", "750")
968 .Case("970", "970")
969 .Case("G5", "g5")
970 .Case("a2", "a2")
971 .Case("power6", "pwr6")
972 .Case("power7", "pwr7")
973 .Case("powerpc", "ppc")
974 .Case("powerpc64", "ppc64")
975 .Default("");
976 }
977
978 return "";
979}
980
981void Clang::AddPPCTargetArgs(const ArgList &Args,
982 ArgStringList &CmdArgs) const {
983 std::string TargetCPUName = getPPCTargetCPU(Args);
984
985 // LLVM may default to generating code for the native CPU,
986 // but, like gcc, we default to a more generic option for
987 // each architecture. (except on Darwin)
988 llvm::Triple Triple = getToolChain().getTriple();
989 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
990 if (Triple.getArch() == llvm::Triple::ppc64)
991 TargetCPUName = "ppc64";
992 else
993 TargetCPUName = "ppc";
994 }
995
996 if (!TargetCPUName.empty()) {
997 CmdArgs.push_back("-target-cpu");
998 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
999 }
1000}
1001
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001002void Clang::AddSparcTargetArgs(const ArgList &Args,
1003 ArgStringList &CmdArgs) const {
1004 const Driver &D = getToolChain().getDriver();
1005
1006 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001007 CmdArgs.push_back("-target-cpu");
Benjamin Kramereed4f2a2011-12-26 14:18:37 +00001008 CmdArgs.push_back(A->getValue(Args));
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001009 }
1010
1011 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001012 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001013 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1014 options::OPT_mhard_float)) {
1015 if (A->getOption().matches(options::OPT_msoft_float))
1016 FloatABI = "soft";
1017 else if (A->getOption().matches(options::OPT_mhard_float))
1018 FloatABI = "hard";
1019 }
1020
1021 // If unspecified, choose the default based on the platform.
1022 if (FloatABI.empty()) {
1023 switch (getToolChain().getTriple().getOS()) {
1024 default:
1025 // Assume "soft", but warn the user we are guessing.
1026 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001027 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001028 break;
1029 }
1030 }
1031
1032 if (FloatABI == "soft") {
1033 // Floating point operations and argument passing are soft.
1034 //
1035 // FIXME: This changes CPP defines, we need -target-soft-float.
1036 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001037 CmdArgs.push_back("-target-feature");
1038 CmdArgs.push_back("+soft-float");
1039 } else {
1040 assert(FloatABI == "hard" && "Invalid float abi!");
1041 CmdArgs.push_back("-mhard-float");
1042 }
1043}
1044
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001045void Clang::AddX86TargetArgs(const ArgList &Args,
1046 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001047 if (!Args.hasFlag(options::OPT_mred_zone,
1048 options::OPT_mno_red_zone,
1049 true) ||
1050 Args.hasArg(options::OPT_mkernel) ||
1051 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001052 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001053
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001054 if (Args.hasFlag(options::OPT_msoft_float,
1055 options::OPT_mno_soft_float,
1056 false))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001057 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001058
Daniel Dunbare13ada62009-11-14 22:04:54 +00001059 const char *CPUName = 0;
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001060 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001061 if (StringRef(A->getValue(Args)) == "native") {
Daniel Dunbare13ada62009-11-14 22:04:54 +00001062 // FIXME: Reject attempts to use -march=native unless the target matches
1063 // the host.
1064 //
1065 // FIXME: We should also incorporate the detected target features for use
1066 // with -native.
1067 std::string CPU = llvm::sys::getHostCPUName();
Bob Wilsone78227b2012-05-09 17:53:10 +00001068 if (!CPU.empty() && CPU != "generic")
Daniel Dunbare13ada62009-11-14 22:04:54 +00001069 CPUName = Args.MakeArgString(CPU);
1070 } else
1071 CPUName = A->getValue(Args);
1072 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001073
Daniel Dunbare13ada62009-11-14 22:04:54 +00001074 // Select the default CPU if none was given (or detection failed).
1075 if (!CPUName) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001076 // FIXME: Need target hooks.
Bob Wilson6524dd32011-10-14 05:03:44 +00001077 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001078 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001079 CPUName = "core2";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001080 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001081 CPUName = "yonah";
Chris Lattnerb986aba2010-04-11 19:29:39 +00001082 } else if (getToolChain().getOS().startswith("haiku")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001083 if (getToolChain().getArch() == llvm::Triple::x86_64)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001084 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001085 else if (getToolChain().getArch() == llvm::Triple::x86)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001086 CPUName = "i586";
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001087 } else if (getToolChain().getOS().startswith("openbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001088 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001089 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001090 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001091 CPUName = "i486";
Eli Friedman9fa28852012-08-08 23:57:20 +00001092 } else if (getToolChain().getOS().startswith("bitrig")) {
1093 if (getToolChain().getArch() == llvm::Triple::x86_64)
1094 CPUName = "x86-64";
1095 else if (getToolChain().getArch() == llvm::Triple::x86)
1096 CPUName = "i686";
Roman Divacky432f10d2011-03-01 18:11:37 +00001097 } else if (getToolChain().getOS().startswith("freebsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001098 if (getToolChain().getArch() == llvm::Triple::x86_64)
Roman Divacky432f10d2011-03-01 18:11:37 +00001099 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001100 else if (getToolChain().getArch() == llvm::Triple::x86)
Roman Divacky432f10d2011-03-01 18:11:37 +00001101 CPUName = "i486";
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001102 } else if (getToolChain().getOS().startswith("netbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001103 if (getToolChain().getArch() == llvm::Triple::x86_64)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001104 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001105 else if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001106 CPUName = "i486";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001107 } else {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001108 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001109 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001110 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001111 CPUName = "pentium4";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001112 }
1113 }
1114
Daniel Dunbare13ada62009-11-14 22:04:54 +00001115 if (CPUName) {
Daniel Dunbara7d02312009-12-18 06:30:12 +00001116 CmdArgs.push_back("-target-cpu");
Daniel Dunbare13ada62009-11-14 22:04:54 +00001117 CmdArgs.push_back(CPUName);
1118 }
1119
Eli Friedmanad811f02011-07-02 00:34:19 +00001120 // The required algorithm here is slightly strange: the options are applied
1121 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1122 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1123 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1124 // former correctly, but not the latter; handle directly-overridden
1125 // attributes here.
1126 llvm::StringMap<unsigned> PrevFeature;
1127 std::vector<const char*> Features;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001128 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1129 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001130 StringRef Name = (*it)->getOption().getName();
Daniel Dunbara442fd52010-06-11 22:00:13 +00001131 (*it)->claim();
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001132
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001133 // Skip over "-m".
1134 assert(Name.startswith("-m") && "Invalid feature name.");
1135 Name = Name.substr(2);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001136
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001137 bool IsNegative = Name.startswith("no-");
1138 if (IsNegative)
1139 Name = Name.substr(3);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001140
Eli Friedmanad811f02011-07-02 00:34:19 +00001141 unsigned& Prev = PrevFeature[Name];
1142 if (Prev)
1143 Features[Prev - 1] = 0;
1144 Prev = Features.size() + 1;
1145 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1146 }
1147 for (unsigned i = 0; i < Features.size(); i++) {
1148 if (Features[i]) {
1149 CmdArgs.push_back("-target-feature");
1150 CmdArgs.push_back(Features[i]);
1151 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001152 }
1153}
1154
Tony Linthicum76329bf2011-12-12 21:14:55 +00001155static Arg* getLastHexagonArchArg (const ArgList &Args)
1156{
1157 Arg * A = NULL;
1158
Sebastian Pop86500282012-01-13 20:37:10 +00001159 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
1160 it != ie; ++it) {
1161 if ((*it)->getOption().matches(options::OPT_march_EQ) ||
Tony Linthicum76329bf2011-12-12 21:14:55 +00001162 (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
1163 A = *it;
1164 A->claim();
1165 }
Sebastian Pop86500282012-01-13 20:37:10 +00001166 else if ((*it)->getOption().matches(options::OPT_m_Joined)){
1167 StringRef Value = (*it)->getValue(Args,0);
1168 if (Value.startswith("v")) {
1169 A = *it;
1170 A->claim();
1171 }
1172 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001173 }
1174 return A;
1175}
1176
Sebastian Pop86500282012-01-13 20:37:10 +00001177static StringRef getHexagonTargetCPU(const ArgList &Args)
Tony Linthicum76329bf2011-12-12 21:14:55 +00001178{
1179 Arg *A;
1180 llvm::StringRef WhichHexagon;
1181
Sebastian Pop86500282012-01-13 20:37:10 +00001182 // Select the default CPU (v4) if none was given or detection failed.
Tony Linthicum76329bf2011-12-12 21:14:55 +00001183 if ((A = getLastHexagonArchArg (Args))) {
Sebastian Pop86500282012-01-13 20:37:10 +00001184 WhichHexagon = A->getValue(Args);
1185 if (WhichHexagon == "")
1186 return "v4";
1187 else
1188 return WhichHexagon;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001189 }
Sebastian Pop86500282012-01-13 20:37:10 +00001190 else
1191 return "v4";
Tony Linthicum76329bf2011-12-12 21:14:55 +00001192}
1193
1194void Clang::AddHexagonTargetArgs(const ArgList &Args,
1195 ArgStringList &CmdArgs) const {
1196 llvm::Triple Triple = getToolChain().getTriple();
1197
1198 CmdArgs.push_back("-target-cpu");
Sebastian Pop86500282012-01-13 20:37:10 +00001199 CmdArgs.push_back(Args.MakeArgString("hexagon" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001200 CmdArgs.push_back("-fno-signed-char");
1201 CmdArgs.push_back("-nobuiltininc");
1202
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001203 if (Args.hasArg(options::OPT_mqdsp6_compat))
Tony Linthicum76329bf2011-12-12 21:14:55 +00001204 CmdArgs.push_back("-mqdsp6-compat");
1205
1206 if (Arg *A = Args.getLastArg(options::OPT_G,
1207 options::OPT_msmall_data_threshold_EQ)) {
1208 std::string SmallDataThreshold="-small-data-threshold=";
1209 SmallDataThreshold += A->getValue(Args);
1210 CmdArgs.push_back ("-mllvm");
1211 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
1212 A->claim();
1213 }
1214
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001215 if (!Args.hasArg(options::OPT_fno_short_enums))
1216 CmdArgs.push_back("-fshort-enums");
1217 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1218 CmdArgs.push_back ("-mllvm");
1219 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1220 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001221 CmdArgs.push_back ("-mllvm");
1222 CmdArgs.push_back ("-machine-sink-split=0");
1223}
1224
Eric Christopher84fbdb42011-08-19 00:30:14 +00001225static bool
John McCall5fb5df92012-06-20 06:18:46 +00001226shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001227 const llvm::Triple &Triple) {
1228 // We use the zero-cost exception tables for Objective-C if the non-fragile
1229 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1230 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001231 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001232 return true;
1233
Bob Wilson6524dd32011-10-14 05:03:44 +00001234 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001235 return false;
1236
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001237 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001238 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001239 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001240}
1241
Anders Carlssone96ab552011-02-28 02:27:16 +00001242/// addExceptionArgs - Adds exception related arguments to the driver command
1243/// arguments. There's a master flag, -fexceptions and also language specific
1244/// flags to enable/disable C++ and Objective-C exceptions.
1245/// This makes it possible to for example disable C++ exceptions but enable
1246/// Objective-C exceptions.
1247static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1248 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001249 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001250 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001251 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001252 if (KernelOrKext) {
1253 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1254 // arguments now to avoid warnings about unused arguments.
1255 Args.ClaimAllArgs(options::OPT_fexceptions);
1256 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1257 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1258 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1259 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1260 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001261 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001262 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001263
1264 // Exceptions are enabled by default.
1265 bool ExceptionsEnabled = true;
1266
1267 // This keeps track of whether exceptions were explicitly turned on or off.
1268 bool DidHaveExplicitExceptionFlag = false;
1269
Rafael Espindola00a66572009-10-01 13:33:33 +00001270 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1271 options::OPT_fno_exceptions)) {
1272 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001273 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001274 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001275 ExceptionsEnabled = false;
1276
1277 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001278 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001279
Anders Carlssone96ab552011-02-28 02:27:16 +00001280 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001281
Anders Carlssone96ab552011-02-28 02:27:16 +00001282 // Exception tables and cleanups can be enabled with -fexceptions even if the
1283 // language itself doesn't support exceptions.
1284 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1285 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001286
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001287 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1288 // is not necessarily sensible, but follows GCC.
1289 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001290 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001291 options::OPT_fno_objc_exceptions,
1292 true)) {
1293 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001294
Eric Christopher84fbdb42011-08-19 00:30:14 +00001295 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001296 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001297 }
1298
1299 if (types::isCXX(InputType)) {
1300 bool CXXExceptionsEnabled = ExceptionsEnabled;
1301
Eric Christopher84fbdb42011-08-19 00:30:14 +00001302 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1303 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001304 options::OPT_fexceptions,
1305 options::OPT_fno_exceptions)) {
1306 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1307 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001308 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001309 CXXExceptionsEnabled = false;
1310 }
1311
1312 if (CXXExceptionsEnabled) {
1313 CmdArgs.push_back("-fcxx-exceptions");
1314
1315 ShouldUseExceptionTables = true;
1316 }
1317 }
1318
1319 if (ShouldUseExceptionTables)
1320 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001321}
1322
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001323static bool ShouldDisableCFI(const ArgList &Args,
1324 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001325 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001326 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001327 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001328 // we disable them if we think the .s file will be passed to it.
Rafael Espindolac41db922012-03-08 14:39:55 +00001329 Default = Args.hasFlag(options::OPT_integrated_as,
1330 options::OPT_no_integrated_as,
1331 TC.IsIntegratedAssemblerDefault());
Rafael Espindolaf934f982011-05-17 16:26:17 +00001332 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001333 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
1334 options::OPT_fno_dwarf2_cfi_asm,
1335 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001336}
1337
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001338static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1339 const ToolChain &TC) {
1340 bool IsIADefault = TC.IsIntegratedAssemblerDefault();
1341 bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
1342 options::OPT_no_integrated_as,
1343 IsIADefault);
1344 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1345 options::OPT_fno_dwarf_directory_asm,
1346 UseIntegratedAs);
1347 return !UseDwarfDirectory;
1348}
1349
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001350/// \brief Check whether the given input tree contains any compilation actions.
1351static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001352 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001353 return true;
1354
1355 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1356 if (ContainsCompileAction(*it))
1357 return true;
1358
1359 return false;
1360}
1361
1362/// \brief Check if -relax-all should be passed to the internal assembler.
1363/// This is done by default when compiling non-assembler source with -O0.
1364static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1365 bool RelaxDefault = true;
1366
1367 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1368 RelaxDefault = A->getOption().matches(options::OPT_O0);
1369
1370 if (RelaxDefault) {
1371 RelaxDefault = false;
1372 for (ActionList::const_iterator it = C.getActions().begin(),
1373 ie = C.getActions().end(); it != ie; ++it) {
1374 if (ContainsCompileAction(*it)) {
1375 RelaxDefault = true;
1376 break;
1377 }
1378 }
1379 }
1380
1381 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1382 RelaxDefault);
1383}
1384
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001385/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1386/// This needs to be called before we add the C run-time (malloc, etc).
1387static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001388 ArgStringList &CmdArgs) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001389 if (!Args.hasFlag(options::OPT_faddress_sanitizer,
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001390 options::OPT_fno_address_sanitizer, false))
1391 return;
Logan Chienc6fd8202012-09-02 09:30:11 +00001392 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001393 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanovea155f02012-06-04 11:15:05 +00001394 if (!Args.hasArg(options::OPT_pie))
1395 TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001396 }
Daniel Dunbar3ca41d42011-12-07 23:22:17 +00001397
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001398 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1399 llvm::sys::path::append(LibAsan, "lib", "linux",
1400 (Twine("libclang_rt.asan-") +
1401 TC.getArchName() + "-android.so"));
1402 CmdArgs.push_back(Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001403 } else {
1404 if (!Args.hasArg(options::OPT_shared)) {
1405 // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
1406 // resource directory.
1407 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1408 llvm::sys::path::append(LibAsan, "lib", "linux",
1409 (Twine("libclang_rt.asan-") +
1410 TC.getArchName() + ".a"));
1411 CmdArgs.push_back(Args.MakeArgString(LibAsan));
1412 CmdArgs.push_back("-lpthread");
1413 CmdArgs.push_back("-ldl");
1414 CmdArgs.push_back("-export-dynamic");
1415 }
1416 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001417}
1418
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001419/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1420/// This needs to be called before we add the C run-time (malloc, etc).
1421static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1422 ArgStringList &CmdArgs) {
1423 if (!Args.hasFlag(options::OPT_fthread_sanitizer,
1424 options::OPT_fno_thread_sanitizer, false))
1425 return;
1426 if (!Args.hasArg(options::OPT_shared)) {
1427 // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library
1428 // resource directory.
1429 SmallString<128> LibTsan(TC.getDriver().ResourceDir);
1430 llvm::sys::path::append(LibTsan, "lib", "linux",
1431 (Twine("libclang_rt.tsan-") +
1432 TC.getArchName() + ".a"));
1433 CmdArgs.push_back(Args.MakeArgString(LibTsan));
1434 CmdArgs.push_back("-lpthread");
1435 CmdArgs.push_back("-ldl");
1436 CmdArgs.push_back("-export-dynamic");
1437 }
1438}
1439
Rafael Espindola224dd632011-12-14 21:02:23 +00001440static bool shouldUseFramePointer(const ArgList &Args,
1441 const llvm::Triple &Triple) {
1442 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1443 options::OPT_fomit_frame_pointer))
1444 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1445
Rafael Espindola00b29182011-12-14 21:50:24 +00001446 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001447 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1448 Triple.getArch() == llvm::Triple::x86) &&
1449 Triple.getOS() == llvm::Triple::Linux) {
1450 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1451 if (!A->getOption().matches(options::OPT_O0))
1452 return false;
1453 }
1454
1455 return true;
1456}
1457
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001458void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001459 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001460 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001461 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001462 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001463 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1464 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001465 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001466 ArgStringList CmdArgs;
1467
Daniel Dunbare521a892009-03-31 20:53:55 +00001468 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1469
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001470 // Invoke ourselves in -cc1 mode.
1471 //
1472 // FIXME: Implement custom jobs for internal actions.
1473 CmdArgs.push_back("-cc1");
1474
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001475 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001476 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001477 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001478 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001479
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001480 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001481 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001482
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001483 if (isa<AnalyzeJobAction>(JA)) {
1484 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1485 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001486 } else if (isa<MigrateJobAction>(JA)) {
1487 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001488 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001489 if (Output.getType() == types::TY_Dependencies)
1490 CmdArgs.push_back("-Eonly");
1491 else
1492 CmdArgs.push_back("-E");
Daniel Dunbarc4343942010-02-03 03:07:56 +00001493 } else if (isa<AssembleJobAction>(JA)) {
1494 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001495
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001496 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001497 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001498
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001499 // When using an integrated assembler, translate -Wa, and -Xassembler
1500 // options.
1501 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1502 options::OPT_Xassembler),
1503 ie = Args.filtered_end(); it != ie; ++it) {
1504 const Arg *A = *it;
1505 A->claim();
1506
1507 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001508 StringRef Value = A->getValue(Args, i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001509
1510 if (Value == "-force_cpusubtype_ALL") {
1511 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001512 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001513 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001514 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001515 CmdArgs.push_back("-mllvm");
1516 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001517 } else if (Value == "--noexecstack") {
1518 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001519 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001520 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001521 << A->getOption().getName() << Value;
1522 }
1523 }
1524 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001525
1526 // Also ignore explicit -force_cpusubtype_ALL option.
1527 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001528 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001529 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001530 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001531
Aaron Ballman1f10cc52012-07-31 01:21:00 +00001532 if (JA.getType() == types::TY_Nothing)
1533 CmdArgs.push_back("-fsyntax-only");
1534 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001535 CmdArgs.push_back("-emit-pch");
1536 else
1537 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001538 } else {
1539 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001540
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001541 if (JA.getType() == types::TY_Nothing) {
1542 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001543 } else if (JA.getType() == types::TY_LLVM_IR ||
1544 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001545 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001546 } else if (JA.getType() == types::TY_LLVM_BC ||
1547 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001548 CmdArgs.push_back("-emit-llvm-bc");
1549 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00001550 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00001551 } else if (JA.getType() == types::TY_AST) {
1552 CmdArgs.push_back("-emit-pch");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001553 } else if (JA.getType() == types::TY_RewrittenObjC) {
1554 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001555 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00001556 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1557 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001558 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001559 } else {
1560 assert(JA.getType() == types::TY_PP_Asm &&
1561 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001562 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00001563 }
1564
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001565 // The make clang go fast button.
1566 CmdArgs.push_back("-disable-free");
1567
John McCallbb79b5f2010-02-13 03:50:24 +00001568 // Disable the verification pass in -asserts builds.
1569#ifdef NDEBUG
1570 CmdArgs.push_back("-disable-llvm-verifier");
1571#endif
1572
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001573 // Set the main file name, so that debug info works even with
1574 // -save-temps.
1575 CmdArgs.push_back("-main-file-name");
1576 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1577
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001578 // Some flags which affect the language (via preprocessor
1579 // defines). See darwin::CC1::AddCPPArgs.
1580 if (Args.hasArg(options::OPT_static))
1581 CmdArgs.push_back("-static-define");
1582
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001583 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00001584 // Enable region store model by default.
1585 CmdArgs.push_back("-analyzer-store=region");
1586
Ted Kremenek7bea9a12009-12-07 22:26:14 +00001587 // Treat blocks as analysis entry points.
1588 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1589
Ted Kremenek49c79792011-03-24 00:28:47 +00001590 CmdArgs.push_back("-analyzer-eagerly-assume");
1591
Anna Zaks0af3e062012-03-08 23:16:35 +00001592 CmdArgs.push_back("-analyzer-ipa=inlining");
Anna Zaksd5c30272012-03-01 22:37:46 +00001593
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001594 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001595 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001596 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00001597
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001598 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1599 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00001600
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001601 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00001602 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00001603
1604 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00001605
1606 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00001607 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1608 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1609 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1610 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1611 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1612 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001613 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001614
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001615 // Set the output format. The default is plist, for (lame) historical
1616 // reasons.
1617 CmdArgs.push_back("-analyzer-output");
1618 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
1619 CmdArgs.push_back(A->getValue(Args));
1620 else
1621 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001622
Ted Kremenekfe449a22010-03-22 22:32:05 +00001623 // Disable the presentation of standard compiler warnings when
1624 // using --analyze. We only want to show static analyzer diagnostics
1625 // or frontend errors.
1626 CmdArgs.push_back("-w");
1627
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001628 // Add -Xanalyzer arguments when running as analyzer.
1629 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00001630 }
1631
Daniel Dunbar4eadb602009-09-10 01:21:12 +00001632 CheckCodeGenerationOptions(D, Args);
1633
Daniel Dunbar44e71222009-04-29 18:32:25 +00001634 // Perform argument translation for LLVM backend. This
1635 // takes some care in reconciling with llvm-gcc. The
1636 // issue is that llvm-gcc translates these options based on
1637 // the values in cc1, whereas we are processing based on
1638 // the driver arguments.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001639
Daniel Dunbar44e71222009-04-29 18:32:25 +00001640 // This comes from the default translation the driver + cc1
1641 // would do to enable flag_pic.
Simon Atanasyana16b7fd2012-05-29 18:50:33 +00001642
1643 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1644 options::OPT_fpic, options::OPT_fno_pic,
1645 options::OPT_fPIE, options::OPT_fno_PIE,
1646 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruthc0c04552012-04-08 16:40:35 +00001647 bool PICDisabled = false;
1648 bool PICEnabled = false;
1649 bool PICForPIE = false;
1650 if (LastPICArg) {
1651 PICForPIE = (LastPICArg->getOption().matches(options::OPT_fPIE) ||
1652 LastPICArg->getOption().matches(options::OPT_fpie));
1653 PICEnabled = (PICForPIE ||
1654 LastPICArg->getOption().matches(options::OPT_fPIC) ||
1655 LastPICArg->getOption().matches(options::OPT_fpic));
1656 PICDisabled = !PICEnabled;
1657 }
1658 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1659 // PIC or PIE options above, if these show up, PIC is disabled.
1660 if (Args.hasArg(options::OPT_mkernel))
1661 PICDisabled = true;
1662 if (Args.hasArg(options::OPT_static))
1663 PICDisabled = true;
1664 bool DynamicNoPIC = Args.hasArg(options::OPT_mdynamic_no_pic);
1665
1666 // Select the relocation model.
Daniel Dunbar44e71222009-04-29 18:32:25 +00001667 const char *Model = getToolChain().GetForcedPicModel();
1668 if (!Model) {
Chandler Carruthc0c04552012-04-08 16:40:35 +00001669 if (DynamicNoPIC)
Daniel Dunbar44e71222009-04-29 18:32:25 +00001670 Model = "dynamic-no-pic";
1671 else if (PICDisabled)
1672 Model = "static";
1673 else if (PICEnabled)
1674 Model = "pic";
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001675 else
Daniel Dunbar44e71222009-04-29 18:32:25 +00001676 Model = getToolChain().GetDefaultRelocationModel();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001677 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001678 StringRef ModelStr = Model ? Model : "";
1679 if (Model && ModelStr != "pic") {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001680 CmdArgs.push_back("-mrelocation-model");
1681 CmdArgs.push_back(Model);
1682 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001683
Chandler Carruthc0c04552012-04-08 16:40:35 +00001684 // Infer the __PIC__ and __PIE__ values.
1685 if (ModelStr == "pic" && PICForPIE) {
1686 CmdArgs.push_back("-pie-level");
1687 CmdArgs.push_back((LastPICArg &&
1688 LastPICArg->getOption().matches(options::OPT_fPIE)) ?
1689 "2" : "1");
1690 } else if (ModelStr == "pic" || ModelStr == "dynamic-no-pic") {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00001691 CmdArgs.push_back("-pic-level");
Chandler Carruthc0c04552012-04-08 16:40:35 +00001692 CmdArgs.push_back(((ModelStr != "dynamic-no-pic" && LastPICArg &&
1693 LastPICArg->getOption().matches(options::OPT_fPIC)) ||
1694 getToolChain().getTriple().isOSDarwin()) ? "2" : "1");
Daniel Dunbar44e71222009-04-29 18:32:25 +00001695 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001696
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00001697 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1698 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00001699 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00001700
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001701 // LLVM Code Generator Options.
1702
Daniel Dunbar0bb03312011-02-09 17:54:19 +00001703 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
1704 CmdArgs.push_back("-mregparm");
1705 CmdArgs.push_back(A->getValue(Args));
1706 }
1707
Roman Divacky65b88cd2011-03-01 17:40:53 +00001708 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1709 CmdArgs.push_back("-mrtd");
1710
Rafael Espindola224dd632011-12-14 21:02:23 +00001711 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001712 CmdArgs.push_back("-mdisable-fp-elim");
1713 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1714 options::OPT_fno_zero_initialized_in_bss))
1715 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00001716 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1717 options::OPT_fno_strict_aliasing,
1718 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00001719 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00001720 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
1721 false))
1722 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00001723 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
1724 options::OPT_fno_optimize_sibling_calls))
1725 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001726
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001727 // Handle various floating point optimization flags, mapping them to the
1728 // appropriate LLVM code generation flags. The pattern for all of these is to
1729 // default off the codegen optimizations, and if any flag enables them and no
1730 // flag disables them after the flag enabling them, enable the codegen
1731 // optimization. This is complicated by several "umbrella" flags.
1732 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1733 options::OPT_ffinite_math_only,
1734 options::OPT_fno_finite_math_only,
1735 options::OPT_fhonor_infinities,
1736 options::OPT_fno_honor_infinities))
1737 if (A->getOption().getID() != options::OPT_fno_finite_math_only &&
1738 A->getOption().getID() != options::OPT_fhonor_infinities)
1739 CmdArgs.push_back("-menable-no-infs");
1740 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1741 options::OPT_ffinite_math_only,
1742 options::OPT_fno_finite_math_only,
1743 options::OPT_fhonor_nans,
1744 options::OPT_fno_honor_nans))
1745 if (A->getOption().getID() != options::OPT_fno_finite_math_only &&
1746 A->getOption().getID() != options::OPT_fhonor_nans)
1747 CmdArgs.push_back("-menable-no-nans");
1748
Benjamin Kramerc242ef22012-05-02 14:55:48 +00001749 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
1750 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001751 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1752 options::OPT_fmath_errno,
Chandler Carruth3634c662012-04-26 02:10:51 +00001753 options::OPT_fno_math_errno))
1754 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
1755 if (MathErrno)
1756 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001757
1758 // There are several flags which require disabling very specific
1759 // optimizations. Any of these being disabled forces us to turn off the
1760 // entire set of LLVM optimizations, so collect them through all the flag
1761 // madness.
1762 bool AssociativeMath = false;
1763 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1764 options::OPT_funsafe_math_optimizations,
1765 options::OPT_fno_unsafe_math_optimizations,
1766 options::OPT_fassociative_math,
1767 options::OPT_fno_associative_math))
1768 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1769 A->getOption().getID() != options::OPT_fno_associative_math)
1770 AssociativeMath = true;
1771 bool ReciprocalMath = false;
1772 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1773 options::OPT_funsafe_math_optimizations,
1774 options::OPT_fno_unsafe_math_optimizations,
1775 options::OPT_freciprocal_math,
1776 options::OPT_fno_reciprocal_math))
1777 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1778 A->getOption().getID() != options::OPT_fno_reciprocal_math)
1779 ReciprocalMath = true;
1780 bool SignedZeros = true;
1781 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1782 options::OPT_funsafe_math_optimizations,
1783 options::OPT_fno_unsafe_math_optimizations,
1784 options::OPT_fsigned_zeros,
1785 options::OPT_fno_signed_zeros))
1786 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1787 A->getOption().getID() != options::OPT_fsigned_zeros)
1788 SignedZeros = false;
1789 bool TrappingMath = true;
1790 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1791 options::OPT_funsafe_math_optimizations,
1792 options::OPT_fno_unsafe_math_optimizations,
1793 options::OPT_ftrapping_math,
1794 options::OPT_fno_trapping_math))
1795 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1796 A->getOption().getID() != options::OPT_ftrapping_math)
1797 TrappingMath = false;
1798 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
1799 !TrappingMath)
1800 CmdArgs.push_back("-menable-unsafe-fp-math");
1801
Lang Hamesaa53b932012-07-06 00:59:19 +00001802
1803 // Validate and pass through -fp-contract option.
1804 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1805 options::OPT_ffp_contract)) {
1806 if (A->getOption().getID() == options::OPT_ffp_contract) {
1807 StringRef Val = A->getValue(Args);
1808 if (Val == "fast" || Val == "on" || Val == "off") {
1809 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
1810 } else {
1811 D.Diag(diag::err_drv_unsupported_option_argument)
1812 << A->getOption().getName() << Val;
1813 }
1814 } else { // A is OPT_ffast_math
1815 // If fast-math is set then set the fp-contract mode to fast.
1816 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
1817 }
1818 }
1819
Bob Wilson6a039162012-07-19 03:52:53 +00001820 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
1821 // and if we find them, tell the frontend to provide the appropriate
1822 // preprocessor macros. This is distinct from enabling any optimizations as
1823 // these options induce language changes which must survive serialization
1824 // and deserialization, etc.
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001825 if (Args.hasArg(options::OPT_ffast_math))
1826 CmdArgs.push_back("-ffast-math");
Bob Wilson6a039162012-07-19 03:52:53 +00001827 if (Args.hasArg(options::OPT_ffinite_math_only))
1828 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001829
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001830 // Decide whether to use verbose asm. Verbose assembly is the default on
1831 // toolchains which have the integrated assembler on by default.
1832 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
1833 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001834 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001835 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001836 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001837
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001838 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
1839 CmdArgs.push_back("-mdebug-pass");
1840 CmdArgs.push_back("Structure");
1841 }
1842 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
1843 CmdArgs.push_back("-mdebug-pass");
1844 CmdArgs.push_back("Arguments");
1845 }
1846
John McCall8517abc2010-02-19 02:45:38 +00001847 // Enable -mconstructor-aliases except on darwin, where we have to
1848 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00001849 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00001850 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00001851
John McCall7ef5cb32011-03-18 02:56:14 +00001852 // Darwin's kernel doesn't support guard variables; just die if we
1853 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00001854 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00001855 CmdArgs.push_back("-fforbid-guard-variables");
1856
Douglas Gregordbe39272011-02-01 15:15:22 +00001857 if (Args.hasArg(options::OPT_mms_bitfields)) {
1858 CmdArgs.push_back("-mms-bitfields");
1859 }
John McCall8517abc2010-02-19 02:45:38 +00001860
Daniel Dunbar306945d2009-09-16 06:17:29 +00001861 // This is a coarse approximation of what llvm-gcc actually does, both
1862 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
1863 // complicated ways.
1864 bool AsynchronousUnwindTables =
1865 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
1866 options::OPT_fno_asynchronous_unwind_tables,
1867 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001868 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00001869 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
1870 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001871 CmdArgs.push_back("-munwind-tables");
1872
Rafael Espindola66aa0452012-06-19 01:26:10 +00001873 getToolChain().addClangTargetOptions(CmdArgs);
1874
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001875 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
1876 CmdArgs.push_back("-mlimit-float-precision");
1877 CmdArgs.push_back(A->getValue(Args));
1878 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001879
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001880 // FIXME: Handle -mtune=.
1881 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00001882
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001883 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001884 CmdArgs.push_back("-mcode-model");
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001885 CmdArgs.push_back(A->getValue(Args));
1886 }
1887
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001888 // Add target specific cpu and features flags.
1889 switch(getToolChain().getTriple().getArch()) {
1890 default:
1891 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001892
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001893 case llvm::Triple::arm:
1894 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00001895 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001896 break;
1897
Eric Christopher0b26a612010-03-02 02:41:08 +00001898 case llvm::Triple::mips:
1899 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00001900 case llvm::Triple::mips64:
1901 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00001902 AddMIPSTargetArgs(Args, CmdArgs);
1903 break;
1904
Hal Finkel8eb59282012-06-11 22:35:19 +00001905 case llvm::Triple::ppc:
1906 case llvm::Triple::ppc64:
1907 AddPPCTargetArgs(Args, CmdArgs);
1908 break;
1909
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001910 case llvm::Triple::sparc:
1911 AddSparcTargetArgs(Args, CmdArgs);
1912 break;
1913
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001914 case llvm::Triple::x86:
1915 case llvm::Triple::x86_64:
1916 AddX86TargetArgs(Args, CmdArgs);
1917 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001918
1919 case llvm::Triple::hexagon:
1920 AddHexagonTargetArgs(Args, CmdArgs);
1921 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00001922 }
1923
Tony Linthicum76329bf2011-12-12 21:14:55 +00001924
1925
Daniel Dunbar976a2f52010-08-11 23:07:47 +00001926 // Pass the linker version in use.
1927 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1928 CmdArgs.push_back("-target-linker-version");
1929 CmdArgs.push_back(A->getValue(Args));
1930 }
1931
Nick Lewycky75033772011-02-02 06:43:03 +00001932 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00001933 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewycky75033772011-02-02 06:43:03 +00001934 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson6524dd32011-10-14 05:03:44 +00001935 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00001936 CmdArgs.push_back("-momit-leaf-frame-pointer");
1937
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00001938 // Explicitly error on some things we know we don't support and can't just
1939 // ignore.
1940 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001941 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
1942 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001943 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00001944 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001945 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00001946 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
1947 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001948 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001949 << Unsupported->getOption().getName();
1950 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00001951 }
1952
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001953 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00001954 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00001955 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00001956 CmdArgs.push_back("-header-include-file");
1957 CmdArgs.push_back(D.CCPrintHeadersFilename ?
1958 D.CCPrintHeadersFilename : "-");
1959 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001960 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00001961 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001962
Chad Rosierbe10f982011-08-02 17:58:04 +00001963 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00001964 CmdArgs.push_back("-diagnostic-log-file");
1965 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
1966 D.CCLogDiagnosticsFilename : "-");
1967 }
1968
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00001969 // Use the last option from "-g" group. "-gline-tables-only" is
1970 // preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00001971 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00001972 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
1973 if (A->getOption().matches(options::OPT_gline_tables_only)) {
1974 CmdArgs.push_back("-gline-tables-only");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00001975 } else if (!A->getOption().matches(options::OPT_g0) &&
1976 !A->getOption().matches(options::OPT_ggdb0)) {
Chad Rosier8fe3b112011-11-07 19:52:29 +00001977 CmdArgs.push_back("-g");
Chad Rosierc2bf3382011-11-04 19:28:44 +00001978 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00001979 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001980
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00001981 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
1982 Args.ClaimAllArgs(options::OPT_g_flags_Group);
1983
Rafael Espindola66bfb2752010-05-06 21:06:04 +00001984 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
1985 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
1986
Chris Lattner3c77a352010-06-22 00:03:40 +00001987 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
1988
Nick Lewycky207bce32011-04-21 23:44:07 +00001989 if (Args.hasArg(options::OPT_ftest_coverage) ||
1990 Args.hasArg(options::OPT_coverage))
1991 CmdArgs.push_back("-femit-coverage-notes");
1992 if (Args.hasArg(options::OPT_fprofile_arcs) ||
1993 Args.hasArg(options::OPT_coverage))
1994 CmdArgs.push_back("-femit-coverage-data");
1995
Nick Lewycky480cb992011-05-04 20:46:58 +00001996 if (C.getArgs().hasArg(options::OPT_c) ||
1997 C.getArgs().hasArg(options::OPT_S)) {
1998 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00001999 CmdArgs.push_back("-coverage-file");
Bill Wendling8c0b4bc2012-08-30 00:43:41 +00002000 SmallString<128> absFilename(Output.getFilename());
2001 llvm::sys::fs::make_absolute(absFilename);
2002 CmdArgs.push_back(Args.MakeArgString(absFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002003 }
2004 }
2005
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002006 // Pass options for controlling the default header search paths.
2007 if (Args.hasArg(options::OPT_nostdinc)) {
2008 CmdArgs.push_back("-nostdsysteminc");
2009 CmdArgs.push_back("-nobuiltininc");
2010 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002011 if (Args.hasArg(options::OPT_nostdlibinc))
2012 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002013 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2014 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2015 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002016
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002017 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002018 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002019 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002020
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002021 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2022
Ted Kremenekf7639e12012-03-06 20:06:33 +00002023 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002024 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002025 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002026 options::OPT_ccc_arcmt_modify,
2027 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002028 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002029 switch (A->getOption().getID()) {
2030 default:
2031 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002032 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002033 CmdArgs.push_back("-arcmt-check");
2034 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002035 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002036 CmdArgs.push_back("-arcmt-modify");
2037 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002038 case options::OPT_ccc_arcmt_migrate:
2039 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002040 CmdArgs.push_back("-mt-migrate-directory");
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002041 CmdArgs.push_back(A->getValue(Args));
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002042
2043 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2044 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002045 break;
John McCalld70fb982011-06-15 23:25:17 +00002046 }
2047 }
2048 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002049
Ted Kremenekf7639e12012-03-06 20:06:33 +00002050 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2051 if (ARCMTEnabled) {
2052 D.Diag(diag::err_drv_argument_not_allowed_with)
2053 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2054 }
2055 CmdArgs.push_back("-mt-migrate-directory");
2056 CmdArgs.push_back(A->getValue(Args));
2057
2058 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2059 options::OPT_objcmt_migrate_subscripting)) {
2060 // None specified, means enable them all.
2061 CmdArgs.push_back("-objcmt-migrate-literals");
2062 CmdArgs.push_back("-objcmt-migrate-subscripting");
2063 } else {
2064 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2065 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2066 }
2067 }
2068
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002069 // Add preprocessing options like -I, -D, etc. if we are using the
2070 // preprocessor.
2071 //
2072 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002073 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Peter Collingbourne9b515cb2011-11-06 00:40:05 +00002074 AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002075
Rafael Espindolaa7431922011-07-21 23:40:37 +00002076 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2077 // that "The compiler can only warn and ignore the option if not recognized".
2078 // When building with ccache, it will pass -D options to clang even on
2079 // preprocessed inputs and configure concludes that -fPIC is not supported.
2080 Args.ClaimAllArgs(options::OPT_D);
2081
Daniel Dunbar58f78332009-09-17 06:53:36 +00002082 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002083 // others.
2084 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002085 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002086 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002087 else if (A->getOption().matches(options::OPT_O) &&
2088 A->getValue(Args)[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002089 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002090 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002091 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002092 }
2093
Daniel Dunbar945577c2009-10-29 02:24:45 +00002094 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002095 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2096 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002097 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002098 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002099
2100 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2101 // (-ansi is equivalent to -std=c89).
2102 //
2103 // If a std is supplied, only add -trigraphs if it follows the
2104 // option.
2105 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2106 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002107 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002108 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002109 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002110 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002111 else
2112 Std->render(Args, CmdArgs);
2113
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002114 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2115 options::OPT_trigraphs))
2116 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002117 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002118 } else {
2119 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002120 //
2121 // FIXME: Clang doesn't correctly handle -std= when the input language
2122 // doesn't match. For the time being just ignore this for C++ inputs;
2123 // eventually we want to do all the standard defaulting here instead of
2124 // splitting it between the driver and clang -cc1.
2125 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002126 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2127 "-std=", /*Joined=*/true);
2128 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2129 CmdArgs.push_back("-std=c++11");
2130
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002131 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002132 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002133
Chandler Carruthb009b142011-04-23 06:30:43 +00002134 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2135 // '-fconst-strings'; this better indicates its actual behavior.
2136 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2137 false)) {
2138 // For perfect compatibility with GCC, we do this even in the presence of
2139 // '-w'. This flag names something other than a warning for GCC.
2140 CmdArgs.push_back("-fconst-strings");
2141 }
2142
Chandler Carruth61fbf622011-04-23 09:27:53 +00002143 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002144 // during C++ compilation, which it is by default. GCC keeps this define even
2145 // in the presence of '-w', match this behavior bug-for-bug.
2146 if (types::isCXX(InputType) &&
2147 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2148 true)) {
2149 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002150 }
2151
Chandler Carruthe0391482010-05-22 02:21:53 +00002152 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2153 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2154 if (Asm->getOption().matches(options::OPT_fasm))
2155 CmdArgs.push_back("-fgnu-keywords");
2156 else
2157 CmdArgs.push_back("-fno-gnu-keywords");
2158 }
2159
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002160 if (ShouldDisableCFI(Args, getToolChain()))
2161 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002162
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002163 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2164 CmdArgs.push_back("-fno-dwarf-directory-asm");
2165
Nick Lewyckyba743b72011-10-21 02:32:14 +00002166 if (const char *pwd = ::getenv("PWD")) {
2167 // GCC also verifies that stat(pwd) and stat(".") have the same inode
2168 // number. Not doing those because stats are slow, but we could.
NAKAMURA Takumib5e6fa22011-10-22 10:25:25 +00002169 if (llvm::sys::path::is_absolute(pwd)) {
Nick Lewyckyba743b72011-10-21 02:32:14 +00002170 std::string CompDir = pwd;
2171 CmdArgs.push_back("-fdebug-compilation-dir");
2172 CmdArgs.push_back(Args.MakeArgString(CompDir));
2173 }
2174 }
2175
Richard Smith9a568822011-11-21 19:36:32 +00002176 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2177 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002178 CmdArgs.push_back("-ftemplate-depth");
2179 CmdArgs.push_back(A->getValue(Args));
2180 }
2181
Richard Smith9a568822011-11-21 19:36:32 +00002182 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2183 CmdArgs.push_back("-fconstexpr-depth");
2184 CmdArgs.push_back(A->getValue(Args));
2185 }
2186
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002187 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2188 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002189 if (A->getNumValues()) {
2190 StringRef bytes = A->getValue(Args);
2191 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2192 } else
2193 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002194 }
2195
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002196 if (Arg *A = Args.getLastArg(options::OPT_fbounds_checking,
2197 options::OPT_fbounds_checking_EQ)) {
2198 if (A->getNumValues()) {
2199 StringRef val = A->getValue(Args);
2200 CmdArgs.push_back(Args.MakeArgString("-fbounds-checking=" + val));
2201 } else
2202 CmdArgs.push_back("-fbounds-checking=1");
2203 }
2204
Daniel Dunbarfffd1812009-11-19 04:00:53 +00002205 if (Args.hasArg(options::OPT__relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002206 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002207
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002208 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2209 CmdArgs.push_back("-fconstant-string-class");
2210 CmdArgs.push_back(A->getValue(Args));
2211 }
David Chisnall5778fce2009-08-31 16:41:57 +00002212
Chris Lattnere23003d2010-01-09 21:54:33 +00002213 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2214 CmdArgs.push_back("-ftabstop");
2215 CmdArgs.push_back(A->getValue(Args));
2216 }
2217
Chris Lattnerb35583d2010-04-07 20:49:23 +00002218 CmdArgs.push_back("-ferror-limit");
2219 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
2220 CmdArgs.push_back(A->getValue(Args));
2221 else
2222 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002223
Chandler Carrutha77a7272010-05-06 04:55:18 +00002224 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2225 CmdArgs.push_back("-fmacro-backtrace-limit");
Douglas Gregorcd121fb2010-05-04 17:13:42 +00002226 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002227 }
2228
2229 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2230 CmdArgs.push_back("-ftemplate-backtrace-limit");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002231 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002232 }
2233
Richard Smithf6f003a2011-12-16 19:06:07 +00002234 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2235 CmdArgs.push_back("-fconstexpr-backtrace-limit");
2236 CmdArgs.push_back(A->getValue(Args));
2237 }
2238
Daniel Dunbar2c978472009-11-04 06:24:47 +00002239 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002240 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002241 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002242 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002243 } else {
2244 // If -fmessage-length=N was not specified, determine whether this is a
2245 // terminal and, if so, implicitly define -fmessage-length appropriately.
2246 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002247 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002248 }
2249
Daniel Dunbare357d562009-12-03 18:42:11 +00002250 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2251 CmdArgs.push_back("-fvisibility");
2252 CmdArgs.push_back(A->getValue(Args));
2253 }
2254
Douglas Gregor08329632010-06-15 17:05:35 +00002255 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002256
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002257 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2258
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002259 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002260 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2261 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002262 CmdArgs.push_back("-ffreestanding");
2263
Daniel Dunbare357d562009-12-03 18:42:11 +00002264 // Forward -f (flag) options which we can pass directly.
Mike Stumpd9546382009-12-12 01:27:46 +00002265 Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002266 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002267 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002268 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002269 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002270 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002271 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002272 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2273 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002274
2275 // Report and error for -faltivec on anything other then PowerPC.
2276 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2277 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2278 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2279 D.Diag(diag::err_drv_argument_only_allowed_with)
2280 << A->getAsString(Args) << "ppc/ppc64";
2281
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002282 if (getToolChain().SupportsProfiling())
2283 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002284
Kostya Serebryany8855ff62011-11-16 17:34:26 +00002285 if (Args.hasFlag(options::OPT_faddress_sanitizer,
2286 options::OPT_fno_address_sanitizer, false))
2287 CmdArgs.push_back("-faddress-sanitizer");
2288
Kostya Serebryany28a7a112012-03-01 22:27:08 +00002289 if (Args.hasFlag(options::OPT_fthread_sanitizer,
2290 options::OPT_fno_thread_sanitizer, false))
2291 CmdArgs.push_back("-fthread-sanitizer");
2292
Daniel Dunbar35621a92010-03-16 16:57:46 +00002293 // -flax-vector-conversions is default.
2294 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2295 options::OPT_fno_lax_vector_conversions))
2296 CmdArgs.push_back("-fno-lax-vector-conversions");
2297
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002298 if (Args.getLastArg(options::OPT_fapple_kext))
2299 CmdArgs.push_back("-fapple-kext");
2300
David Blaikie690f21e2012-06-14 18:55:27 +00002301 if (Args.hasFlag(options::OPT_frewrite_includes,
2302 options::OPT_fno_rewrite_includes, false))
2303 CmdArgs.push_back("-frewrite-includes");
2304
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002305 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002306 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002307 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002308 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2309 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002310
2311 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2312 CmdArgs.push_back("-ftrapv-handler");
2313 CmdArgs.push_back(A->getValue(Args));
2314 }
2315
Bob Wilson14adb362012-02-03 06:27:22 +00002316 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002317
Chandler Carruth6e501032011-03-27 00:04:55 +00002318 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2319 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2320 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2321 options::OPT_fno_wrapv)) {
2322 if (A->getOption().matches(options::OPT_fwrapv))
2323 CmdArgs.push_back("-fwrapv");
2324 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2325 options::OPT_fno_strict_overflow)) {
2326 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2327 CmdArgs.push_back("-fwrapv");
2328 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002329 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002330 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002331
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002332 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2333
Daniel Dunbar4930e332009-11-17 08:07:36 +00002334 // -stack-protector=0 is default.
2335 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002336 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2337 options::OPT_fstack_protector_all,
2338 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002339 if (A->getOption().matches(options::OPT_fstack_protector))
2340 StackProtectorLevel = 1;
2341 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2342 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002343 } else {
2344 StackProtectorLevel =
2345 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2346 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002347 if (StackProtectorLevel) {
2348 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002349 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002350 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002351
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002352 // --param ssp-buffer-size=
2353 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2354 ie = Args.filtered_end(); it != ie; ++it) {
2355 StringRef Str((*it)->getValue(Args));
2356 if (Str.startswith("ssp-buffer-size=")) {
2357 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00002358 CmdArgs.push_back("-stack-protector-buffer-size");
2359 // FIXME: Verify the argument is a valid integer.
2360 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002361 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002362 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00002363 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002364 }
2365
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002366 // Translate -mstackrealign
2367 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2368 false)) {
2369 CmdArgs.push_back("-backend-option");
2370 CmdArgs.push_back("-force-align-stack");
2371 }
2372 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2373 false)) {
2374 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2375 }
2376
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002377 if (Args.hasArg(options::OPT_mstack_alignment)) {
2378 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2379 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002380 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002381
Daniel Dunbard18049a2009-04-07 21:16:11 +00002382 // Forward -f options with positive and negative forms; we translate
2383 // these by hand.
2384
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002385 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002386 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002387 CmdArgs.push_back("-fapple-kext");
2388 if (!Args.hasArg(options::OPT_fbuiltin))
2389 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002390 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002391 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002392 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002393 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002394 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002395
Nuno Lopes13c88c72009-12-16 16:59:22 +00002396 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2397 options::OPT_fno_assume_sane_operator_new))
2398 CmdArgs.push_back("-fno-assume-sane-operator-new");
2399
Daniel Dunbar4930e332009-11-17 08:07:36 +00002400 // -fblocks=0 is default.
2401 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002402 getToolChain().IsBlocksDefault()) ||
2403 (Args.hasArg(options::OPT_fgnu_runtime) &&
2404 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2405 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002406 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002407
2408 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2409 !getToolChain().hasBlocksRuntime())
2410 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002411 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002412
Douglas Gregor226173a2012-01-18 15:19:58 +00002413 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2414 // users must also pass -fcxx-modules. The latter flag will disappear once the
2415 // modules implementation is solid for C++/Objective-C++ programs as well.
2416 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2417 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2418 options::OPT_fno_cxx_modules,
2419 false);
2420 if (AllowedInCXX || !types::isCXX(InputType))
2421 CmdArgs.push_back("-fmodules");
2422 }
Douglas Gregor787869b2012-01-03 17:13:05 +00002423
John McCalldfea9982010-04-09 19:12:06 +00002424 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002425 if (Args.hasFlag(options::OPT_fno_access_control,
2426 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002427 false))
John McCall3155f572010-04-09 19:03:51 +00002428 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00002429
Anders Carlssond470fef2010-11-21 00:09:52 +00002430 // -felide-constructors is the default.
2431 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2432 options::OPT_felide_constructors,
2433 false))
2434 CmdArgs.push_back("-fno-elide-constructors");
2435
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002436 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002437 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
2438 KernelOrKext)
Daniel Dunbar484afa22009-11-19 04:55:23 +00002439 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00002440
Tony Linthicum76329bf2011-12-12 21:14:55 +00002441 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002442 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00002443 options::OPT_fno_short_enums,
2444 getToolChain().getTriple().getArch() ==
2445 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002446 CmdArgs.push_back("-fshort-enums");
2447
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002448 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002449 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002450 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00002451 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00002452
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002453 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002454 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002455 options::OPT_fno_threadsafe_statics))
2456 CmdArgs.push_back("-fno-threadsafe-statics");
2457
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002458 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002459 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2460 options::OPT_fno_use_cxa_atexit,
2461 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00002462 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00002463 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2464 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002465 CmdArgs.push_back("-fno-use-cxa-atexit");
2466
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002467 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002468 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002469 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2470 CmdArgs.push_back("-fms-extensions");
2471
Chad Rosiered943242012-07-20 21:20:33 +00002472 // -fms-inline-asm.
Chad Rosierd3957e52012-07-20 23:12:26 +00002473 if (Args.hasArg(options::OPT_fenable_experimental_ms_inline_asm))
2474 CmdArgs.push_back("-fenable-experimental-ms-inline-asm");
Chad Rosiered943242012-07-20 21:20:33 +00002475
Francois Pichet1b4f1632011-09-17 04:32:15 +00002476 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00002477 if (Args.hasFlag(options::OPT_fms_compatibility,
2478 options::OPT_fno_ms_compatibility,
2479 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2480 Args.hasFlag(options::OPT_fms_extensions,
2481 options::OPT_fno_ms_extensions,
2482 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00002483 CmdArgs.push_back("-fms-compatibility");
2484
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002485 // -fmsc-version=1300 is default.
2486 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2487 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2488 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002489 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002490 if (msc_ver.empty())
2491 CmdArgs.push_back("-fmsc-version=1300");
2492 else
2493 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2494 }
2495
2496
Dawn Perchik68bb1b42010-09-02 23:59:25 +00002497 // -fborland-extensions=0 is default.
2498 if (Args.hasFlag(options::OPT_fborland_extensions,
2499 options::OPT_fno_borland_extensions, false))
2500 CmdArgs.push_back("-fborland-extensions");
2501
Francois Pichet02744872011-09-01 16:38:08 +00002502 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2503 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00002504 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2505 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00002506 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00002507 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00002508
Chandler Carruthe03aa552010-04-17 20:17:31 +00002509 // -fgnu-keywords default varies depending on language; only pass if
2510 // specified.
2511 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00002512 options::OPT_fno_gnu_keywords))
2513 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00002514
Rafael Espindola922a6242011-06-02 17:30:53 +00002515 if (Args.hasFlag(options::OPT_fgnu89_inline,
2516 options::OPT_fno_gnu89_inline,
2517 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00002518 CmdArgs.push_back("-fgnu89-inline");
2519
Chad Rosier9c76d242012-03-15 22:31:42 +00002520 if (Args.hasArg(options::OPT_fno_inline))
2521 CmdArgs.push_back("-fno-inline");
2522
Chad Rosier64d6be92012-03-06 21:17:19 +00002523 if (Args.hasArg(options::OPT_fno_inline_functions))
2524 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00002525
John McCall5fb5df92012-06-20 06:18:46 +00002526 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00002527
John McCall5fb5df92012-06-20 06:18:46 +00002528 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2529 // legacy is the default.
2530 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00002531 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2532 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00002533 objcRuntime.isLegacyDispatchDefaultForArch(
2534 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00002535 if (getToolChain().UseObjCMixedDispatch())
2536 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2537 else
2538 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2539 }
2540 }
2541
Nico Weber97bd94b2012-03-09 21:19:44 +00002542 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2543 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00002544 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00002545 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2546 }
2547
John McCall24fc0de2011-07-06 00:26:06 +00002548 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2549 // NOTE: This logic is duplicated in ToolChains.cpp.
2550 bool ARC = isObjCAutoRefCount(Args);
2551 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00002552 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00002553
John McCall24fc0de2011-07-06 00:26:06 +00002554 CmdArgs.push_back("-fobjc-arc");
2555
Chandler Carruth491db322011-11-04 07:34:47 +00002556 // FIXME: It seems like this entire block, and several around it should be
2557 // wrapped in isObjC, but for now we just use it here as this is where it
2558 // was being used previously.
2559 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2560 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2561 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2562 else
2563 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2564 }
2565
John McCall24fc0de2011-07-06 00:26:06 +00002566 // Allow the user to enable full exceptions code emission.
2567 // We define off for Objective-CC, on for Objective-C++.
2568 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2569 options::OPT_fno_objc_arc_exceptions,
2570 /*default*/ types::isCXX(InputType)))
2571 CmdArgs.push_back("-fobjc-arc-exceptions");
2572 }
2573
2574 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2575 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00002576 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00002577 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002578
John McCall24fc0de2011-07-06 00:26:06 +00002579 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2580 // takes precedence.
2581 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2582 if (!GCArg)
2583 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2584 if (GCArg) {
2585 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002586 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00002587 << GCArg->getAsString(Args);
2588 } else if (getToolChain().SupportsObjCGC()) {
2589 GCArg->render(Args, CmdArgs);
2590 } else {
2591 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002592 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00002593 << GCArg->getAsString(Args);
2594 }
2595 }
2596
John McCallb5f652e2011-06-22 00:53:57 +00002597 // Add exception args.
2598 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00002599 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00002600
2601 if (getToolChain().UseSjLjExceptions())
2602 CmdArgs.push_back("-fsjlj-exceptions");
2603
2604 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00002605 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2606 options::OPT_fno_assume_sane_operator_new))
2607 CmdArgs.push_back("-fno-assume-sane-operator-new");
2608
Daniel Dunbar34d7a992010-04-27 15:34:57 +00002609 // -fconstant-cfstrings is default, and may be subject to argument translation
2610 // on Darwin.
2611 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2612 options::OPT_fno_constant_cfstrings) ||
2613 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2614 options::OPT_mno_constant_cfstrings))
2615 CmdArgs.push_back("-fno-constant-cfstrings");
2616
John Thompsoned4e2952009-11-05 20:14:16 +00002617 // -fshort-wchar default varies depending on platform; only
2618 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00002619 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2620 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00002621
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00002622 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2623 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00002624 //
2625 // FIXME: This is gross; that translation should be pulled from the
2626 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002627 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00002628 options::OPT_fno_pascal_strings,
2629 false) ||
2630 Args.hasFlag(options::OPT_mpascal_strings,
2631 options::OPT_mno_pascal_strings,
2632 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002633 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002634
Daniel Dunbar096ed292011-10-05 21:04:55 +00002635 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2636 // -fno-pack-struct doesn't apply to -fpack-struct=.
2637 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00002638 std::string PackStructStr = "-fpack-struct=";
2639 PackStructStr += A->getValue(Args);
2640 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00002641 } else if (Args.hasFlag(options::OPT_fpack_struct,
2642 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00002643 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00002644 }
2645
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002646 if (Args.hasArg(options::OPT_mkernel) ||
2647 Args.hasArg(options::OPT_fapple_kext)) {
2648 if (!Args.hasArg(options::OPT_fcommon))
2649 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00002650 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002651 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00002652
Daniel Dunbard18049a2009-04-07 21:16:11 +00002653 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002654 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002655 CmdArgs.push_back("-fno-common");
2656
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002657 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00002658 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00002659 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002660 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002661 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002662 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2663
Daniel Dunbar6358d682010-10-15 22:30:42 +00002664 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2665 if (!Args.hasFlag(options::OPT_ffor_scope,
2666 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002667 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00002668 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2669
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00002670 // -fcaret-diagnostics is default.
2671 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2672 options::OPT_fno_caret_diagnostics, true))
2673 CmdArgs.push_back("-fno-caret-diagnostics");
2674
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002675 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00002676 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002677 options::OPT_fno_diagnostics_fixit_info))
2678 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002679
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002680 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00002681 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002682 options::OPT_fno_diagnostics_show_option))
2683 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002684
Chris Lattnerbf6fac82010-05-04 21:55:25 +00002685 if (const Arg *A =
2686 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
2687 CmdArgs.push_back("-fdiagnostics-show-category");
2688 CmdArgs.push_back(A->getValue(Args));
2689 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002690
Douglas Gregor643c9222011-05-21 17:07:29 +00002691 if (const Arg *A =
2692 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
2693 CmdArgs.push_back("-fdiagnostics-format");
2694 CmdArgs.push_back(A->getValue(Args));
2695 }
2696
Chandler Carruthb6766f02011-03-27 01:50:55 +00002697 if (Arg *A = Args.getLastArg(
2698 options::OPT_fdiagnostics_show_note_include_stack,
2699 options::OPT_fno_diagnostics_show_note_include_stack)) {
2700 if (A->getOption().matches(
2701 options::OPT_fdiagnostics_show_note_include_stack))
2702 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
2703 else
2704 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
2705 }
2706
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002707 // Color diagnostics are the default, unless the terminal doesn't support
2708 // them.
2709 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidis4f920162010-09-23 12:56:06 +00002710 options::OPT_fno_color_diagnostics,
2711 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002712 CmdArgs.push_back("-fcolor-diagnostics");
2713
Daniel Dunbardb097022009-06-08 21:13:54 +00002714 if (!Args.hasFlag(options::OPT_fshow_source_location,
2715 options::OPT_fno_show_source_location))
2716 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002717
Douglas Gregor643c9222011-05-21 17:07:29 +00002718 if (!Args.hasFlag(options::OPT_fshow_column,
2719 options::OPT_fno_show_column,
2720 true))
2721 CmdArgs.push_back("-fno-show-column");
2722
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00002723 if (!Args.hasFlag(options::OPT_fspell_checking,
2724 options::OPT_fno_spell_checking))
2725 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002726
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002727
Daniel Dunbar3ada2b72010-11-02 19:42:04 +00002728 // Silently ignore -fasm-blocks for now.
2729 (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
2730 false);
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002731
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00002732 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
2733 A->render(Args, CmdArgs);
2734
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002735 // -fdollars-in-identifiers default varies depending on platform and
2736 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00002737 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002738 options::OPT_fno_dollars_in_identifiers)) {
2739 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002740 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002741 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002742 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002743 }
2744
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002745 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
2746 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00002747 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002748 options::OPT_fno_unit_at_a_time)) {
2749 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002750 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002751 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002752
Eli Friedman055c9702011-11-02 01:53:16 +00002753 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
2754 options::OPT_fno_apple_pragma_pack, false))
2755 CmdArgs.push_back("-fapple-pragma-pack");
2756
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002757 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002758 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002759 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002760#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00002761 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002762 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
2763 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
2764 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
2765 CmdArgs.push_back("-fno-builtin-strcat");
2766 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
2767 CmdArgs.push_back("-fno-builtin-strcpy");
2768 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002769#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002770
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002771 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00002772 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002773 options::OPT_traditional_cpp)) {
2774 if (isa<PreprocessJobAction>(JA))
2775 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002776 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002777 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002778 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002779
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002780 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00002781 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00002782
2783 // Handle serialized diagnostics.
2784 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
2785 CmdArgs.push_back("-serialize-diagnostic-file");
2786 CmdArgs.push_back(Args.MakeArgString(A->getValue(Args)));
2787 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002788
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00002789 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
2790 CmdArgs.push_back("-fretain-comments-from-system-headers");
2791
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002792 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
2793 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002794 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002795 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
2796 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00002797 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00002798
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002799 // We translate this by hand to the -cc1 argument, since nightly test uses
2800 // it and developers have been trained to spell it with -mllvm.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002801 if (StringRef((*it)->getValue(Args, 0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002802 CmdArgs.push_back("-disable-llvm-optzns");
2803 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00002804 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002805 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002806
Daniel Dunbard67a3222009-03-30 06:36:42 +00002807 if (Output.getType() == types::TY_Dependencies) {
2808 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002809 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00002810 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002811 CmdArgs.push_back(Output.getFilename());
2812 } else {
2813 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002814 }
2815
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002816 for (InputInfoList::const_iterator
2817 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2818 const InputInfo &II = *it;
2819 CmdArgs.push_back("-x");
2820 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00002821 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002822 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002823 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002824 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002825 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002826
Chris Lattnere9d7d782009-11-03 19:50:27 +00002827 Args.AddAllArgs(CmdArgs, options::OPT_undef);
2828
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00002829 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002830
2831 // Optionally embed the -cc1 level arguments into the debug info, for build
2832 // analysis.
2833 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002834 ArgStringList OriginalArgs;
2835 for (ArgList::const_iterator it = Args.begin(),
2836 ie = Args.end(); it != ie; ++it)
2837 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002838
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00002839 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002840 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002841 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002842 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002843 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002844 }
2845 CmdArgs.push_back("-dwarf-debug-flags");
2846 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
2847 }
2848
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00002849 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00002850
Roman Divacky178e01602011-02-10 16:52:03 +00002851 if (Arg *A = Args.getLastArg(options::OPT_pg))
2852 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002853 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00002854 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002855
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002856 // Claim some arguments which clang supports automatically.
2857
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00002858 // -fpch-preprocess is used with gcc to add a special marker in the output to
2859 // include the PCH file. Clang's PTH solution is completely transparent, so we
2860 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002861 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002862
Daniel Dunbar17731772009-03-23 19:03:36 +00002863 // Claim some arguments which clang doesn't support, but we don't
2864 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00002865 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
2866 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00002867
Rafael Espindolad95a8122011-03-01 05:25:27 +00002868 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00002869 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00002870 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002871}
2872
Jim Grosbach576452b2012-02-10 20:37:10 +00002873void ClangAs::AddARMTargetArgs(const ArgList &Args,
2874 ArgStringList &CmdArgs) const {
2875 const Driver &D = getToolChain().getDriver();
2876 llvm::Triple Triple = getToolChain().getTriple();
2877
2878 // Set the CPU based on -march= and -mcpu=.
2879 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00002880 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00002881
2882 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00002883 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00002884 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00002885
2886 // Honor -mfpmath=.
2887 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00002888 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00002889}
2890
John McCall5fb5df92012-06-20 06:18:46 +00002891/// Add options related to the Objective-C runtime/ABI.
2892///
2893/// Returns true if the runtime is non-fragile.
2894ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
2895 ArgStringList &cmdArgs,
2896 RewriteKind rewriteKind) const {
2897 // Look for the controlling runtime option.
2898 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
2899 options::OPT_fgnu_runtime,
2900 options::OPT_fobjc_runtime_EQ);
2901
2902 // Just forward -fobjc-runtime= to the frontend. This supercedes
2903 // options about fragility.
2904 if (runtimeArg &&
2905 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
2906 ObjCRuntime runtime;
2907 StringRef value = runtimeArg->getValue(args);
2908 if (runtime.tryParse(value)) {
2909 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
2910 << value;
2911 }
2912
2913 runtimeArg->render(args, cmdArgs);
2914 return runtime;
2915 }
2916
2917 // Otherwise, we'll need the ABI "version". Version numbers are
2918 // slightly confusing for historical reasons:
2919 // 1 - Traditional "fragile" ABI
2920 // 2 - Non-fragile ABI, version 1
2921 // 3 - Non-fragile ABI, version 2
2922 unsigned objcABIVersion = 1;
2923 // If -fobjc-abi-version= is present, use that to set the version.
2924 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
2925 StringRef value = abiArg->getValue(args);
2926 if (value == "1")
2927 objcABIVersion = 1;
2928 else if (value == "2")
2929 objcABIVersion = 2;
2930 else if (value == "3")
2931 objcABIVersion = 3;
2932 else
2933 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2934 << value;
2935 } else {
2936 // Otherwise, determine if we are using the non-fragile ABI.
2937 bool nonFragileABIIsDefault =
2938 (rewriteKind == RK_NonFragile ||
2939 (rewriteKind == RK_None &&
2940 getToolChain().IsObjCNonFragileABIDefault()));
2941 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
2942 options::OPT_fno_objc_nonfragile_abi,
2943 nonFragileABIIsDefault)) {
2944 // Determine the non-fragile ABI version to use.
2945#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
2946 unsigned nonFragileABIVersion = 1;
2947#else
2948 unsigned nonFragileABIVersion = 2;
2949#endif
2950
2951 if (Arg *abiArg = args.getLastArg(
2952 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
2953 StringRef value = abiArg->getValue(args);
2954 if (value == "1")
2955 nonFragileABIVersion = 1;
2956 else if (value == "2")
2957 nonFragileABIVersion = 2;
2958 else
2959 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2960 << value;
2961 }
2962
2963 objcABIVersion = 1 + nonFragileABIVersion;
2964 } else {
2965 objcABIVersion = 1;
2966 }
2967 }
2968
2969 // We don't actually care about the ABI version other than whether
2970 // it's non-fragile.
2971 bool isNonFragile = objcABIVersion != 1;
2972
2973 // If we have no runtime argument, ask the toolchain for its default runtime.
2974 // However, the rewriter only really supports the Mac runtime, so assume that.
2975 ObjCRuntime runtime;
2976 if (!runtimeArg) {
2977 switch (rewriteKind) {
2978 case RK_None:
2979 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
2980 break;
2981 case RK_Fragile:
2982 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
2983 break;
2984 case RK_NonFragile:
2985 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
2986 break;
2987 }
2988
2989 // -fnext-runtime
2990 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
2991 // On Darwin, make this use the default behavior for the toolchain.
2992 if (getToolChain().getTriple().isOSDarwin()) {
2993 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
2994
2995 // Otherwise, build for a generic macosx port.
2996 } else {
2997 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
2998 }
2999
3000 // -fgnu-runtime
3001 } else {
3002 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003003 // Legacy behaviour is to target the gnustep runtime if we are i
3004 // non-fragile mode or the GCC runtime in fragile mode.
3005 if (isNonFragile)
3006 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple());
3007 else
3008 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003009 }
3010
3011 cmdArgs.push_back(args.MakeArgString(
3012 "-fobjc-runtime=" + runtime.getAsString()));
3013 return runtime;
3014}
3015
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003016void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003017 const InputInfo &Output,
3018 const InputInfoList &Inputs,
3019 const ArgList &Args,
3020 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003021 ArgStringList CmdArgs;
3022
3023 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3024 const InputInfo &Input = Inputs[0];
3025
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003026 // Don't warn about "clang -w -c foo.s"
3027 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003028 // and "clang -emit-llvm -c foo.s"
3029 Args.ClaimAllArgs(options::OPT_emit_llvm);
3030 // and "clang -use-gold-plugin -c foo.s"
3031 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003032
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003033 // Invoke ourselves in -cc1as mode.
3034 //
3035 // FIXME: Implement custom jobs for internal actions.
3036 CmdArgs.push_back("-cc1as");
3037
3038 // Add the "effective" target triple.
3039 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003040 std::string TripleStr =
3041 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003042 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3043
3044 // Set the output mode, we currently only expect to be used as a real
3045 // assembler.
3046 CmdArgs.push_back("-filetype");
3047 CmdArgs.push_back("obj");
3048
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003049 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003050 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003051
Jim Grosbach576452b2012-02-10 20:37:10 +00003052 // Add target specific cpu and features flags.
3053 switch(getToolChain().getTriple().getArch()) {
3054 default:
3055 break;
3056
3057 case llvm::Triple::arm:
3058 case llvm::Triple::thumb:
3059 AddARMTargetArgs(Args, CmdArgs);
3060 break;
3061 }
3062
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003063 // Ignore explicit -force_cpusubtype_ALL option.
3064 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003065
Eric Christopherfc3ee562012-01-10 00:38:01 +00003066 // Determine the original source input.
3067 const Action *SourceAction = &JA;
3068 while (SourceAction->getKind() != Action::InputClass) {
3069 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3070 SourceAction = SourceAction->getInputs()[0];
3071 }
3072
3073 // Forward -g, assuming we are dealing with an actual assembly file.
3074 if (SourceAction->getType() == types::TY_Asm ||
3075 SourceAction->getType() == types::TY_PP_Asm) {
3076 Args.ClaimAllArgs(options::OPT_g_Group);
3077 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3078 if (!A->getOption().matches(options::OPT_g0))
3079 CmdArgs.push_back("-g");
3080 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003081
3082 // Optionally embed the -cc1as level arguments into the debug info, for build
3083 // analysis.
3084 if (getToolChain().UseDwarfDebugFlags()) {
3085 ArgStringList OriginalArgs;
3086 for (ArgList::const_iterator it = Args.begin(),
3087 ie = Args.end(); it != ie; ++it)
3088 (*it)->render(Args, OriginalArgs);
3089
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003090 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003091 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3092 Flags += Exec;
3093 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3094 Flags += " ";
3095 Flags += OriginalArgs[i];
3096 }
3097 CmdArgs.push_back("-dwarf-debug-flags");
3098 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3099 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003100
3101 // FIXME: Add -static support, once we have it.
3102
3103 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3104 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003105 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003106
3107 assert(Output.isFilename() && "Unexpected lipo output.");
3108 CmdArgs.push_back("-o");
3109 CmdArgs.push_back(Output.getFilename());
3110
Daniel Dunbarb440f562010-08-02 02:38:21 +00003111 assert(Input.isFilename() && "Invalid input.");
3112 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003113
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003114 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003115 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003116}
3117
Daniel Dunbara3246a02009-03-18 08:07:30 +00003118void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003119 const InputInfo &Output,
3120 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003121 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003122 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003123 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003124 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003125
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003126 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003127 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003128 Arg *A = *it;
Daniel Dunbar2da02722009-03-19 07:55:12 +00003129 if (A->getOption().hasForwardToGCC()) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003130 // Don't forward any -g arguments to assembly steps.
3131 if (isa<AssembleJobAction>(JA) &&
3132 A->getOption().matches(options::OPT_g_Group))
3133 continue;
3134
Daniel Dunbar2da02722009-03-19 07:55:12 +00003135 // It is unfortunate that we have to claim here, as this means
3136 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003137 // platforms using a generic gcc, even if we are just using gcc
3138 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003139 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003140 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003141 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003142 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003143
Daniel Dunbar4e295052010-01-25 22:35:08 +00003144 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003145
3146 // If using a driver driver, force the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003147 const std::string &Arch = getToolChain().getArchName();
Bob Wilson6524dd32011-10-14 05:03:44 +00003148 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003149 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003150
3151 // FIXME: Remove these special cases.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003152 if (Arch == "powerpc")
3153 CmdArgs.push_back("ppc");
3154 else if (Arch == "powerpc64")
3155 CmdArgs.push_back("ppc64");
3156 else
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003157 CmdArgs.push_back(Args.MakeArgString(Arch));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003158 }
3159
Daniel Dunbar5716d872009-05-02 21:41:52 +00003160 // Try to force gcc to match the tool chain we want, if we recognize
3161 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003162 //
3163 // FIXME: The triple class should directly provide the information we want
3164 // here.
3165 if (Arch == "i386" || Arch == "powerpc")
Daniel Dunbar5716d872009-05-02 21:41:52 +00003166 CmdArgs.push_back("-m32");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003167 else if (Arch == "x86_64" || Arch == "powerpc64")
Daniel Dunbar5716d872009-05-02 21:41:52 +00003168 CmdArgs.push_back("-m64");
3169
Daniel Dunbarb440f562010-08-02 02:38:21 +00003170 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003171 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003172 CmdArgs.push_back(Output.getFilename());
3173 } else {
3174 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003175 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003176 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003177
Tony Linthicum76329bf2011-12-12 21:14:55 +00003178 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3179 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003180
3181 // Only pass -x if gcc will understand it; otherwise hope gcc
3182 // understands the suffix correctly. The main use case this would go
3183 // wrong in is for linker inputs if they happened to have an odd
3184 // suffix; really the only way to get this to happen is a command
3185 // like '-x foobar a.c' which will treat a.c like a linker input.
3186 //
3187 // FIXME: For the linker case specifically, can we safely convert
3188 // inputs into '-Wl,' options?
3189 for (InputInfoList::const_iterator
3190 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3191 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003192
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003193 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003194 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3195 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003196 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003197 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003198 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003199 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003200 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003201
Daniel Dunbara3246a02009-03-18 08:07:30 +00003202 if (types::canTypeBeUserSpecified(II.getType())) {
3203 CmdArgs.push_back("-x");
3204 CmdArgs.push_back(types::getTypeName(II.getType()));
3205 }
3206
Daniel Dunbarb440f562010-08-02 02:38:21 +00003207 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003208 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003209 else {
3210 const Arg &A = II.getInputArg();
3211
3212 // Reverse translate some rewritten options.
3213 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3214 CmdArgs.push_back("-lstdc++");
3215 continue;
3216 }
3217
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003218 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003219 A.render(Args, CmdArgs);
3220 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003221 }
3222
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003223 const std::string customGCCName = D.getCCCGenericGCCName();
3224 const char *GCCName;
3225 if (!customGCCName.empty())
3226 GCCName = customGCCName.c_str();
3227 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003228 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003229 } else
3230 GCCName = "gcc";
3231
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003232 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003233 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003234 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003235}
3236
Daniel Dunbar4e295052010-01-25 22:35:08 +00003237void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3238 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003239 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003240}
3241
Daniel Dunbar4e295052010-01-25 22:35:08 +00003242void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3243 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003244 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003245}
3246
Daniel Dunbar4e295052010-01-25 22:35:08 +00003247void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3248 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003249 const Driver &D = getToolChain().getDriver();
3250
Daniel Dunbar4e295052010-01-25 22:35:08 +00003251 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003252 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3253 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003254 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003255 else {
3256 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003257 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003258 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003259
Daniel Dunbar4e295052010-01-25 22:35:08 +00003260 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003261 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003262}
3263
Daniel Dunbar4e295052010-01-25 22:35:08 +00003264void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3265 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003266 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003267}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003268
Daniel Dunbar4e295052010-01-25 22:35:08 +00003269void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3270 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003271 // The types are (hopefully) good enough.
3272}
3273
Tony Linthicum76329bf2011-12-12 21:14:55 +00003274// Hexagon tools start.
3275void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3276 ArgStringList &CmdArgs) const {
3277
3278}
3279void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3280 const InputInfo &Output,
3281 const InputInfoList &Inputs,
3282 const ArgList &Args,
3283 const char *LinkingOutput) const {
3284
3285 const Driver &D = getToolChain().getDriver();
3286 ArgStringList CmdArgs;
3287
3288 std::string MarchString = "-march=";
3289 MarchString += getHexagonTargetCPU(Args);
3290 CmdArgs.push_back(Args.MakeArgString(MarchString));
3291
3292 RenderExtraToolArgs(JA, CmdArgs);
3293
3294 if (Output.isFilename()) {
3295 CmdArgs.push_back("-o");
3296 CmdArgs.push_back(Output.getFilename());
3297 } else {
3298 assert(Output.isNothing() && "Unexpected output");
3299 CmdArgs.push_back("-fsyntax-only");
3300 }
3301
3302
3303 // Only pass -x if gcc will understand it; otherwise hope gcc
3304 // understands the suffix correctly. The main use case this would go
3305 // wrong in is for linker inputs if they happened to have an odd
3306 // suffix; really the only way to get this to happen is a command
3307 // like '-x foobar a.c' which will treat a.c like a linker input.
3308 //
3309 // FIXME: For the linker case specifically, can we safely convert
3310 // inputs into '-Wl,' options?
3311 for (InputInfoList::const_iterator
3312 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3313 const InputInfo &II = *it;
3314
3315 // Don't try to pass LLVM or AST inputs to a generic gcc.
3316 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3317 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3318 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3319 << getToolChain().getTripleString();
3320 else if (II.getType() == types::TY_AST)
3321 D.Diag(clang::diag::err_drv_no_ast_support)
3322 << getToolChain().getTripleString();
3323
3324 if (II.isFilename())
3325 CmdArgs.push_back(II.getFilename());
3326 else
3327 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3328 II.getInputArg().render(Args, CmdArgs);
3329 }
3330
3331 const char *GCCName = "hexagon-as";
3332 const char *Exec =
3333 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3334 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3335
3336}
3337void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3338 ArgStringList &CmdArgs) const {
3339 // The types are (hopefully) good enough.
3340}
3341
3342void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3343 const InputInfo &Output,
3344 const InputInfoList &Inputs,
3345 const ArgList &Args,
3346 const char *LinkingOutput) const {
3347
3348 const Driver &D = getToolChain().getDriver();
3349 ArgStringList CmdArgs;
3350
3351 for (ArgList::const_iterator
3352 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3353 Arg *A = *it;
3354 if (A->getOption().hasForwardToGCC()) {
3355 // Don't forward any -g arguments to assembly steps.
3356 if (isa<AssembleJobAction>(JA) &&
3357 A->getOption().matches(options::OPT_g_Group))
3358 continue;
3359
3360 // It is unfortunate that we have to claim here, as this means
3361 // we will basically never report anything interesting for
3362 // platforms using a generic gcc, even if we are just using gcc
3363 // to get to the assembler.
3364 A->claim();
3365 A->render(Args, CmdArgs);
3366 }
3367 }
3368
3369 RenderExtraToolArgs(JA, CmdArgs);
3370
3371 // Add Arch Information
3372 Arg *A;
Sebastian Pop86500282012-01-13 20:37:10 +00003373 if ((A = getLastHexagonArchArg(Args))) {
3374 if (A->getOption().matches(options::OPT_m_Joined))
3375 A->render(Args, CmdArgs);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003376 else
Sebastian Pop86500282012-01-13 20:37:10 +00003377 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003378 }
Sebastian Pop86500282012-01-13 20:37:10 +00003379 else {
3380 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
3381 }
3382
Tony Linthicum76329bf2011-12-12 21:14:55 +00003383 CmdArgs.push_back("-mqdsp6-compat");
3384
3385 const char *GCCName;
3386 if (C.getDriver().CCCIsCXX)
3387 GCCName = "hexagon-g++";
3388 else
3389 GCCName = "hexagon-gcc";
3390 const char *Exec =
3391 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3392
3393 if (Output.isFilename()) {
3394 CmdArgs.push_back("-o");
3395 CmdArgs.push_back(Output.getFilename());
3396 }
3397
3398 for (InputInfoList::const_iterator
3399 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3400 const InputInfo &II = *it;
3401
3402 // Don't try to pass LLVM or AST inputs to a generic gcc.
3403 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3404 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3405 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3406 << getToolChain().getTripleString();
3407 else if (II.getType() == types::TY_AST)
3408 D.Diag(clang::diag::err_drv_no_ast_support)
3409 << getToolChain().getTripleString();
3410
3411 if (II.isFilename())
3412 CmdArgs.push_back(II.getFilename());
3413 else
3414 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3415 II.getInputArg().render(Args, CmdArgs);
3416 }
3417 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3418
3419}
3420// Hexagon tools end.
3421
3422
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003423const char *darwin::CC1::getCC1Name(types::ID Type) const {
3424 switch (Type) {
3425 default:
David Blaikie83d382b2011-09-23 05:06:16 +00003426 llvm_unreachable("Unexpected type for Darwin CC1 tool.");
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003427 case types::TY_Asm:
3428 case types::TY_C: case types::TY_CHeader:
3429 case types::TY_PP_C: case types::TY_PP_CHeader:
3430 return "cc1";
3431 case types::TY_ObjC: case types::TY_ObjCHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003432 case types::TY_PP_ObjC: case types::TY_PP_ObjC_Alias:
3433 case types::TY_PP_ObjCHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003434 return "cc1obj";
3435 case types::TY_CXX: case types::TY_CXXHeader:
3436 case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
3437 return "cc1plus";
3438 case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003439 case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXX_Alias:
3440 case types::TY_PP_ObjCXXHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003441 return "cc1objplus";
3442 }
3443}
3444
David Blaikie68e081d2011-12-20 02:48:34 +00003445void darwin::CC1::anchor() {}
3446
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003447const char *darwin::CC1::getBaseInputName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003448 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00003449 return Args.MakeArgString(
3450 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003451}
3452
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003453const char *darwin::CC1::getBaseInputStem(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003454 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003455 const char *Str = getBaseInputName(Args, Inputs);
3456
Chris Lattner906bb902011-01-16 08:14:11 +00003457 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003458 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003459
3460 return Str;
3461}
3462
3463const char *
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003464darwin::CC1::getDependencyFileName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003465 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003466 // FIXME: Think about this more.
3467 std::string Res;
3468
3469 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3470 std::string Str(OutputOpt->getValue(Args));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003471 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003472 } else {
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003473 Res = darwin::CC1::getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003474 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003475 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003476}
3477
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003478void darwin::CC1::RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const {
Eric Christopher84fbdb42011-08-19 00:30:14 +00003479 for (ArgStringList::iterator it = CmdArgs.begin(), ie = CmdArgs.end();
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003480 it != ie;) {
Chad Rosier2f818792011-08-18 17:56:32 +00003481
3482 StringRef Option = *it;
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003483 bool RemoveOption = false;
Chad Rosier30453862011-08-18 01:18:28 +00003484
Bob Wilson7ecbd322012-02-07 01:17:55 +00003485 // Erase both -fmodule-cache-path and its argument.
3486 if (Option.equals("-fmodule-cache-path") && it+2 != ie) {
3487 it = CmdArgs.erase(it, it+2);
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003488 ie = CmdArgs.end();
Chad Rosier30453862011-08-18 01:18:28 +00003489 continue;
3490 }
3491
Bob Wilson7ecbd322012-02-07 01:17:55 +00003492 // Remove unsupported -f options.
3493 if (Option.startswith("-f")) {
3494 // Remove -f/-fno- to reduce the number of cases.
3495 if (Option.startswith("-fno-"))
3496 Option = Option.substr(5);
3497 else
3498 Option = Option.substr(2);
3499 RemoveOption = llvm::StringSwitch<bool>(Option)
3500 .Case("altivec", true)
3501 .Case("modules", true)
3502 .Case("diagnostics-show-note-include-stack", true)
3503 .Default(false);
3504 }
3505
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003506 // Handle machine specific options.
3507 if (Option.startswith("-m")) {
3508 RemoveOption = llvm::StringSwitch<bool>(Option)
3509 .Case("-mthumb", true)
3510 .Case("-mno-thumb", true)
3511 .Case("-mno-fused-madd", true)
3512 .Case("-mlong-branch", true)
3513 .Case("-mlongcall", true)
3514 .Case("-mcpu=G4", true)
3515 .Case("-mcpu=G5", true)
3516 .Default(false);
3517 }
3518
3519 // Handle warning options.
3520 if (Option.startswith("-W")) {
3521 // Remove -W/-Wno- to reduce the number of cases.
3522 if (Option.startswith("-Wno-"))
3523 Option = Option.substr(5);
3524 else
3525 Option = Option.substr(2);
3526
3527 RemoveOption = llvm::StringSwitch<bool>(Option)
3528 .Case("address-of-temporary", true)
3529 .Case("ambiguous-member-template", true)
3530 .Case("analyzer-incompatible-plugin", true)
3531 .Case("array-bounds", true)
3532 .Case("array-bounds-pointer-arithmetic", true)
3533 .Case("bind-to-temporary-copy", true)
3534 .Case("bitwise-op-parentheses", true)
3535 .Case("bool-conversions", true)
3536 .Case("builtin-macro-redefined", true)
3537 .Case("c++-hex-floats", true)
3538 .Case("c++0x-compat", true)
3539 .Case("c++0x-extensions", true)
3540 .Case("c++0x-narrowing", true)
Richard Smith31ce7932011-10-13 23:32:09 +00003541 .Case("c++11-compat", true)
3542 .Case("c++11-extensions", true)
3543 .Case("c++11-narrowing", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003544 .Case("conditional-uninitialized", true)
3545 .Case("constant-conversion", true)
David Blaikieebcbe4b2012-03-15 04:50:32 +00003546 .Case("conversion-null", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003547 .Case("CFString-literal", true)
3548 .Case("constant-logical-operand", true)
3549 .Case("custom-atomic-properties", true)
3550 .Case("default-arg-special-member", true)
3551 .Case("delegating-ctor-cycles", true)
3552 .Case("delete-non-virtual-dtor", true)
3553 .Case("deprecated-implementations", true)
3554 .Case("deprecated-writable-strings", true)
3555 .Case("distributed-object-modifiers", true)
3556 .Case("duplicate-method-arg", true)
3557 .Case("dynamic-class-memaccess", true)
3558 .Case("enum-compare", true)
3559 .Case("exit-time-destructors", true)
3560 .Case("gnu", true)
3561 .Case("gnu-designator", true)
3562 .Case("header-hygiene", true)
3563 .Case("idiomatic-parentheses", true)
3564 .Case("ignored-qualifiers", true)
3565 .Case("implicit-atomic-properties", true)
3566 .Case("incompatible-pointer-types", true)
3567 .Case("incomplete-implementation", true)
3568 .Case("initializer-overrides", true)
3569 .Case("invalid-noreturn", true)
3570 .Case("invalid-token-paste", true)
Ivan Krasin31f74112011-10-06 02:46:34 +00003571 .Case("language-extension-token", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003572 .Case("literal-conversion", true)
3573 .Case("literal-range", true)
3574 .Case("local-type-template-args", true)
3575 .Case("logical-op-parentheses", true)
3576 .Case("method-signatures", true)
3577 .Case("microsoft", true)
3578 .Case("mismatched-tags", true)
3579 .Case("missing-method-return-type", true)
3580 .Case("non-pod-varargs", true)
3581 .Case("nonfragile-abi2", true)
3582 .Case("null-arithmetic", true)
3583 .Case("null-dereference", true)
3584 .Case("out-of-line-declaration", true)
3585 .Case("overriding-method-mismatch", true)
3586 .Case("readonly-setter-attrs", true)
3587 .Case("return-stack-address", true)
3588 .Case("self-assign", true)
3589 .Case("semicolon-before-method-body", true)
3590 .Case("sentinel", true)
3591 .Case("shift-overflow", true)
3592 .Case("shift-sign-overflow", true)
3593 .Case("sign-conversion", true)
3594 .Case("sizeof-array-argument", true)
3595 .Case("sizeof-pointer-memaccess", true)
3596 .Case("string-compare", true)
3597 .Case("super-class-method-mismatch", true)
3598 .Case("tautological-compare", true)
3599 .Case("typedef-redefinition", true)
3600 .Case("typename-missing", true)
3601 .Case("undefined-reinterpret-cast", true)
3602 .Case("unknown-warning-option", true)
3603 .Case("unnamed-type-template-args", true)
3604 .Case("unneeded-internal-declaration", true)
3605 .Case("unneeded-member-function", true)
3606 .Case("unused-comparison", true)
3607 .Case("unused-exception-parameter", true)
3608 .Case("unused-member-function", true)
3609 .Case("unused-result", true)
3610 .Case("vector-conversions", true)
3611 .Case("vla", true)
3612 .Case("used-but-marked-unused", true)
3613 .Case("weak-vtables", true)
3614 .Default(false);
3615 } // if (Option.startswith("-W"))
Chad Rosier30453862011-08-18 01:18:28 +00003616 if (RemoveOption) {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003617 it = CmdArgs.erase(it);
Chad Rosier23594f62011-08-17 18:51:56 +00003618 ie = CmdArgs.end();
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003619 } else {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003620 ++it;
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003621 }
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003622 }
3623}
3624
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003625void darwin::CC1::AddCC1Args(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003626 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003627 const Driver &D = getToolChain().getDriver();
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003628
3629 CheckCodeGenerationOptions(D, Args);
3630
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003631 // Derived from cc1 spec.
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003632 if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) &&
3633 !Args.hasArg(options::OPT_mdynamic_no_pic))
3634 CmdArgs.push_back("-fPIC");
3635
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003636 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3637 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3638 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3639 CmdArgs.push_back("-fno-builtin-strcat");
3640 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3641 CmdArgs.push_back("-fno-builtin-strcpy");
3642 }
3643
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003644 if (Args.hasArg(options::OPT_g_Flag) &&
3645 !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
3646 CmdArgs.push_back("-feliminate-unused-debug-symbols");
3647}
3648
3649void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3650 const InputInfoList &Inputs,
3651 const ArgStringList &OutputArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003652 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003653
3654 // Derived from cc1_options spec.
3655 if (Args.hasArg(options::OPT_fast) ||
3656 Args.hasArg(options::OPT_fastf) ||
3657 Args.hasArg(options::OPT_fastcp))
3658 CmdArgs.push_back("-O3");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003659
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003660 if (Arg *A = Args.getLastArg(options::OPT_pg))
3661 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003662 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003663 << A->getAsString(Args) << "-fomit-frame-pointer";
3664
3665 AddCC1Args(Args, CmdArgs);
3666
3667 if (!Args.hasArg(options::OPT_Q))
3668 CmdArgs.push_back("-quiet");
3669
3670 CmdArgs.push_back("-dumpbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003671 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003672
3673 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3674
3675 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
3676 Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
3677
3678 // FIXME: The goal is to use the user provided -o if that is our
3679 // final output, otherwise to drive from the original input
3680 // name. Find a clean way to go about this.
3681 if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
3682 Args.hasArg(options::OPT_o)) {
3683 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
3684 CmdArgs.push_back("-auxbase-strip");
3685 CmdArgs.push_back(OutputOpt->getValue(Args));
3686 } else {
3687 CmdArgs.push_back("-auxbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003688 CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003689 }
3690
3691 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3692
3693 Args.AddAllArgs(CmdArgs, options::OPT_O);
3694 // FIXME: -Wall is getting some special treatment. Investigate.
3695 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3696 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003697 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003698 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003699 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3700 // Honor -std-default.
3701 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3702 "-std=", /*Joined=*/true);
3703 }
3704
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003705 if (Args.hasArg(options::OPT_v))
3706 CmdArgs.push_back("-version");
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003707 if (Args.hasArg(options::OPT_pg) &&
3708 getToolChain().SupportsProfiling())
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003709 CmdArgs.push_back("-p");
3710 Args.AddLastArg(CmdArgs, options::OPT_p);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003711
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003712 // The driver treats -fsyntax-only specially.
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003713 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3714 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3715 // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
3716 // used to inhibit the default -fno-builtin-str{cat,cpy}.
3717 //
3718 // FIXME: Should we grow a better way to deal with "removing" args?
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003719 for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
3720 options::OPT_fsyntax_only),
3721 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003722 if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
3723 !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
3724 (*it)->claim();
3725 (*it)->render(Args, CmdArgs);
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003726 }
3727 }
3728 } else
3729 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003730
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003731 // Claim Clang only -f options, they aren't worth warning about.
3732 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3733
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003734 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3735 if (Args.hasArg(options::OPT_Qn))
3736 CmdArgs.push_back("-fno-ident");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003737
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003738 // FIXME: This isn't correct.
3739 //Args.AddLastArg(CmdArgs, options::OPT__help)
3740 //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
3741
3742 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3743
3744 // FIXME: Still don't get what is happening here. Investigate.
3745 Args.AddAllArgs(CmdArgs, options::OPT__param);
3746
3747 if (Args.hasArg(options::OPT_fmudflap) ||
3748 Args.hasArg(options::OPT_fmudflapth)) {
3749 CmdArgs.push_back("-fno-builtin");
3750 CmdArgs.push_back("-fno-merge-constants");
3751 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003752
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003753 if (Args.hasArg(options::OPT_coverage)) {
3754 CmdArgs.push_back("-fprofile-arcs");
3755 CmdArgs.push_back("-ftest-coverage");
3756 }
3757
3758 if (types::isCXX(Inputs[0].getType()))
3759 CmdArgs.push_back("-D__private_extern__=extern");
3760}
3761
3762void darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3763 const InputInfoList &Inputs,
3764 const ArgStringList &OutputArgs) const {
3765 // Derived from cpp_options
3766 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003767
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003768 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3769
3770 AddCC1Args(Args, CmdArgs);
3771
3772 // NOTE: The code below has some commonality with cpp_options, but
3773 // in classic gcc style ends up sending things in different
3774 // orders. This may be a good merge candidate once we drop pedantic
3775 // compatibility.
3776
3777 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003778 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003779 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003780 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3781 // Honor -std-default.
3782 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3783 "-std=", /*Joined=*/true);
3784 }
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003785 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3786 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003787
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003788 // The driver treats -fsyntax-only specially.
3789 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
3790
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003791 // Claim Clang only -f options, they aren't worth warning about.
3792 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3793
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003794 if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
3795 !Args.hasArg(options::OPT_fno_working_directory))
3796 CmdArgs.push_back("-fworking-directory");
3797
3798 Args.AddAllArgs(CmdArgs, options::OPT_O);
3799 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3800 if (Args.hasArg(options::OPT_save_temps))
3801 CmdArgs.push_back("-fpch-preprocess");
3802}
3803
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003804void darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003805 ArgStringList &CmdArgs,
Mike Stump11289f42009-09-09 15:08:12 +00003806 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003807 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003808
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003809 CheckPreprocessingOptions(D, Args);
3810
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003811 // Derived from cpp_unique_options.
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003812 // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
3813 Args.AddLastArg(CmdArgs, options::OPT_C);
3814 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003815 if (!Args.hasArg(options::OPT_Q))
3816 CmdArgs.push_back("-quiet");
3817 Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
Douglas Gregor64b046f2010-03-24 20:13:48 +00003818 Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003819 Args.AddLastArg(CmdArgs, options::OPT_v);
3820 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
3821 Args.AddLastArg(CmdArgs, options::OPT_P);
3822
3823 // FIXME: Handle %I properly.
3824 if (getToolChain().getArchName() == "x86_64") {
3825 CmdArgs.push_back("-imultilib");
3826 CmdArgs.push_back("x86_64");
3827 }
3828
3829 if (Args.hasArg(options::OPT_MD)) {
3830 CmdArgs.push_back("-MD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003831 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003832 }
3833
3834 if (Args.hasArg(options::OPT_MMD)) {
3835 CmdArgs.push_back("-MMD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003836 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003837 }
3838
3839 Args.AddLastArg(CmdArgs, options::OPT_M);
3840 Args.AddLastArg(CmdArgs, options::OPT_MM);
3841 Args.AddAllArgs(CmdArgs, options::OPT_MF);
3842 Args.AddLastArg(CmdArgs, options::OPT_MG);
3843 Args.AddLastArg(CmdArgs, options::OPT_MP);
3844 Args.AddAllArgs(CmdArgs, options::OPT_MQ);
3845 Args.AddAllArgs(CmdArgs, options::OPT_MT);
3846 if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
3847 (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
3848 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3849 CmdArgs.push_back("-MQ");
3850 CmdArgs.push_back(OutputOpt->getValue(Args));
3851 }
3852 }
3853
3854 Args.AddLastArg(CmdArgs, options::OPT_remap);
3855 if (Args.hasArg(options::OPT_g3))
3856 CmdArgs.push_back("-dD");
3857 Args.AddLastArg(CmdArgs, options::OPT_H);
3858
3859 AddCPPArgs(Args, CmdArgs);
3860
3861 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
3862 Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
3863
3864 for (InputInfoList::const_iterator
3865 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3866 const InputInfo &II = *it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003867
Daniel Dunbarb440f562010-08-02 02:38:21 +00003868 CmdArgs.push_back(II.getFilename());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003869 }
3870
3871 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
3872 options::OPT_Xpreprocessor);
3873
3874 if (Args.hasArg(options::OPT_fmudflap)) {
3875 CmdArgs.push_back("-D_MUDFLAP");
3876 CmdArgs.push_back("-include");
3877 CmdArgs.push_back("mf-runtime.h");
3878 }
3879
3880 if (Args.hasArg(options::OPT_fmudflapth)) {
3881 CmdArgs.push_back("-D_MUDFLAP");
3882 CmdArgs.push_back("-D_MUDFLAPTH");
3883 CmdArgs.push_back("-include");
3884 CmdArgs.push_back("mf-runtime.h");
3885 }
3886}
3887
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003888void darwin::CC1::AddCPPArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003889 ArgStringList &CmdArgs) const {
3890 // Derived from cpp spec.
3891
3892 if (Args.hasArg(options::OPT_static)) {
3893 // The gcc spec is broken here, it refers to dynamic but
3894 // that has been translated. Start by being bug compatible.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003895
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003896 // if (!Args.hasArg(arglist.parser.dynamicOption))
3897 CmdArgs.push_back("-D__STATIC__");
3898 } else
3899 CmdArgs.push_back("-D__DYNAMIC__");
3900
3901 if (Args.hasArg(options::OPT_pthread))
3902 CmdArgs.push_back("-D_REENTRANT");
3903}
3904
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003905void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003906 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003907 const InputInfoList &Inputs,
3908 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003909 const char *LinkingOutput) const {
3910 ArgStringList CmdArgs;
3911
3912 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3913
3914 CmdArgs.push_back("-E");
3915
3916 if (Args.hasArg(options::OPT_traditional) ||
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003917 Args.hasArg(options::OPT_traditional_cpp))
3918 CmdArgs.push_back("-traditional-cpp");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003919
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003920 ArgStringList OutputArgs;
Daniel Dunbarb440f562010-08-02 02:38:21 +00003921 assert(Output.isFilename() && "Unexpected CC1 output.");
3922 OutputArgs.push_back("-o");
3923 OutputArgs.push_back(Output.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003924
Joerg Sonnenbergerb86f5f42011-03-06 23:31:01 +00003925 if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
Daniel Dunbarf64f5302009-03-29 22:27:40 +00003926 AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3927 } else {
3928 AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
3929 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3930 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003931
Daniel Dunbar6a8803a2009-04-03 01:27:06 +00003932 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3933
Chad Rosierc31e48d2011-09-08 00:38:00 +00003934 RemoveCC1UnsupportedArgs(CmdArgs);
3935
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003936 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003937 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003938 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003939 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003940}
3941
3942void darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003943 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003944 const InputInfoList &Inputs,
3945 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003946 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003947 const Driver &D = getToolChain().getDriver();
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003948 ArgStringList CmdArgs;
3949
3950 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3951
Bob Wilson0090df22012-04-01 23:03:29 +00003952 // Silence warning about unused --serialize-diagnostics
3953 Args.ClaimAllArgs(options::OPT__serialize_diags);
3954
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003955 types::ID InputType = Inputs[0].getType();
David Blaikie747ff7e2012-04-04 20:43:14 +00003956 if (const Arg *A = Args.getLastArg(options::OPT_traditional))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003957 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003958 << A->getAsString(Args) << "-E";
3959
Daniel Dunbar24e52992010-06-07 23:28:45 +00003960 if (JA.getType() == types::TY_LLVM_IR ||
3961 JA.getType() == types::TY_LTO_IR)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003962 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003963 else if (JA.getType() == types::TY_LLVM_BC ||
3964 JA.getType() == types::TY_LTO_BC)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003965 CmdArgs.push_back("-emit-llvm-bc");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003966 else if (Output.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003967 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003968 << getToolChain().getTripleString();
Daniel Dunbarbcd554f2010-02-11 17:33:45 +00003969 else if (JA.getType() != types::TY_PP_Asm &&
3970 JA.getType() != types::TY_PCH)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003971 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003972 << getTypeName(JA.getType());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003973
3974 ArgStringList OutputArgs;
3975 if (Output.getType() != types::TY_PCH) {
3976 OutputArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00003977 if (Output.isNothing())
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003978 OutputArgs.push_back("/dev/null");
3979 else
3980 OutputArgs.push_back(Output.getFilename());
3981 }
3982
3983 // There is no need for this level of compatibility, but it makes
3984 // diffing easier.
3985 bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
3986 Args.hasArg(options::OPT_S));
3987
3988 if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003989 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003990 if (OutputArgsEarly) {
3991 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3992 } else {
3993 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
3994 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3995 }
3996 } else {
3997 CmdArgs.push_back("-fpreprocessed");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003998
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003999 for (InputInfoList::const_iterator
4000 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4001 const InputInfo &II = *it;
4002
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004003 // Reject AST inputs.
4004 if (II.getType() == types::TY_AST) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004005 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004006 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004007 return;
4008 }
4009
Daniel Dunbarb440f562010-08-02 02:38:21 +00004010 CmdArgs.push_back(II.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004011 }
4012
4013 if (OutputArgsEarly) {
4014 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4015 } else {
4016 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4017 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4018 }
4019 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004020
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004021 if (Output.getType() == types::TY_PCH) {
4022 assert(Output.isFilename() && "Invalid PCH output.");
4023
4024 CmdArgs.push_back("-o");
4025 // NOTE: gcc uses a temp .s file for this, but there doesn't seem
4026 // to be a good reason.
Chad Rosier96d690c2011-08-01 19:58:48 +00004027 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004028 D.GetTemporaryPath("cc", "s"));
Chad Rosier96d690c2011-08-01 19:58:48 +00004029 C.addTempFile(TmpPath);
4030 CmdArgs.push_back(TmpPath);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004031
Eric Christopher84fbdb42011-08-19 00:30:14 +00004032 // If we're emitting a pch file with the last 4 characters of ".pth"
4033 // and falling back to llvm-gcc we want to use ".gch" instead.
4034 std::string OutputFile(Output.getFilename());
4035 size_t loc = OutputFile.rfind(".pth");
4036 if (loc != std::string::npos)
4037 OutputFile.replace(loc, 4, ".gch");
4038 const char *Tmp = C.getArgs().MakeArgString("--output-pch="+OutputFile);
4039 CmdArgs.push_back(Tmp);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004040 }
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004041
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00004042 RemoveCC1UnsupportedArgs(CmdArgs);
4043
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004044 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004045 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004046 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004047 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004048}
4049
Daniel Dunbarbe220842009-03-20 16:06:39 +00004050void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004051 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004052 const InputInfoList &Inputs,
4053 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004054 const char *LinkingOutput) const {
4055 ArgStringList CmdArgs;
4056
4057 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4058 const InputInfo &Input = Inputs[0];
4059
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004060 // Determine the original source input.
4061 const Action *SourceAction = &JA;
4062 while (SourceAction->getKind() != Action::InputClass) {
4063 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4064 SourceAction = SourceAction->getInputs()[0];
4065 }
4066
4067 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004068 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004069 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004070 if (Args.hasArg(options::OPT_gstabs))
4071 CmdArgs.push_back("--gstabs");
4072 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004073 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004074 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004075
Daniel Dunbarbe220842009-03-20 16:06:39 +00004076 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004077 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004078
Daniel Dunbar6d484762010-07-22 01:47:22 +00004079 // Use -force_cpusubtype_ALL on x86 by default.
4080 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4081 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004082 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4083 CmdArgs.push_back("-force_cpusubtype_ALL");
4084
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004085 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
4086 (Args.hasArg(options::OPT_mkernel) ||
Daniel Dunbarbe220842009-03-20 16:06:39 +00004087 Args.hasArg(options::OPT_static) ||
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004088 Args.hasArg(options::OPT_fapple_kext)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004089 CmdArgs.push_back("-static");
4090
Daniel Dunbarbe220842009-03-20 16:06:39 +00004091 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4092 options::OPT_Xassembler);
4093
4094 assert(Output.isFilename() && "Unexpected lipo output.");
4095 CmdArgs.push_back("-o");
4096 CmdArgs.push_back(Output.getFilename());
4097
Daniel Dunbarb440f562010-08-02 02:38:21 +00004098 assert(Input.isFilename() && "Invalid input.");
4099 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004100
4101 // asm_final spec is empty.
4102
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004103 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004104 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004105 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004106}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004107
David Blaikie68e081d2011-12-20 02:48:34 +00004108void darwin::DarwinTool::anchor() {}
4109
Daniel Dunbare9ded432009-09-09 18:36:20 +00004110void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4111 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004112 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004113
Daniel Dunbarc1964212009-03-26 16:23:12 +00004114 // Derived from darwin_arch spec.
4115 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004116 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004117
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004118 // FIXME: Is this needed anymore?
4119 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004120 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004121}
4122
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004123void darwin::Link::AddLinkArgs(Compilation &C,
4124 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004125 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004126 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004127 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004128
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004129 unsigned Version[3] = { 0, 0, 0 };
4130 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4131 bool HadExtra;
4132 if (!Driver::GetReleaseVersion(A->getValue(Args), Version[0],
4133 Version[1], Version[2], HadExtra) ||
4134 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004135 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004136 << A->getAsString(Args);
4137 }
4138
4139 // Newer linkers support -demangle, pass it if supported and not disabled by
4140 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004141 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004142 // Don't pass -demangle to ld_classic.
4143 //
4144 // FIXME: This is a temporary workaround, ld should be handling this.
4145 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4146 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004147 if (getToolChain().getArch() == llvm::Triple::x86) {
4148 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4149 options::OPT_Wl_COMMA),
4150 ie = Args.filtered_end(); it != ie; ++it) {
4151 const Arg *A = *it;
4152 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004153 if (StringRef(A->getValue(Args, i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004154 UsesLdClassic = true;
4155 }
4156 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004157 if (!UsesLdClassic)
4158 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004159 }
4160
Daniel Dunbaref889c72011-06-21 20:55:11 +00004161 // If we are using LTO, then automatically create a temporary file path for
4162 // the linker to use, so that it's lifetime will extend past a possible
4163 // dsymutil step.
Daniel Dunbar3d125d32011-06-21 21:18:32 +00004164 if (Version[0] >= 116 && D.IsUsingLTO(Args)) {
Daniel Dunbaref889c72011-06-21 20:55:11 +00004165 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004166 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Daniel Dunbaref889c72011-06-21 20:55:11 +00004167 C.addTempFile(TmpPath);
4168 CmdArgs.push_back("-object_path_lto");
4169 CmdArgs.push_back(TmpPath);
4170 }
4171
Daniel Dunbarc1964212009-03-26 16:23:12 +00004172 // Derived from the "link" spec.
4173 Args.AddAllArgs(CmdArgs, options::OPT_static);
4174 if (!Args.hasArg(options::OPT_static))
4175 CmdArgs.push_back("-dynamic");
4176 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4177 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4178 // here. How do we wish to handle such things?
4179 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004180
Daniel Dunbarc1964212009-03-26 16:23:12 +00004181 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004182 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004183 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004184 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004185
4186 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4187 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4188 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4189
4190 Arg *A;
4191 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4192 (A = Args.getLastArg(options::OPT_current__version)) ||
4193 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004194 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004195 << A->getAsString(Args) << "-dynamiclib";
4196
4197 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4198 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4199 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4200 } else {
4201 CmdArgs.push_back("-dylib");
4202
4203 Arg *A;
4204 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4205 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4206 (A = Args.getLastArg(options::OPT_client__name)) ||
4207 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4208 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4209 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004210 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004211 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004212
Daniel Dunbarc1964212009-03-26 16:23:12 +00004213 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4214 "-dylib_compatibility_version");
4215 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4216 "-dylib_current_version");
4217
Daniel Dunbara48823f2010-01-22 02:04:52 +00004218 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004219
4220 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4221 "-dylib_install_name");
4222 }
4223
4224 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4225 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4226 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004227 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004228 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004229 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4230 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4231 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4232 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4233 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4234 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004235 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004236 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4237 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4238 Args.AddAllArgs(CmdArgs, options::OPT_init);
4239
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004240 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004241 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004242
4243 // If we had an explicit -mios-simulator-version-min argument, honor that,
4244 // otherwise use the traditional deployment targets. We can't just check the
4245 // is-sim attribute because existing code follows this path, and the linker
4246 // may not handle the argument.
4247 //
4248 // FIXME: We may be able to remove this, once we can verify no one depends on
4249 // it.
4250 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4251 CmdArgs.push_back("-ios_simulator_version_min");
4252 else if (DarwinTC.isTargetIPhoneOS())
4253 CmdArgs.push_back("-iphoneos_version_min");
4254 else
4255 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004256 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004257
Daniel Dunbarc1964212009-03-26 16:23:12 +00004258 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4259 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4260 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4261 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4262 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004263
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004264 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4265 options::OPT_fno_pie,
4266 options::OPT_fno_PIE)) {
4267 if (A->getOption().matches(options::OPT_fpie) ||
4268 A->getOption().matches(options::OPT_fPIE))
4269 CmdArgs.push_back("-pie");
4270 else
4271 CmdArgs.push_back("-no_pie");
4272 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004273
4274 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4275 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4276 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4277 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4278 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4279 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4280 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4281 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4282 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4283 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4284 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4285 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4286 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4287 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4288 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4289 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004290
Daniel Dunbar84384642011-05-02 21:03:47 +00004291 // Give --sysroot= preference, over the Apple specific behavior to also use
4292 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004293 StringRef sysroot = C.getSysRoot();
4294 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004295 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004296 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004297 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4298 CmdArgs.push_back("-syslibroot");
4299 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004300 }
4301
Daniel Dunbarc1964212009-03-26 16:23:12 +00004302 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4303 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4304 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4305 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4306 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004307 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004308 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4309 Args.AddAllArgs(CmdArgs, options::OPT_y);
4310 Args.AddLastArg(CmdArgs, options::OPT_w);
4311 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4312 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4313 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4314 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4315 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4316 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4317 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4318 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4319 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4320 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4321 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4322 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4323}
4324
4325void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004326 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004327 const InputInfoList &Inputs,
4328 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004329 const char *LinkingOutput) const {
4330 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004331
Daniel Dunbarc1964212009-03-26 16:23:12 +00004332 // The logic here is derived from gcc's behavior; most of which
4333 // comes from specs (starting with link_command). Consult gcc for
4334 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004335 ArgStringList CmdArgs;
4336
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004337 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4338 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4339 options::OPT_ccc_arcmt_migrate)) {
4340 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4341 (*I)->claim();
4342 const char *Exec =
4343 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4344 CmdArgs.push_back(Output.getFilename());
4345 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4346 return;
4347 }
4348
Daniel Dunbarc1964212009-03-26 16:23:12 +00004349 // I'm not sure why this particular decomposition exists in gcc, but
4350 // we follow suite for ease of comparison.
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004351 AddLinkArgs(C, Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004352
Daniel Dunbarc1964212009-03-26 16:23:12 +00004353 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4354 Args.AddAllArgs(CmdArgs, options::OPT_s);
4355 Args.AddAllArgs(CmdArgs, options::OPT_t);
4356 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4357 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004358 Args.AddLastArg(CmdArgs, options::OPT_e);
4359 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4360 Args.AddAllArgs(CmdArgs, options::OPT_r);
4361
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004362 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4363 // members of static archive libraries which implement Objective-C classes or
4364 // categories.
4365 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4366 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004367
Daniel Dunbarc1964212009-03-26 16:23:12 +00004368 CmdArgs.push_back("-o");
4369 CmdArgs.push_back(Output.getFilename());
4370
Chad Rosier06fd3c62012-05-16 23:45:12 +00004371 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004372 !Args.hasArg(options::OPT_nostartfiles)) {
4373 // Derived from startfile spec.
4374 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004375 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004376 if (getDarwinToolChain().isTargetIOSSimulator()) {
4377 // The simulator doesn't have a versioned crt1 file.
4378 CmdArgs.push_back("-ldylib1.o");
4379 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004380 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4381 CmdArgs.push_back("-ldylib1.o");
4382 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004383 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004384 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004385 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004386 CmdArgs.push_back("-ldylib1.10.5.o");
4387 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004388 } else {
4389 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004390 if (!Args.hasArg(options::OPT_static)) {
4391 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004392 if (getDarwinToolChain().isTargetIOSSimulator()) {
4393 // The simulator doesn't have a versioned crt1 file.
4394 CmdArgs.push_back("-lbundle1.o");
4395 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004396 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4397 CmdArgs.push_back("-lbundle1.o");
4398 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004399 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004400 CmdArgs.push_back("-lbundle1.o");
4401 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004402 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004403 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004404 if (Args.hasArg(options::OPT_pg) &&
4405 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004406 if (Args.hasArg(options::OPT_static) ||
4407 Args.hasArg(options::OPT_object) ||
4408 Args.hasArg(options::OPT_preload)) {
4409 CmdArgs.push_back("-lgcrt0.o");
4410 } else {
4411 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004412
Daniel Dunbarc1964212009-03-26 16:23:12 +00004413 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004414 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004415 // By default on OS X 10.8 and later, we don't link with a crt1.o
4416 // file and the linker knows to use _main as the entry point. But,
4417 // when compiling with -pg, we need to link with the gcrt1.o file,
4418 // so pass the -no_new_main option to tell the linker to use the
4419 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004420 if (getDarwinToolChain().isTargetMacOS() &&
4421 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4422 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004423 } else {
4424 if (Args.hasArg(options::OPT_static) ||
4425 Args.hasArg(options::OPT_object) ||
4426 Args.hasArg(options::OPT_preload)) {
4427 CmdArgs.push_back("-lcrt0.o");
4428 } else {
4429 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004430 if (getDarwinToolChain().isTargetIOSSimulator()) {
4431 // The simulator doesn't have a versioned crt1 file.
4432 CmdArgs.push_back("-lcrt1.o");
4433 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004434 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4435 CmdArgs.push_back("-lcrt1.o");
4436 else
4437 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004438 } else {
4439 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4440 CmdArgs.push_back("-lcrt1.o");
4441 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4442 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004443 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004444 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004445
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004446 // darwin_crt2 spec is empty.
4447 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004448 }
4449 }
4450 }
4451 }
4452
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004453 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4454 Args.hasArg(options::OPT_shared_libgcc) &&
4455 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004456 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004457 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004458 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004459 }
4460 }
4461
4462 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004463
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004464 // If we're building a dynamic lib with -faddress-sanitizer, unresolved
4465 // symbols may appear. Mark all of them as dynamic_lookup.
4466 // Linking executables is handled in lib/Driver/ToolChains.cpp.
4467 if (Args.hasFlag(options::OPT_faddress_sanitizer,
4468 options::OPT_fno_address_sanitizer, false)) {
4469 if (Args.hasArg(options::OPT_dynamiclib) ||
4470 Args.hasArg(options::OPT_bundle)) {
4471 CmdArgs.push_back("-undefined");
4472 CmdArgs.push_back("dynamic_lookup");
4473 }
4474 }
4475
Daniel Dunbarc1964212009-03-26 16:23:12 +00004476 if (Args.hasArg(options::OPT_fopenmp))
4477 // This is more complicated in gcc...
4478 CmdArgs.push_back("-lgomp");
4479
Douglas Gregor9295df02012-05-15 21:00:27 +00004480 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4481
Bob Wilson16d93952012-05-15 18:57:39 +00004482 if (isObjCRuntimeLinked(Args) &&
4483 !Args.hasArg(options::OPT_nostdlib) &&
4484 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004485 // Avoid linking compatibility stubs on i386 mac.
4486 if (!getDarwinToolChain().isTargetMacOS() ||
4487 getDarwinToolChain().getArchName() != "i386") {
4488 // If we don't have ARC or subscripting runtime support, link in the
4489 // runtime stubs. We have to do this *before* adding any of the normal
4490 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004491 ObjCRuntime runtime =
4492 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004493 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004494 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004495 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004496 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004497 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004498 CmdArgs.push_back("-framework");
4499 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004500 // Link libobj.
4501 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004502 }
John McCall31168b02011-06-15 23:02:42 +00004503
Daniel Dunbarc1964212009-03-26 16:23:12 +00004504 if (LinkingOutput) {
4505 CmdArgs.push_back("-arch_multiple");
4506 CmdArgs.push_back("-final_output");
4507 CmdArgs.push_back(LinkingOutput);
4508 }
4509
Daniel Dunbarc1964212009-03-26 16:23:12 +00004510 if (Args.hasArg(options::OPT_fnested_functions))
4511 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004512
Daniel Dunbarc1964212009-03-26 16:23:12 +00004513 if (!Args.hasArg(options::OPT_nostdlib) &&
4514 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004515 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004516 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004517
Daniel Dunbarc1964212009-03-26 16:23:12 +00004518 // link_ssp spec is empty.
4519
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004520 // Let the tool chain choose which runtime library to link.
4521 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004522 }
4523
Chad Rosier06fd3c62012-05-16 23:45:12 +00004524 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004525 !Args.hasArg(options::OPT_nostartfiles)) {
4526 // endfile_spec is empty.
4527 }
4528
4529 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4530 Args.AddAllArgs(CmdArgs, options::OPT_F);
4531
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004532 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004533 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004534 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004535}
4536
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004537void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004538 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004539 const InputInfoList &Inputs,
4540 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004541 const char *LinkingOutput) const {
4542 ArgStringList CmdArgs;
4543
4544 CmdArgs.push_back("-create");
4545 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004546
4547 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004548 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004549
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004550 for (InputInfoList::const_iterator
4551 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4552 const InputInfo &II = *it;
4553 assert(II.isFilename() && "Unexpected lipo input.");
4554 CmdArgs.push_back(II.getFilename());
4555 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004556 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004557 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004558 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004559}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004560
Daniel Dunbar88299622010-06-04 18:28:36 +00004561void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004562 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004563 const InputInfoList &Inputs,
4564 const ArgList &Args,
4565 const char *LinkingOutput) const {
4566 ArgStringList CmdArgs;
4567
Daniel Dunbareb86b042011-05-09 17:23:16 +00004568 CmdArgs.push_back("-o");
4569 CmdArgs.push_back(Output.getFilename());
4570
Daniel Dunbar88299622010-06-04 18:28:36 +00004571 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4572 const InputInfo &Input = Inputs[0];
4573 assert(Input.isFilename() && "Unexpected dsymutil input.");
4574 CmdArgs.push_back(Input.getFilename());
4575
Daniel Dunbar88299622010-06-04 18:28:36 +00004576 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004577 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004578 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004579}
4580
Eric Christopher551ef452011-08-23 17:56:55 +00004581void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4582 const InputInfo &Output,
4583 const InputInfoList &Inputs,
4584 const ArgList &Args,
4585 const char *LinkingOutput) const {
4586 ArgStringList CmdArgs;
4587 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004588 CmdArgs.push_back("--debug-info");
4589 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004590 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004591
4592 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4593 const InputInfo &Input = Inputs[0];
4594 assert(Input.isFilename() && "Unexpected verify input");
4595
4596 // Grabbing the output of the earlier dsymutil run.
4597 CmdArgs.push_back(Input.getFilename());
4598
4599 const char *Exec =
4600 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4601 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4602}
4603
David Chisnallf571cde2012-02-15 13:39:01 +00004604void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4605 const InputInfo &Output,
4606 const InputInfoList &Inputs,
4607 const ArgList &Args,
4608 const char *LinkingOutput) const {
4609 ArgStringList CmdArgs;
4610
4611 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4612 options::OPT_Xassembler);
4613
4614 CmdArgs.push_back("-o");
4615 CmdArgs.push_back(Output.getFilename());
4616
4617 for (InputInfoList::const_iterator
4618 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4619 const InputInfo &II = *it;
4620 CmdArgs.push_back(II.getFilename());
4621 }
4622
4623 const char *Exec =
4624 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4625 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4626}
4627
4628
4629void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4630 const InputInfo &Output,
4631 const InputInfoList &Inputs,
4632 const ArgList &Args,
4633 const char *LinkingOutput) const {
4634 // FIXME: Find a real GCC, don't hard-code versions here
4635 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4636 const llvm::Triple &T = getToolChain().getTriple();
4637 std::string LibPath = "/usr/lib/";
4638 llvm::Triple::ArchType Arch = T.getArch();
4639 switch (Arch) {
4640 case llvm::Triple::x86:
4641 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4642 T.getOSName()).str() + "/4.5.2/";
4643 break;
4644 case llvm::Triple::x86_64:
4645 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4646 T.getOSName()).str();
4647 GCCLibPath += "/4.5.2/amd64/";
4648 LibPath += "amd64/";
4649 break;
4650 default:
4651 assert(0 && "Unsupported architecture");
4652 }
4653
4654 ArgStringList CmdArgs;
4655
David Chisnall272a0712012-02-29 15:06:12 +00004656 // Demangle C++ names in errors
4657 CmdArgs.push_back("-C");
4658
David Chisnallf571cde2012-02-15 13:39:01 +00004659 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4660 (!Args.hasArg(options::OPT_shared))) {
4661 CmdArgs.push_back("-e");
4662 CmdArgs.push_back("_start");
4663 }
4664
4665 if (Args.hasArg(options::OPT_static)) {
4666 CmdArgs.push_back("-Bstatic");
4667 CmdArgs.push_back("-dn");
4668 } else {
4669 CmdArgs.push_back("-Bdynamic");
4670 if (Args.hasArg(options::OPT_shared)) {
4671 CmdArgs.push_back("-shared");
4672 } else {
4673 CmdArgs.push_back("--dynamic-linker");
4674 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4675 }
4676 }
4677
4678 if (Output.isFilename()) {
4679 CmdArgs.push_back("-o");
4680 CmdArgs.push_back(Output.getFilename());
4681 } else {
4682 assert(Output.isNothing() && "Invalid output.");
4683 }
4684
4685 if (!Args.hasArg(options::OPT_nostdlib) &&
4686 !Args.hasArg(options::OPT_nostartfiles)) {
4687 if (!Args.hasArg(options::OPT_shared)) {
4688 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4689 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004690 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004691 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4692 } else {
4693 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004694 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4695 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004696 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004697 if (getToolChain().getDriver().CCCIsCXX)
4698 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004699 }
4700
4701 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4702
4703 Args.AddAllArgs(CmdArgs, options::OPT_L);
4704 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4705 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004706 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00004707
4708 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4709
4710 if (!Args.hasArg(options::OPT_nostdlib) &&
4711 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00004712 if (getToolChain().getDriver().CCCIsCXX)
4713 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00004714 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004715 if (!Args.hasArg(options::OPT_shared)) {
4716 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00004717 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00004718 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004719 }
David Chisnallf571cde2012-02-15 13:39:01 +00004720 }
4721
4722 if (!Args.hasArg(options::OPT_nostdlib) &&
4723 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00004724 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004725 }
David Chisnall96de9932012-02-16 16:00:47 +00004726 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004727
4728 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4729
4730 const char *Exec =
4731 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4732 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4733}
4734
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004735void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004736 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004737 const InputInfoList &Inputs,
4738 const ArgList &Args,
4739 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004740 ArgStringList CmdArgs;
4741
4742 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4743 options::OPT_Xassembler);
4744
4745 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004746 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004747
4748 for (InputInfoList::const_iterator
4749 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4750 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004751 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004752 }
4753
4754 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004755 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004756 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004757}
4758
4759void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004760 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004761 const InputInfoList &Inputs,
4762 const ArgList &Args,
4763 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004764 ArgStringList CmdArgs;
4765
4766 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004767 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004768 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004769 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004770 }
4771
4772 if (Args.hasArg(options::OPT_static)) {
4773 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004774 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004775 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004776// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004777 CmdArgs.push_back("-Bdynamic");
4778 if (Args.hasArg(options::OPT_shared)) {
4779 CmdArgs.push_back("-shared");
4780 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00004781 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004782 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4783 }
4784 }
4785
Daniel Dunbarb440f562010-08-02 02:38:21 +00004786 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004787 CmdArgs.push_back("-o");
4788 CmdArgs.push_back(Output.getFilename());
4789 } else {
4790 assert(Output.isNothing() && "Invalid output.");
4791 }
4792
4793 if (!Args.hasArg(options::OPT_nostdlib) &&
4794 !Args.hasArg(options::OPT_nostartfiles)) {
4795 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004796 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004797 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004798 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004799 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004800 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004801 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004802 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004803 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004804 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004805 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00004806 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004807 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004808 }
4809
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004810 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4811 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004812 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004813
4814 Args.AddAllArgs(CmdArgs, options::OPT_L);
4815 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4816 Args.AddAllArgs(CmdArgs, options::OPT_e);
4817
Daniel Dunbar54423b22010-09-17 00:24:54 +00004818 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004819
4820 if (!Args.hasArg(options::OPT_nostdlib) &&
4821 !Args.hasArg(options::OPT_nodefaultlibs)) {
4822 // FIXME: For some reason GCC passes -lgcc before adding
4823 // the default system libraries. Just mimic this for now.
4824 CmdArgs.push_back("-lgcc");
4825
4826 if (Args.hasArg(options::OPT_pthread))
4827 CmdArgs.push_back("-pthread");
4828 if (!Args.hasArg(options::OPT_shared))
4829 CmdArgs.push_back("-lc");
4830 CmdArgs.push_back("-lgcc");
4831 }
4832
4833 if (!Args.hasArg(options::OPT_nostdlib) &&
4834 !Args.hasArg(options::OPT_nostartfiles)) {
4835 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004836 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004837 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004838 }
4839
Bill Wendling08760582011-06-27 19:15:03 +00004840 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00004841
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004842 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004843 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004844 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004845}
4846
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004847void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004848 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004849 const InputInfoList &Inputs,
4850 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00004851 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004852 ArgStringList CmdArgs;
4853
4854 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4855 options::OPT_Xassembler);
4856
4857 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004858 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004859
4860 for (InputInfoList::const_iterator
4861 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4862 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004863 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004864 }
4865
4866 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004867 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004868 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004869}
4870
4871void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004872 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004873 const InputInfoList &Inputs,
4874 const ArgList &Args,
4875 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004876 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004877 ArgStringList CmdArgs;
4878
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004879 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004880 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004881 CmdArgs.push_back("-e");
4882 CmdArgs.push_back("__start");
4883 }
4884
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004885 if (Args.hasArg(options::OPT_static)) {
4886 CmdArgs.push_back("-Bstatic");
4887 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00004888 if (Args.hasArg(options::OPT_rdynamic))
4889 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004890 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004891 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004892 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004893 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004894 } else {
4895 CmdArgs.push_back("-dynamic-linker");
4896 CmdArgs.push_back("/usr/libexec/ld.so");
4897 }
4898 }
4899
Daniel Dunbarb440f562010-08-02 02:38:21 +00004900 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004901 CmdArgs.push_back("-o");
4902 CmdArgs.push_back(Output.getFilename());
4903 } else {
4904 assert(Output.isNothing() && "Invalid output.");
4905 }
4906
4907 if (!Args.hasArg(options::OPT_nostdlib) &&
4908 !Args.hasArg(options::OPT_nostartfiles)) {
4909 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00004910 if (Args.hasArg(options::OPT_pg))
4911 CmdArgs.push_back(Args.MakeArgString(
4912 getToolChain().GetFilePath("gcrt0.o")));
4913 else
4914 CmdArgs.push_back(Args.MakeArgString(
4915 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004916 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004917 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004918 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004919 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004920 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004921 }
4922 }
4923
Edward O'Callaghan5c521462009-10-28 15:13:08 +00004924 std::string Triple = getToolChain().getTripleString();
4925 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004926 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004927 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004928 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004929
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004930 Args.AddAllArgs(CmdArgs, options::OPT_L);
4931 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4932 Args.AddAllArgs(CmdArgs, options::OPT_e);
4933
Daniel Dunbar54423b22010-09-17 00:24:54 +00004934 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004935
4936 if (!Args.hasArg(options::OPT_nostdlib) &&
4937 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004938 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004939 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00004940 if (Args.hasArg(options::OPT_pg))
4941 CmdArgs.push_back("-lm_p");
4942 else
4943 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004944 }
4945
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004946 // FIXME: For some reason GCC passes -lgcc before adding
4947 // the default system libraries. Just mimic this for now.
4948 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004949
Eric Christopher17674ec2012-09-13 06:32:34 +00004950 if (Args.hasArg(options::OPT_pthread)) {
4951 if (!Args.hasArg(options::OPT_shared) &&
4952 Args.hasArg(options::OPT_pg))
4953 CmdArgs.push_back("-lpthread_p");
4954 else
4955 CmdArgs.push_back("-lpthread");
4956 }
4957
Chandler Carruth45661652011-12-17 22:32:42 +00004958 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00004959 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00004960 CmdArgs.push_back("-lc_p");
4961 else
4962 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00004963 }
Eric Christopher17674ec2012-09-13 06:32:34 +00004964
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004965 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004966 }
4967
4968 if (!Args.hasArg(options::OPT_nostdlib) &&
4969 !Args.hasArg(options::OPT_nostartfiles)) {
4970 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004971 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004972 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004973 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00004974 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004975 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004976 }
4977
4978 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004979 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004980 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004981}
Ed Schoutene33194b2009-04-02 19:13:12 +00004982
Eli Friedman9fa28852012-08-08 23:57:20 +00004983void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4984 const InputInfo &Output,
4985 const InputInfoList &Inputs,
4986 const ArgList &Args,
4987 const char *LinkingOutput) const {
4988 ArgStringList CmdArgs;
4989
4990 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4991 options::OPT_Xassembler);
4992
4993 CmdArgs.push_back("-o");
4994 CmdArgs.push_back(Output.getFilename());
4995
4996 for (InputInfoList::const_iterator
4997 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4998 const InputInfo &II = *it;
4999 CmdArgs.push_back(II.getFilename());
5000 }
5001
5002 const char *Exec =
5003 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5004 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5005}
5006
5007void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5008 const InputInfo &Output,
5009 const InputInfoList &Inputs,
5010 const ArgList &Args,
5011 const char *LinkingOutput) const {
5012 const Driver &D = getToolChain().getDriver();
5013 ArgStringList CmdArgs;
5014
5015 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5016 (!Args.hasArg(options::OPT_shared))) {
5017 CmdArgs.push_back("-e");
5018 CmdArgs.push_back("__start");
5019 }
5020
5021 if (Args.hasArg(options::OPT_static)) {
5022 CmdArgs.push_back("-Bstatic");
5023 } else {
5024 if (Args.hasArg(options::OPT_rdynamic))
5025 CmdArgs.push_back("-export-dynamic");
5026 CmdArgs.push_back("--eh-frame-hdr");
5027 CmdArgs.push_back("-Bdynamic");
5028 if (Args.hasArg(options::OPT_shared)) {
5029 CmdArgs.push_back("-shared");
5030 } else {
5031 CmdArgs.push_back("-dynamic-linker");
5032 CmdArgs.push_back("/usr/libexec/ld.so");
5033 }
5034 }
5035
5036 if (Output.isFilename()) {
5037 CmdArgs.push_back("-o");
5038 CmdArgs.push_back(Output.getFilename());
5039 } else {
5040 assert(Output.isNothing() && "Invalid output.");
5041 }
5042
5043 if (!Args.hasArg(options::OPT_nostdlib) &&
5044 !Args.hasArg(options::OPT_nostartfiles)) {
5045 if (!Args.hasArg(options::OPT_shared)) {
5046 if (Args.hasArg(options::OPT_pg))
5047 CmdArgs.push_back(Args.MakeArgString(
5048 getToolChain().GetFilePath("gcrt0.o")));
5049 else
5050 CmdArgs.push_back(Args.MakeArgString(
5051 getToolChain().GetFilePath("crt0.o")));
5052 CmdArgs.push_back(Args.MakeArgString(
5053 getToolChain().GetFilePath("crtbegin.o")));
5054 } else {
5055 CmdArgs.push_back(Args.MakeArgString(
5056 getToolChain().GetFilePath("crtbeginS.o")));
5057 }
5058 }
5059
5060 Args.AddAllArgs(CmdArgs, options::OPT_L);
5061 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5062 Args.AddAllArgs(CmdArgs, options::OPT_e);
5063
5064 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5065
5066 if (!Args.hasArg(options::OPT_nostdlib) &&
5067 !Args.hasArg(options::OPT_nodefaultlibs)) {
5068 if (D.CCCIsCXX) {
5069 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5070 if (Args.hasArg(options::OPT_pg))
5071 CmdArgs.push_back("-lm_p");
5072 else
5073 CmdArgs.push_back("-lm");
5074 }
5075
5076 if (Args.hasArg(options::OPT_pthread))
5077 CmdArgs.push_back("-lpthread");
5078 if (!Args.hasArg(options::OPT_shared)) {
5079 if (Args.hasArg(options::OPT_pg))
5080 CmdArgs.push_back("-lc_p");
5081 else
5082 CmdArgs.push_back("-lc");
5083 }
5084
5085 std::string myarch = "-lclang_rt.";
5086 const llvm::Triple &T = getToolChain().getTriple();
5087 llvm::Triple::ArchType Arch = T.getArch();
5088 switch (Arch) {
5089 case llvm::Triple::arm:
5090 myarch += ("arm");
5091 break;
5092 case llvm::Triple::x86:
5093 myarch += ("i386");
5094 break;
5095 case llvm::Triple::x86_64:
5096 myarch += ("amd64");
5097 break;
5098 default:
5099 assert(0 && "Unsupported architecture");
5100 }
5101 CmdArgs.push_back(Args.MakeArgString(myarch));
5102 }
5103
5104 if (!Args.hasArg(options::OPT_nostdlib) &&
5105 !Args.hasArg(options::OPT_nostartfiles)) {
5106 if (!Args.hasArg(options::OPT_shared))
5107 CmdArgs.push_back(Args.MakeArgString(
5108 getToolChain().GetFilePath("crtend.o")));
5109 else
5110 CmdArgs.push_back(Args.MakeArgString(
5111 getToolChain().GetFilePath("crtendS.o")));
5112 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005113
5114 const char *Exec =
5115 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5116 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005117}
5118
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005119void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005120 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005121 const InputInfoList &Inputs,
5122 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005123 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005124 ArgStringList CmdArgs;
5125
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005126 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5127 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005128 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005129 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005130 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005131 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005132 else if (getToolChain().getArch() == llvm::Triple::mips ||
5133 getToolChain().getArch() == llvm::Triple::mipsel ||
5134 getToolChain().getArch() == llvm::Triple::mips64 ||
5135 getToolChain().getArch() == llvm::Triple::mips64el) {
5136 StringRef CPUName;
5137 StringRef ABIName;
5138 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005139
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005140 CmdArgs.push_back("-march");
5141 CmdArgs.push_back(CPUName.data());
5142
5143 // Convert ABI name to the GNU tools acceptable variant.
5144 if (ABIName == "o32")
5145 ABIName = "32";
5146 else if (ABIName == "n64")
5147 ABIName = "64";
5148
5149 CmdArgs.push_back("-mabi");
5150 CmdArgs.push_back(ABIName.data());
5151
5152 if (getToolChain().getArch() == llvm::Triple::mips ||
5153 getToolChain().getArch() == llvm::Triple::mips64)
5154 CmdArgs.push_back("-EB");
5155 else
5156 CmdArgs.push_back("-EL");
5157
5158 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5159 options::OPT_fpic, options::OPT_fno_pic,
5160 options::OPT_fPIE, options::OPT_fno_PIE,
5161 options::OPT_fpie, options::OPT_fno_pie);
5162 if (LastPICArg &&
5163 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5164 LastPICArg->getOption().matches(options::OPT_fpic) ||
5165 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5166 LastPICArg->getOption().matches(options::OPT_fpie))) {
5167 CmdArgs.push_back("-KPIC");
5168 }
5169 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005170
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005171 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5172 options::OPT_Xassembler);
5173
5174 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005175 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005176
5177 for (InputInfoList::const_iterator
5178 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5179 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005180 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005181 }
5182
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005183 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005184 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005185 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005186}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005187
5188void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005189 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005190 const InputInfoList &Inputs,
5191 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005192 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005193 const toolchains::FreeBSD& ToolChain =
5194 static_cast<const toolchains::FreeBSD&>(getToolChain());
5195 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005196 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005197
5198 // Silence warning for "clang -g foo.o -o foo"
5199 Args.ClaimAllArgs(options::OPT_g_Group);
5200 // and "clang -emit-llvm foo.o -o foo"
5201 Args.ClaimAllArgs(options::OPT_emit_llvm);
5202 // and for "clang -w foo.o -o foo". Other warning options are already
5203 // handled somewhere else.
5204 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005205
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005206 if (!D.SysRoot.empty())
5207 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5208
Roman Divackyafe2f232012-08-28 15:09:03 +00005209 if (Args.hasArg(options::OPT_pie))
5210 CmdArgs.push_back("-pie");
5211
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005212 if (Args.hasArg(options::OPT_static)) {
5213 CmdArgs.push_back("-Bstatic");
5214 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005215 if (Args.hasArg(options::OPT_rdynamic))
5216 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005217 CmdArgs.push_back("--eh-frame-hdr");
5218 if (Args.hasArg(options::OPT_shared)) {
5219 CmdArgs.push_back("-Bshareable");
5220 } else {
5221 CmdArgs.push_back("-dynamic-linker");
5222 CmdArgs.push_back("/libexec/ld-elf.so.1");
5223 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005224 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5225 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005226 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5227 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5228 CmdArgs.push_back("--hash-style=both");
5229 }
5230 }
5231 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005232 }
5233
5234 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5235 // instruct ld in the base system to link 32-bit code.
Roman Divackyafe2f232012-08-28 15:09:03 +00005236 if (ToolChain.getArchName() == "i386") {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005237 CmdArgs.push_back("-m");
5238 CmdArgs.push_back("elf_i386_fbsd");
5239 }
5240
Roman Divackyafe2f232012-08-28 15:09:03 +00005241 if (ToolChain.getArchName() == "powerpc") {
Roman Divacky5e300b82011-06-04 07:40:24 +00005242 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005243 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005244 }
5245
Daniel Dunbarb440f562010-08-02 02:38:21 +00005246 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005247 CmdArgs.push_back("-o");
5248 CmdArgs.push_back(Output.getFilename());
5249 } else {
5250 assert(Output.isNothing() && "Invalid output.");
5251 }
5252
5253 if (!Args.hasArg(options::OPT_nostdlib) &&
5254 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005255 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005256 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005257 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005258 crt1 = "gcrt1.o";
5259 else if (Args.hasArg(options::OPT_pie))
5260 crt1 = "Scrt1.o";
5261 else
5262 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005263 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005264 if (crt1)
5265 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5266
5267 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5268
5269 const char *crtbegin = NULL;
5270 if (Args.hasArg(options::OPT_static))
5271 crtbegin = "crtbeginT.o";
5272 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5273 crtbegin = "crtbeginS.o";
5274 else
5275 crtbegin = "crtbegin.o";
5276
5277 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005278 }
5279
5280 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005281 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005282 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5283 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005284 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005285 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5286 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005287 Args.AddAllArgs(CmdArgs, options::OPT_s);
5288 Args.AddAllArgs(CmdArgs, options::OPT_t);
5289 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5290 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005291
Roman Divackyafe2f232012-08-28 15:09:03 +00005292 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005293
5294 if (!Args.hasArg(options::OPT_nostdlib) &&
5295 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005296 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005297 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005298 if (Args.hasArg(options::OPT_pg))
5299 CmdArgs.push_back("-lm_p");
5300 else
5301 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005302 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005303 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5304 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005305 if (Args.hasArg(options::OPT_pg))
5306 CmdArgs.push_back("-lgcc_p");
5307 else
5308 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005309 if (Args.hasArg(options::OPT_static)) {
5310 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005311 } else if (Args.hasArg(options::OPT_pg)) {
5312 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005313 } else {
5314 CmdArgs.push_back("--as-needed");
5315 CmdArgs.push_back("-lgcc_s");
5316 CmdArgs.push_back("--no-as-needed");
5317 }
5318
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005319 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005320 if (Args.hasArg(options::OPT_pg))
5321 CmdArgs.push_back("-lpthread_p");
5322 else
5323 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005324 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005325
Roman Divacky66f22762011-02-10 16:59:40 +00005326 if (Args.hasArg(options::OPT_pg)) {
5327 if (Args.hasArg(options::OPT_shared))
5328 CmdArgs.push_back("-lc");
5329 else
5330 CmdArgs.push_back("-lc_p");
5331 CmdArgs.push_back("-lgcc_p");
5332 } else {
5333 CmdArgs.push_back("-lc");
5334 CmdArgs.push_back("-lgcc");
5335 }
5336
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005337 if (Args.hasArg(options::OPT_static)) {
5338 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005339 } else if (Args.hasArg(options::OPT_pg)) {
5340 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005341 } else {
5342 CmdArgs.push_back("--as-needed");
5343 CmdArgs.push_back("-lgcc_s");
5344 CmdArgs.push_back("--no-as-needed");
5345 }
5346 }
5347
5348 if (!Args.hasArg(options::OPT_nostdlib) &&
5349 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005350 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005351 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005352 else
5353 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005354 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005355 }
5356
Roman Divackyafe2f232012-08-28 15:09:03 +00005357 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005358
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005359 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005360 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005361 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005362}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005363
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005364void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5365 const InputInfo &Output,
5366 const InputInfoList &Inputs,
5367 const ArgList &Args,
5368 const char *LinkingOutput) const {
5369 ArgStringList CmdArgs;
5370
5371 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5372 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005373 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005374 CmdArgs.push_back("--32");
5375
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005376 // Set byte order explicitly
5377 if (getToolChain().getArchName() == "mips")
5378 CmdArgs.push_back("-EB");
5379 else if (getToolChain().getArchName() == "mipsel")
5380 CmdArgs.push_back("-EL");
5381
5382 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5383 options::OPT_Xassembler);
5384
5385 CmdArgs.push_back("-o");
5386 CmdArgs.push_back(Output.getFilename());
5387
5388 for (InputInfoList::const_iterator
5389 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5390 const InputInfo &II = *it;
5391 CmdArgs.push_back(II.getFilename());
5392 }
5393
David Chisnallddbd68f2011-09-27 22:03:18 +00005394 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005395 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5396}
5397
5398void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5399 const InputInfo &Output,
5400 const InputInfoList &Inputs,
5401 const ArgList &Args,
5402 const char *LinkingOutput) const {
5403 const Driver &D = getToolChain().getDriver();
5404 ArgStringList CmdArgs;
5405
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005406 if (!D.SysRoot.empty())
5407 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5408
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005409 if (Args.hasArg(options::OPT_static)) {
5410 CmdArgs.push_back("-Bstatic");
5411 } else {
5412 if (Args.hasArg(options::OPT_rdynamic))
5413 CmdArgs.push_back("-export-dynamic");
5414 CmdArgs.push_back("--eh-frame-hdr");
5415 if (Args.hasArg(options::OPT_shared)) {
5416 CmdArgs.push_back("-Bshareable");
5417 } else {
5418 CmdArgs.push_back("-dynamic-linker");
5419 CmdArgs.push_back("/libexec/ld.elf_so");
5420 }
5421 }
5422
5423 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5424 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005425 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005426 CmdArgs.push_back("-m");
5427 CmdArgs.push_back("elf_i386");
5428 }
5429
5430 if (Output.isFilename()) {
5431 CmdArgs.push_back("-o");
5432 CmdArgs.push_back(Output.getFilename());
5433 } else {
5434 assert(Output.isNothing() && "Invalid output.");
5435 }
5436
5437 if (!Args.hasArg(options::OPT_nostdlib) &&
5438 !Args.hasArg(options::OPT_nostartfiles)) {
5439 if (!Args.hasArg(options::OPT_shared)) {
5440 CmdArgs.push_back(Args.MakeArgString(
5441 getToolChain().GetFilePath("crt0.o")));
5442 CmdArgs.push_back(Args.MakeArgString(
5443 getToolChain().GetFilePath("crti.o")));
5444 CmdArgs.push_back(Args.MakeArgString(
5445 getToolChain().GetFilePath("crtbegin.o")));
5446 } else {
5447 CmdArgs.push_back(Args.MakeArgString(
5448 getToolChain().GetFilePath("crti.o")));
5449 CmdArgs.push_back(Args.MakeArgString(
5450 getToolChain().GetFilePath("crtbeginS.o")));
5451 }
5452 }
5453
5454 Args.AddAllArgs(CmdArgs, options::OPT_L);
5455 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5456 Args.AddAllArgs(CmdArgs, options::OPT_e);
5457 Args.AddAllArgs(CmdArgs, options::OPT_s);
5458 Args.AddAllArgs(CmdArgs, options::OPT_t);
5459 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5460 Args.AddAllArgs(CmdArgs, options::OPT_r);
5461
5462 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5463
5464 if (!Args.hasArg(options::OPT_nostdlib) &&
5465 !Args.hasArg(options::OPT_nodefaultlibs)) {
5466 if (D.CCCIsCXX) {
5467 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5468 CmdArgs.push_back("-lm");
5469 }
5470 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5471 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005472 if (Args.hasArg(options::OPT_static)) {
5473 CmdArgs.push_back("-lgcc_eh");
5474 } else {
5475 CmdArgs.push_back("--as-needed");
5476 CmdArgs.push_back("-lgcc_s");
5477 CmdArgs.push_back("--no-as-needed");
5478 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005479 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005480
5481 if (Args.hasArg(options::OPT_pthread))
5482 CmdArgs.push_back("-lpthread");
5483 CmdArgs.push_back("-lc");
5484
5485 CmdArgs.push_back("-lgcc");
5486 if (Args.hasArg(options::OPT_static)) {
5487 CmdArgs.push_back("-lgcc_eh");
5488 } else {
5489 CmdArgs.push_back("--as-needed");
5490 CmdArgs.push_back("-lgcc_s");
5491 CmdArgs.push_back("--no-as-needed");
5492 }
5493 }
5494
5495 if (!Args.hasArg(options::OPT_nostdlib) &&
5496 !Args.hasArg(options::OPT_nostartfiles)) {
5497 if (!Args.hasArg(options::OPT_shared))
5498 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5499 "crtend.o")));
5500 else
5501 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5502 "crtendS.o")));
5503 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5504 "crtn.o")));
5505 }
5506
Bill Wendling08760582011-06-27 19:15:03 +00005507 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005508
David Chisnallddbd68f2011-09-27 22:03:18 +00005509 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005510 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5511}
5512
Rafael Espindola92b00932010-08-10 00:25:48 +00005513void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5514 const InputInfo &Output,
5515 const InputInfoList &Inputs,
5516 const ArgList &Args,
5517 const char *LinkingOutput) const {
5518 ArgStringList CmdArgs;
5519
5520 // Add --32/--64 to make sure we get the format we want.
5521 // This is incomplete
5522 if (getToolChain().getArch() == llvm::Triple::x86) {
5523 CmdArgs.push_back("--32");
5524 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5525 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005526 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5527 CmdArgs.push_back("-a32");
5528 CmdArgs.push_back("-mppc");
5529 CmdArgs.push_back("-many");
5530 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5531 CmdArgs.push_back("-a64");
5532 CmdArgs.push_back("-mppc64");
5533 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005534 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005535 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005536 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5537 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005538
5539 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5540 getToolChain().getTriple());
5541 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005542
5543 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5544 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5545 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005546 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5547 getToolChain().getArch() == llvm::Triple::mipsel ||
5548 getToolChain().getArch() == llvm::Triple::mips64 ||
5549 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005550 StringRef CPUName;
5551 StringRef ABIName;
5552 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005553
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005554 CmdArgs.push_back("-march");
5555 CmdArgs.push_back(CPUName.data());
5556
5557 // Convert ABI name to the GNU tools acceptable variant.
5558 if (ABIName == "o32")
5559 ABIName = "32";
5560 else if (ABIName == "n64")
5561 ABIName = "64";
5562
5563 CmdArgs.push_back("-mabi");
5564 CmdArgs.push_back(ABIName.data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005565
5566 if (getToolChain().getArch() == llvm::Triple::mips ||
5567 getToolChain().getArch() == llvm::Triple::mips64)
5568 CmdArgs.push_back("-EB");
5569 else
5570 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005571
5572 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5573 options::OPT_fpic, options::OPT_fno_pic,
5574 options::OPT_fPIE, options::OPT_fno_PIE,
5575 options::OPT_fpie, options::OPT_fno_pie);
5576 if (LastPICArg &&
5577 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5578 LastPICArg->getOption().matches(options::OPT_fpic) ||
5579 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5580 LastPICArg->getOption().matches(options::OPT_fpie))) {
5581 CmdArgs.push_back("-KPIC");
5582 }
Rafael Espindola92b00932010-08-10 00:25:48 +00005583 }
5584
5585 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5586 options::OPT_Xassembler);
5587
5588 CmdArgs.push_back("-o");
5589 CmdArgs.push_back(Output.getFilename());
5590
5591 for (InputInfoList::const_iterator
5592 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5593 const InputInfo &II = *it;
5594 CmdArgs.push_back(II.getFilename());
5595 }
5596
5597 const char *Exec =
5598 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5599 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5600}
5601
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005602static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5603 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00005604 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005605 bool StaticLibgcc = isAndroid || Args.hasArg(options::OPT_static) ||
Rafael Espindolacc354322011-10-17 21:39:04 +00005606 Args.hasArg(options::OPT_static_libgcc);
5607 if (!D.CCCIsCXX)
5608 CmdArgs.push_back("-lgcc");
5609
5610 if (StaticLibgcc) {
5611 if (D.CCCIsCXX)
5612 CmdArgs.push_back("-lgcc");
5613 } else {
5614 if (!D.CCCIsCXX)
5615 CmdArgs.push_back("--as-needed");
5616 CmdArgs.push_back("-lgcc_s");
5617 if (!D.CCCIsCXX)
5618 CmdArgs.push_back("--no-as-needed");
5619 }
5620
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005621 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005622 CmdArgs.push_back("-lgcc_eh");
5623 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5624 CmdArgs.push_back("-lgcc");
5625}
5626
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005627void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5628 const InputInfo &Output,
5629 const InputInfoList &Inputs,
5630 const ArgList &Args,
5631 const char *LinkingOutput) const {
5632 const toolchains::Linux& ToolChain =
5633 static_cast<const toolchains::Linux&>(getToolChain());
5634 const Driver &D = ToolChain.getDriver();
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005635 const bool isAndroid = ToolChain.getTriple().getEnvironment() ==
Logan Chienc6fd8202012-09-02 09:30:11 +00005636 llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005637
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005638 ArgStringList CmdArgs;
5639
Rafael Espindolad1002f62010-11-15 18:28:16 +00005640 // Silence warning for "clang -g foo.o -o foo"
5641 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005642 // and "clang -emit-llvm foo.o -o foo"
5643 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00005644 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005645 // handled somewhere else.
5646 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005647
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005648 if (!D.SysRoot.empty())
5649 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005650
Rafael Espindolad47ac232010-11-17 22:26:15 +00005651 if (Args.hasArg(options::OPT_pie))
5652 CmdArgs.push_back("-pie");
5653
Rafael Espindola1c76c592010-11-07 22:57:16 +00005654 if (Args.hasArg(options::OPT_rdynamic))
5655 CmdArgs.push_back("-export-dynamic");
5656
Rafael Espindola34d77dc2010-11-11 19:34:42 +00005657 if (Args.hasArg(options::OPT_s))
5658 CmdArgs.push_back("-s");
5659
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005660 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5661 e = ToolChain.ExtraOpts.end();
5662 i != e; ++i)
5663 CmdArgs.push_back(i->c_str());
5664
5665 if (!Args.hasArg(options::OPT_static)) {
5666 CmdArgs.push_back("--eh-frame-hdr");
5667 }
5668
5669 CmdArgs.push_back("-m");
5670 if (ToolChain.getArch() == llvm::Triple::x86)
5671 CmdArgs.push_back("elf_i386");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005672 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00005673 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005674 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005675 else if (ToolChain.getArch() == llvm::Triple::ppc)
5676 CmdArgs.push_back("elf32ppclinux");
5677 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5678 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005679 else if (ToolChain.getArch() == llvm::Triple::mips)
5680 CmdArgs.push_back("elf32btsmip");
5681 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5682 CmdArgs.push_back("elf32ltsmip");
5683 else if (ToolChain.getArch() == llvm::Triple::mips64)
5684 CmdArgs.push_back("elf64btsmip");
5685 else if (ToolChain.getArch() == llvm::Triple::mips64el)
5686 CmdArgs.push_back("elf64ltsmip");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005687 else
5688 CmdArgs.push_back("elf_x86_64");
5689
5690 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00005691 if (ToolChain.getArch() == llvm::Triple::arm
5692 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005693 CmdArgs.push_back("-Bstatic");
5694 else
5695 CmdArgs.push_back("-static");
5696 } else if (Args.hasArg(options::OPT_shared)) {
5697 CmdArgs.push_back("-shared");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005698 if ((ToolChain.getArch() == llvm::Triple::arm
5699 || ToolChain.getArch() == llvm::Triple::thumb) && isAndroid) {
5700 CmdArgs.push_back("-Bsymbolic");
5701 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005702 }
5703
5704 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00005705 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005706 (!Args.hasArg(options::OPT_static) &&
5707 !Args.hasArg(options::OPT_shared))) {
5708 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005709 if (isAndroid)
5710 CmdArgs.push_back("/system/bin/linker");
5711 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005712 CmdArgs.push_back("/lib/ld-linux.so.2");
Douglas Gregord9bb1522011-03-06 19:11:49 +00005713 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liueabbf922012-07-30 11:05:56 +00005714 ToolChain.getArch() == llvm::Triple::thumb) {
5715 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5716 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5717 else
5718 CmdArgs.push_back("/lib/ld-linux.so.3");
5719 }
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005720 else if (ToolChain.getArch() == llvm::Triple::mips ||
5721 ToolChain.getArch() == llvm::Triple::mipsel)
5722 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan1e1e2e22012-04-06 20:14:27 +00005723 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
5724 ToolChain.getArch() == llvm::Triple::mips64el)
5725 CmdArgs.push_back("/lib64/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005726 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner20b90d02011-04-11 21:15:37 +00005727 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005728 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner20b90d02011-04-11 21:15:37 +00005729 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005730 else
5731 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5732 }
5733
5734 CmdArgs.push_back("-o");
5735 CmdArgs.push_back(Output.getFilename());
5736
Rafael Espindola81937ec2010-12-01 01:52:43 +00005737 if (!Args.hasArg(options::OPT_nostdlib) &&
5738 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005739 if (!isAndroid) {
5740 const char *crt1 = NULL;
5741 if (!Args.hasArg(options::OPT_shared)){
5742 if (Args.hasArg(options::OPT_pie))
5743 crt1 = "Scrt1.o";
5744 else
5745 crt1 = "crt1.o";
5746 }
5747 if (crt1)
5748 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005749
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005750 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5751 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005752
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005753 const char *crtbegin;
5754 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005755 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005756 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005757 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005758 else if (Args.hasArg(options::OPT_pie))
5759 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005760 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005761 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005762 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
5763 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005764
5765 Args.AddAllArgs(CmdArgs, options::OPT_L);
5766
5767 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5768
Roman Divackyee8188a2011-03-01 17:53:14 +00005769 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5770 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005771 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005772
Rafael Espindola9446d762012-04-09 23:53:34 +00005773 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5774 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5775 // forward.
5776 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5777 CmdArgs.push_back("-plugin");
5778 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5779 CmdArgs.push_back(Args.MakeArgString(Plugin));
5780 }
5781
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00005782 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5783 CmdArgs.push_back("--no-demangle");
5784
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005785 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5786
Chandler Carruth94a32012012-05-14 18:31:18 +00005787 if (D.CCCIsCXX &&
5788 !Args.hasArg(options::OPT_nostdlib) &&
5789 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00005790 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5791 !Args.hasArg(options::OPT_static);
5792 if (OnlyLibstdcxxStatic)
5793 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005794 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00005795 if (OnlyLibstdcxxStatic)
5796 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005797 CmdArgs.push_back("-lm");
5798 }
5799
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005800 // Call this before we add the C run-time.
5801 addAsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00005802 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005803
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005804 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00005805 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5806 if (Args.hasArg(options::OPT_static))
5807 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00005808
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005809 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005810
Chandler Carruth94a32012012-05-14 18:31:18 +00005811 if (Args.hasArg(options::OPT_pthread) ||
5812 Args.hasArg(options::OPT_pthreads))
5813 CmdArgs.push_back("-lpthread");
5814
5815 CmdArgs.push_back("-lc");
5816
5817 if (Args.hasArg(options::OPT_static))
5818 CmdArgs.push_back("--end-group");
5819 else
5820 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5821 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00005822
Rafael Espindola81937ec2010-12-01 01:52:43 +00005823 if (!Args.hasArg(options::OPT_nostartfiles)) {
5824 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005825 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005826 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005827 else if (Args.hasArg(options::OPT_pie))
5828 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00005829 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005830 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005831
Rafael Espindola81937ec2010-12-01 01:52:43 +00005832 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005833 if (!isAndroid)
5834 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00005835 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005836 }
5837
Bill Wendling08760582011-06-27 19:15:03 +00005838 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005839
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005840 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5841}
Rafael Espindola92b00932010-08-10 00:25:48 +00005842
Chris Lattner3e2ee142010-07-07 16:01:42 +00005843void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005844 const InputInfo &Output,
5845 const InputInfoList &Inputs,
5846 const ArgList &Args,
5847 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005848 ArgStringList CmdArgs;
5849
5850 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5851 options::OPT_Xassembler);
5852
5853 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005854 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005855
5856 for (InputInfoList::const_iterator
5857 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5858 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005859 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005860 }
5861
5862 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00005863 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005864 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005865}
5866
5867void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005868 const InputInfo &Output,
5869 const InputInfoList &Inputs,
5870 const ArgList &Args,
5871 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005872 const Driver &D = getToolChain().getDriver();
5873 ArgStringList CmdArgs;
5874
Daniel Dunbarb440f562010-08-02 02:38:21 +00005875 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005876 CmdArgs.push_back("-o");
5877 CmdArgs.push_back(Output.getFilename());
5878 } else {
5879 assert(Output.isNothing() && "Invalid output.");
5880 }
5881
5882 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00005883 !Args.hasArg(options::OPT_nostartfiles)) {
5884 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
5885 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5886 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
5887 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
5888 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005889
5890 Args.AddAllArgs(CmdArgs, options::OPT_L);
5891 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5892 Args.AddAllArgs(CmdArgs, options::OPT_e);
5893
Daniel Dunbar54423b22010-09-17 00:24:54 +00005894 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005895
Eli Friedman83de5132011-12-08 23:54:21 +00005896 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5897
Chris Lattner3e2ee142010-07-07 16:01:42 +00005898 if (!Args.hasArg(options::OPT_nostdlib) &&
5899 !Args.hasArg(options::OPT_nodefaultlibs)) {
5900 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005901 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005902 CmdArgs.push_back("-lm");
5903 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005904 }
5905
5906 if (!Args.hasArg(options::OPT_nostdlib) &&
5907 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00005908 if (Args.hasArg(options::OPT_pthread))
5909 CmdArgs.push_back("-lpthread");
5910 CmdArgs.push_back("-lc");
5911 CmdArgs.push_back("-lCompilerRT-Generic");
5912 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
5913 CmdArgs.push_back(
5914 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005915 }
5916
Eli Friedman83de5132011-12-08 23:54:21 +00005917 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005918 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005919}
5920
Daniel Dunbarcc912342009-05-02 18:28:39 +00005921/// DragonFly Tools
5922
5923// For now, DragonFly Assemble does just about the same as for
5924// FreeBSD, but this may change soon.
5925void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005926 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005927 const InputInfoList &Inputs,
5928 const ArgList &Args,
5929 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005930 ArgStringList CmdArgs;
5931
5932 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5933 // instruct as in the base system to assemble 32-bit code.
5934 if (getToolChain().getArchName() == "i386")
5935 CmdArgs.push_back("--32");
5936
5937 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5938 options::OPT_Xassembler);
5939
5940 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005941 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005942
5943 for (InputInfoList::const_iterator
5944 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5945 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005946 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005947 }
5948
5949 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005950 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005951 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005952}
5953
5954void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005955 const InputInfo &Output,
5956 const InputInfoList &Inputs,
5957 const ArgList &Args,
5958 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005959 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00005960 ArgStringList CmdArgs;
5961
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005962 if (!D.SysRoot.empty())
5963 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5964
Daniel Dunbarcc912342009-05-02 18:28:39 +00005965 if (Args.hasArg(options::OPT_static)) {
5966 CmdArgs.push_back("-Bstatic");
5967 } else {
5968 if (Args.hasArg(options::OPT_shared))
5969 CmdArgs.push_back("-Bshareable");
5970 else {
5971 CmdArgs.push_back("-dynamic-linker");
5972 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
5973 }
5974 }
5975
5976 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5977 // instruct ld in the base system to link 32-bit code.
5978 if (getToolChain().getArchName() == "i386") {
5979 CmdArgs.push_back("-m");
5980 CmdArgs.push_back("elf_i386");
5981 }
5982
Daniel Dunbarb440f562010-08-02 02:38:21 +00005983 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005984 CmdArgs.push_back("-o");
5985 CmdArgs.push_back(Output.getFilename());
5986 } else {
5987 assert(Output.isNothing() && "Invalid output.");
5988 }
5989
5990 if (!Args.hasArg(options::OPT_nostdlib) &&
5991 !Args.hasArg(options::OPT_nostartfiles)) {
5992 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005993 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005994 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005995 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005996 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005997 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005998 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005999 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006000 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006001 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006002 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006003 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006004 }
6005 }
6006
6007 Args.AddAllArgs(CmdArgs, options::OPT_L);
6008 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6009 Args.AddAllArgs(CmdArgs, options::OPT_e);
6010
Daniel Dunbar54423b22010-09-17 00:24:54 +00006011 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006012
6013 if (!Args.hasArg(options::OPT_nostdlib) &&
6014 !Args.hasArg(options::OPT_nodefaultlibs)) {
6015 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6016 // rpaths
6017 CmdArgs.push_back("-L/usr/lib/gcc41");
6018
6019 if (!Args.hasArg(options::OPT_static)) {
6020 CmdArgs.push_back("-rpath");
6021 CmdArgs.push_back("/usr/lib/gcc41");
6022
6023 CmdArgs.push_back("-rpath-link");
6024 CmdArgs.push_back("/usr/lib/gcc41");
6025
6026 CmdArgs.push_back("-rpath");
6027 CmdArgs.push_back("/usr/lib");
6028
6029 CmdArgs.push_back("-rpath-link");
6030 CmdArgs.push_back("/usr/lib");
6031 }
6032
Rafael Espindola38360b32010-07-20 12:59:03 +00006033 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006034 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006035 CmdArgs.push_back("-lm");
6036 }
6037
Daniel Dunbarcc912342009-05-02 18:28:39 +00006038 if (Args.hasArg(options::OPT_shared)) {
6039 CmdArgs.push_back("-lgcc_pic");
6040 } else {
6041 CmdArgs.push_back("-lgcc");
6042 }
6043
6044
6045 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006046 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006047
6048 if (!Args.hasArg(options::OPT_nolibc)) {
6049 CmdArgs.push_back("-lc");
6050 }
6051
6052 if (Args.hasArg(options::OPT_shared)) {
6053 CmdArgs.push_back("-lgcc_pic");
6054 } else {
6055 CmdArgs.push_back("-lgcc");
6056 }
6057 }
6058
6059 if (!Args.hasArg(options::OPT_nostdlib) &&
6060 !Args.hasArg(options::OPT_nostartfiles)) {
6061 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006062 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006063 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006064 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006065 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006066 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006067 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006068 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006069 }
6070
Bill Wendling08760582011-06-27 19:15:03 +00006071 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006072
Daniel Dunbarcc912342009-05-02 18:28:39 +00006073 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006074 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006075 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006076}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006077
6078void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6079 const InputInfo &Output,
6080 const InputInfoList &Inputs,
6081 const ArgList &Args,
6082 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006083 ArgStringList CmdArgs;
6084
6085 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006086 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6087 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006088 } else {
6089 assert(Output.isNothing() && "Invalid output.");
6090 }
6091
6092 if (!Args.hasArg(options::OPT_nostdlib) &&
6093 !Args.hasArg(options::OPT_nostartfiles)) {
6094 CmdArgs.push_back("-defaultlib:libcmt");
6095 }
6096
6097 CmdArgs.push_back("-nologo");
6098
Michael J. Spencere2f49362012-06-18 16:56:04 +00006099 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6100
6101 // Add filenames immediately.
6102 for (InputInfoList::const_iterator
6103 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6104 if (it->isFilename())
6105 CmdArgs.push_back(it->getFilename());
6106 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006107
6108 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006109 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006110 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6111}