blob: 960ffde228f3bb5a13048a5b3fe00923b4f8f784 [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")
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000971 .Case("e500mc", "e500mc")
972 .Case("e5500", "e5500")
Hal Finkel8eb59282012-06-11 22:35:19 +0000973 .Case("power6", "pwr6")
974 .Case("power7", "pwr7")
975 .Case("powerpc", "ppc")
976 .Case("powerpc64", "ppc64")
977 .Default("");
978 }
979
980 return "";
981}
982
983void Clang::AddPPCTargetArgs(const ArgList &Args,
984 ArgStringList &CmdArgs) const {
985 std::string TargetCPUName = getPPCTargetCPU(Args);
986
987 // LLVM may default to generating code for the native CPU,
988 // but, like gcc, we default to a more generic option for
989 // each architecture. (except on Darwin)
990 llvm::Triple Triple = getToolChain().getTriple();
991 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
992 if (Triple.getArch() == llvm::Triple::ppc64)
993 TargetCPUName = "ppc64";
994 else
995 TargetCPUName = "ppc";
996 }
997
998 if (!TargetCPUName.empty()) {
999 CmdArgs.push_back("-target-cpu");
1000 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1001 }
1002}
1003
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001004void Clang::AddSparcTargetArgs(const ArgList &Args,
1005 ArgStringList &CmdArgs) const {
1006 const Driver &D = getToolChain().getDriver();
1007
1008 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001009 CmdArgs.push_back("-target-cpu");
Benjamin Kramereed4f2a2011-12-26 14:18:37 +00001010 CmdArgs.push_back(A->getValue(Args));
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001011 }
1012
1013 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001014 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001015 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1016 options::OPT_mhard_float)) {
1017 if (A->getOption().matches(options::OPT_msoft_float))
1018 FloatABI = "soft";
1019 else if (A->getOption().matches(options::OPT_mhard_float))
1020 FloatABI = "hard";
1021 }
1022
1023 // If unspecified, choose the default based on the platform.
1024 if (FloatABI.empty()) {
1025 switch (getToolChain().getTriple().getOS()) {
1026 default:
1027 // Assume "soft", but warn the user we are guessing.
1028 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001029 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001030 break;
1031 }
1032 }
1033
1034 if (FloatABI == "soft") {
1035 // Floating point operations and argument passing are soft.
1036 //
1037 // FIXME: This changes CPP defines, we need -target-soft-float.
1038 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001039 CmdArgs.push_back("-target-feature");
1040 CmdArgs.push_back("+soft-float");
1041 } else {
1042 assert(FloatABI == "hard" && "Invalid float abi!");
1043 CmdArgs.push_back("-mhard-float");
1044 }
1045}
1046
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001047void Clang::AddX86TargetArgs(const ArgList &Args,
1048 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001049 if (!Args.hasFlag(options::OPT_mred_zone,
1050 options::OPT_mno_red_zone,
1051 true) ||
1052 Args.hasArg(options::OPT_mkernel) ||
1053 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001054 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001055
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001056 if (Args.hasFlag(options::OPT_msoft_float,
1057 options::OPT_mno_soft_float,
1058 false))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001059 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001060
Daniel Dunbare13ada62009-11-14 22:04:54 +00001061 const char *CPUName = 0;
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001062 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001063 if (StringRef(A->getValue(Args)) == "native") {
Daniel Dunbare13ada62009-11-14 22:04:54 +00001064 // FIXME: Reject attempts to use -march=native unless the target matches
1065 // the host.
1066 //
1067 // FIXME: We should also incorporate the detected target features for use
1068 // with -native.
1069 std::string CPU = llvm::sys::getHostCPUName();
Bob Wilsone78227b2012-05-09 17:53:10 +00001070 if (!CPU.empty() && CPU != "generic")
Daniel Dunbare13ada62009-11-14 22:04:54 +00001071 CPUName = Args.MakeArgString(CPU);
1072 } else
1073 CPUName = A->getValue(Args);
1074 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001075
Daniel Dunbare13ada62009-11-14 22:04:54 +00001076 // Select the default CPU if none was given (or detection failed).
1077 if (!CPUName) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001078 // FIXME: Need target hooks.
Bob Wilson6524dd32011-10-14 05:03:44 +00001079 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001080 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001081 CPUName = "core2";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001082 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001083 CPUName = "yonah";
Chris Lattnerb986aba2010-04-11 19:29:39 +00001084 } else if (getToolChain().getOS().startswith("haiku")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001085 if (getToolChain().getArch() == llvm::Triple::x86_64)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001086 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001087 else if (getToolChain().getArch() == llvm::Triple::x86)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001088 CPUName = "i586";
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001089 } else if (getToolChain().getOS().startswith("openbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001090 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001091 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001092 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001093 CPUName = "i486";
Eli Friedman9fa28852012-08-08 23:57:20 +00001094 } else if (getToolChain().getOS().startswith("bitrig")) {
1095 if (getToolChain().getArch() == llvm::Triple::x86_64)
1096 CPUName = "x86-64";
1097 else if (getToolChain().getArch() == llvm::Triple::x86)
1098 CPUName = "i686";
Roman Divacky432f10d2011-03-01 18:11:37 +00001099 } else if (getToolChain().getOS().startswith("freebsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001100 if (getToolChain().getArch() == llvm::Triple::x86_64)
Roman Divacky432f10d2011-03-01 18:11:37 +00001101 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001102 else if (getToolChain().getArch() == llvm::Triple::x86)
Roman Divacky432f10d2011-03-01 18:11:37 +00001103 CPUName = "i486";
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001104 } else if (getToolChain().getOS().startswith("netbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001105 if (getToolChain().getArch() == llvm::Triple::x86_64)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001106 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001107 else if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001108 CPUName = "i486";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001109 } else {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001110 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001111 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001112 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001113 CPUName = "pentium4";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001114 }
1115 }
1116
Daniel Dunbare13ada62009-11-14 22:04:54 +00001117 if (CPUName) {
Daniel Dunbara7d02312009-12-18 06:30:12 +00001118 CmdArgs.push_back("-target-cpu");
Daniel Dunbare13ada62009-11-14 22:04:54 +00001119 CmdArgs.push_back(CPUName);
1120 }
1121
Eli Friedmanad811f02011-07-02 00:34:19 +00001122 // The required algorithm here is slightly strange: the options are applied
1123 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1124 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1125 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1126 // former correctly, but not the latter; handle directly-overridden
1127 // attributes here.
1128 llvm::StringMap<unsigned> PrevFeature;
1129 std::vector<const char*> Features;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001130 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1131 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001132 StringRef Name = (*it)->getOption().getName();
Daniel Dunbara442fd52010-06-11 22:00:13 +00001133 (*it)->claim();
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001134
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001135 // Skip over "-m".
1136 assert(Name.startswith("-m") && "Invalid feature name.");
1137 Name = Name.substr(2);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001138
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001139 bool IsNegative = Name.startswith("no-");
1140 if (IsNegative)
1141 Name = Name.substr(3);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001142
Eli Friedmanad811f02011-07-02 00:34:19 +00001143 unsigned& Prev = PrevFeature[Name];
1144 if (Prev)
1145 Features[Prev - 1] = 0;
1146 Prev = Features.size() + 1;
1147 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1148 }
1149 for (unsigned i = 0; i < Features.size(); i++) {
1150 if (Features[i]) {
1151 CmdArgs.push_back("-target-feature");
1152 CmdArgs.push_back(Features[i]);
1153 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001154 }
1155}
1156
Tony Linthicum76329bf2011-12-12 21:14:55 +00001157static Arg* getLastHexagonArchArg (const ArgList &Args)
1158{
1159 Arg * A = NULL;
1160
Sebastian Pop86500282012-01-13 20:37:10 +00001161 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
1162 it != ie; ++it) {
1163 if ((*it)->getOption().matches(options::OPT_march_EQ) ||
Tony Linthicum76329bf2011-12-12 21:14:55 +00001164 (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
1165 A = *it;
1166 A->claim();
1167 }
Sebastian Pop86500282012-01-13 20:37:10 +00001168 else if ((*it)->getOption().matches(options::OPT_m_Joined)){
1169 StringRef Value = (*it)->getValue(Args,0);
1170 if (Value.startswith("v")) {
1171 A = *it;
1172 A->claim();
1173 }
1174 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001175 }
1176 return A;
1177}
1178
Sebastian Pop86500282012-01-13 20:37:10 +00001179static StringRef getHexagonTargetCPU(const ArgList &Args)
Tony Linthicum76329bf2011-12-12 21:14:55 +00001180{
1181 Arg *A;
1182 llvm::StringRef WhichHexagon;
1183
Sebastian Pop86500282012-01-13 20:37:10 +00001184 // Select the default CPU (v4) if none was given or detection failed.
Tony Linthicum76329bf2011-12-12 21:14:55 +00001185 if ((A = getLastHexagonArchArg (Args))) {
Sebastian Pop86500282012-01-13 20:37:10 +00001186 WhichHexagon = A->getValue(Args);
1187 if (WhichHexagon == "")
1188 return "v4";
1189 else
1190 return WhichHexagon;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001191 }
Sebastian Pop86500282012-01-13 20:37:10 +00001192 else
1193 return "v4";
Tony Linthicum76329bf2011-12-12 21:14:55 +00001194}
1195
1196void Clang::AddHexagonTargetArgs(const ArgList &Args,
1197 ArgStringList &CmdArgs) const {
1198 llvm::Triple Triple = getToolChain().getTriple();
1199
1200 CmdArgs.push_back("-target-cpu");
Sebastian Pop86500282012-01-13 20:37:10 +00001201 CmdArgs.push_back(Args.MakeArgString("hexagon" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001202 CmdArgs.push_back("-fno-signed-char");
1203 CmdArgs.push_back("-nobuiltininc");
1204
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001205 if (Args.hasArg(options::OPT_mqdsp6_compat))
Tony Linthicum76329bf2011-12-12 21:14:55 +00001206 CmdArgs.push_back("-mqdsp6-compat");
1207
1208 if (Arg *A = Args.getLastArg(options::OPT_G,
1209 options::OPT_msmall_data_threshold_EQ)) {
1210 std::string SmallDataThreshold="-small-data-threshold=";
1211 SmallDataThreshold += A->getValue(Args);
1212 CmdArgs.push_back ("-mllvm");
1213 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
1214 A->claim();
1215 }
1216
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001217 if (!Args.hasArg(options::OPT_fno_short_enums))
1218 CmdArgs.push_back("-fshort-enums");
1219 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1220 CmdArgs.push_back ("-mllvm");
1221 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1222 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001223 CmdArgs.push_back ("-mllvm");
1224 CmdArgs.push_back ("-machine-sink-split=0");
1225}
1226
Eric Christopher84fbdb42011-08-19 00:30:14 +00001227static bool
John McCall5fb5df92012-06-20 06:18:46 +00001228shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001229 const llvm::Triple &Triple) {
1230 // We use the zero-cost exception tables for Objective-C if the non-fragile
1231 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1232 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001233 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001234 return true;
1235
Bob Wilson6524dd32011-10-14 05:03:44 +00001236 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001237 return false;
1238
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001239 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001240 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001241 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001242}
1243
Anders Carlssone96ab552011-02-28 02:27:16 +00001244/// addExceptionArgs - Adds exception related arguments to the driver command
1245/// arguments. There's a master flag, -fexceptions and also language specific
1246/// flags to enable/disable C++ and Objective-C exceptions.
1247/// This makes it possible to for example disable C++ exceptions but enable
1248/// Objective-C exceptions.
1249static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1250 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001251 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001252 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001253 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001254 if (KernelOrKext) {
1255 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1256 // arguments now to avoid warnings about unused arguments.
1257 Args.ClaimAllArgs(options::OPT_fexceptions);
1258 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1259 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1260 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1261 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1262 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001263 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001264 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001265
1266 // Exceptions are enabled by default.
1267 bool ExceptionsEnabled = true;
1268
1269 // This keeps track of whether exceptions were explicitly turned on or off.
1270 bool DidHaveExplicitExceptionFlag = false;
1271
Rafael Espindola00a66572009-10-01 13:33:33 +00001272 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1273 options::OPT_fno_exceptions)) {
1274 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001275 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001276 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001277 ExceptionsEnabled = false;
1278
1279 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001280 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001281
Anders Carlssone96ab552011-02-28 02:27:16 +00001282 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001283
Anders Carlssone96ab552011-02-28 02:27:16 +00001284 // Exception tables and cleanups can be enabled with -fexceptions even if the
1285 // language itself doesn't support exceptions.
1286 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1287 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001288
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001289 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1290 // is not necessarily sensible, but follows GCC.
1291 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001292 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001293 options::OPT_fno_objc_exceptions,
1294 true)) {
1295 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001296
Eric Christopher84fbdb42011-08-19 00:30:14 +00001297 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001298 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001299 }
1300
1301 if (types::isCXX(InputType)) {
1302 bool CXXExceptionsEnabled = ExceptionsEnabled;
1303
Eric Christopher84fbdb42011-08-19 00:30:14 +00001304 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1305 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001306 options::OPT_fexceptions,
1307 options::OPT_fno_exceptions)) {
1308 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1309 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001310 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001311 CXXExceptionsEnabled = false;
1312 }
1313
1314 if (CXXExceptionsEnabled) {
1315 CmdArgs.push_back("-fcxx-exceptions");
1316
1317 ShouldUseExceptionTables = true;
1318 }
1319 }
1320
1321 if (ShouldUseExceptionTables)
1322 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001323}
1324
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001325static bool ShouldDisableCFI(const ArgList &Args,
1326 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001327 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001328 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001329 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001330 // we disable them if we think the .s file will be passed to it.
Rafael Espindolac41db922012-03-08 14:39:55 +00001331 Default = Args.hasFlag(options::OPT_integrated_as,
1332 options::OPT_no_integrated_as,
1333 TC.IsIntegratedAssemblerDefault());
Rafael Espindolaf934f982011-05-17 16:26:17 +00001334 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001335 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
1336 options::OPT_fno_dwarf2_cfi_asm,
1337 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001338}
1339
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001340static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1341 const ToolChain &TC) {
1342 bool IsIADefault = TC.IsIntegratedAssemblerDefault();
1343 bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
1344 options::OPT_no_integrated_as,
1345 IsIADefault);
1346 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1347 options::OPT_fno_dwarf_directory_asm,
1348 UseIntegratedAs);
1349 return !UseDwarfDirectory;
1350}
1351
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001352/// \brief Check whether the given input tree contains any compilation actions.
1353static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001354 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001355 return true;
1356
1357 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1358 if (ContainsCompileAction(*it))
1359 return true;
1360
1361 return false;
1362}
1363
1364/// \brief Check if -relax-all should be passed to the internal assembler.
1365/// This is done by default when compiling non-assembler source with -O0.
1366static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1367 bool RelaxDefault = true;
1368
1369 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1370 RelaxDefault = A->getOption().matches(options::OPT_O0);
1371
1372 if (RelaxDefault) {
1373 RelaxDefault = false;
1374 for (ActionList::const_iterator it = C.getActions().begin(),
1375 ie = C.getActions().end(); it != ie; ++it) {
1376 if (ContainsCompileAction(*it)) {
1377 RelaxDefault = true;
1378 break;
1379 }
1380 }
1381 }
1382
1383 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1384 RelaxDefault);
1385}
1386
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001387/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1388/// This needs to be called before we add the C run-time (malloc, etc).
1389static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001390 ArgStringList &CmdArgs) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001391 if (!Args.hasFlag(options::OPT_faddress_sanitizer,
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001392 options::OPT_fno_address_sanitizer, false))
1393 return;
Logan Chienc6fd8202012-09-02 09:30:11 +00001394 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001395 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanovea155f02012-06-04 11:15:05 +00001396 if (!Args.hasArg(options::OPT_pie))
1397 TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001398 }
Daniel Dunbar3ca41d42011-12-07 23:22:17 +00001399
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001400 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1401 llvm::sys::path::append(LibAsan, "lib", "linux",
1402 (Twine("libclang_rt.asan-") +
1403 TC.getArchName() + "-android.so"));
1404 CmdArgs.push_back(Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001405 } else {
1406 if (!Args.hasArg(options::OPT_shared)) {
1407 // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
1408 // resource directory.
1409 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1410 llvm::sys::path::append(LibAsan, "lib", "linux",
1411 (Twine("libclang_rt.asan-") +
1412 TC.getArchName() + ".a"));
1413 CmdArgs.push_back(Args.MakeArgString(LibAsan));
1414 CmdArgs.push_back("-lpthread");
1415 CmdArgs.push_back("-ldl");
1416 CmdArgs.push_back("-export-dynamic");
1417 }
1418 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001419}
1420
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001421/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1422/// This needs to be called before we add the C run-time (malloc, etc).
1423static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1424 ArgStringList &CmdArgs) {
1425 if (!Args.hasFlag(options::OPT_fthread_sanitizer,
1426 options::OPT_fno_thread_sanitizer, false))
1427 return;
1428 if (!Args.hasArg(options::OPT_shared)) {
1429 // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library
1430 // resource directory.
1431 SmallString<128> LibTsan(TC.getDriver().ResourceDir);
1432 llvm::sys::path::append(LibTsan, "lib", "linux",
1433 (Twine("libclang_rt.tsan-") +
1434 TC.getArchName() + ".a"));
1435 CmdArgs.push_back(Args.MakeArgString(LibTsan));
1436 CmdArgs.push_back("-lpthread");
1437 CmdArgs.push_back("-ldl");
1438 CmdArgs.push_back("-export-dynamic");
1439 }
1440}
1441
Rafael Espindola224dd632011-12-14 21:02:23 +00001442static bool shouldUseFramePointer(const ArgList &Args,
1443 const llvm::Triple &Triple) {
1444 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1445 options::OPT_fomit_frame_pointer))
1446 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1447
Rafael Espindola00b29182011-12-14 21:50:24 +00001448 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001449 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1450 Triple.getArch() == llvm::Triple::x86) &&
1451 Triple.getOS() == llvm::Triple::Linux) {
1452 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1453 if (!A->getOption().matches(options::OPT_O0))
1454 return false;
1455 }
1456
1457 return true;
1458}
1459
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001460void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001461 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001462 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001463 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001464 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001465 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1466 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001467 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001468 ArgStringList CmdArgs;
1469
Daniel Dunbare521a892009-03-31 20:53:55 +00001470 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1471
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001472 // Invoke ourselves in -cc1 mode.
1473 //
1474 // FIXME: Implement custom jobs for internal actions.
1475 CmdArgs.push_back("-cc1");
1476
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001477 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001478 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001479 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001480 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001481
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001482 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001483 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001484
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001485 if (isa<AnalyzeJobAction>(JA)) {
1486 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1487 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001488 } else if (isa<MigrateJobAction>(JA)) {
1489 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001490 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001491 if (Output.getType() == types::TY_Dependencies)
1492 CmdArgs.push_back("-Eonly");
1493 else
1494 CmdArgs.push_back("-E");
Daniel Dunbarc4343942010-02-03 03:07:56 +00001495 } else if (isa<AssembleJobAction>(JA)) {
1496 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001497
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001498 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001499 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001500
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001501 // When using an integrated assembler, translate -Wa, and -Xassembler
1502 // options.
1503 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1504 options::OPT_Xassembler),
1505 ie = Args.filtered_end(); it != ie; ++it) {
1506 const Arg *A = *it;
1507 A->claim();
1508
1509 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001510 StringRef Value = A->getValue(Args, i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001511
1512 if (Value == "-force_cpusubtype_ALL") {
1513 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001514 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001515 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001516 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001517 CmdArgs.push_back("-mllvm");
1518 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001519 } else if (Value == "--noexecstack") {
1520 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001521 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001522 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001523 << A->getOption().getName() << Value;
1524 }
1525 }
1526 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001527
1528 // Also ignore explicit -force_cpusubtype_ALL option.
1529 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001530 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001531 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001532 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001533
Aaron Ballman1f10cc52012-07-31 01:21:00 +00001534 if (JA.getType() == types::TY_Nothing)
1535 CmdArgs.push_back("-fsyntax-only");
1536 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001537 CmdArgs.push_back("-emit-pch");
1538 else
1539 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001540 } else {
1541 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001542
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001543 if (JA.getType() == types::TY_Nothing) {
1544 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001545 } else if (JA.getType() == types::TY_LLVM_IR ||
1546 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001547 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001548 } else if (JA.getType() == types::TY_LLVM_BC ||
1549 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001550 CmdArgs.push_back("-emit-llvm-bc");
1551 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00001552 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00001553 } else if (JA.getType() == types::TY_AST) {
1554 CmdArgs.push_back("-emit-pch");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001555 } else if (JA.getType() == types::TY_RewrittenObjC) {
1556 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001557 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00001558 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1559 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001560 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001561 } else {
1562 assert(JA.getType() == types::TY_PP_Asm &&
1563 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001564 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00001565 }
1566
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001567 // The make clang go fast button.
1568 CmdArgs.push_back("-disable-free");
1569
John McCallbb79b5f2010-02-13 03:50:24 +00001570 // Disable the verification pass in -asserts builds.
1571#ifdef NDEBUG
1572 CmdArgs.push_back("-disable-llvm-verifier");
1573#endif
1574
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001575 // Set the main file name, so that debug info works even with
1576 // -save-temps.
1577 CmdArgs.push_back("-main-file-name");
1578 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1579
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001580 // Some flags which affect the language (via preprocessor
1581 // defines). See darwin::CC1::AddCPPArgs.
1582 if (Args.hasArg(options::OPT_static))
1583 CmdArgs.push_back("-static-define");
1584
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001585 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00001586 // Enable region store model by default.
1587 CmdArgs.push_back("-analyzer-store=region");
1588
Ted Kremenek7bea9a12009-12-07 22:26:14 +00001589 // Treat blocks as analysis entry points.
1590 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1591
Ted Kremenek49c79792011-03-24 00:28:47 +00001592 CmdArgs.push_back("-analyzer-eagerly-assume");
1593
Anna Zaks0af3e062012-03-08 23:16:35 +00001594 CmdArgs.push_back("-analyzer-ipa=inlining");
Anna Zaksd5c30272012-03-01 22:37:46 +00001595
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001596 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001597 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001598 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00001599
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001600 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1601 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00001602
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001603 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00001604 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00001605
1606 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00001607
1608 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00001609 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1610 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1611 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1612 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1613 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1614 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001615 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001616
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001617 // Set the output format. The default is plist, for (lame) historical
1618 // reasons.
1619 CmdArgs.push_back("-analyzer-output");
1620 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
1621 CmdArgs.push_back(A->getValue(Args));
1622 else
1623 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001624
Ted Kremenekfe449a22010-03-22 22:32:05 +00001625 // Disable the presentation of standard compiler warnings when
1626 // using --analyze. We only want to show static analyzer diagnostics
1627 // or frontend errors.
1628 CmdArgs.push_back("-w");
1629
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001630 // Add -Xanalyzer arguments when running as analyzer.
1631 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00001632 }
1633
Daniel Dunbar4eadb602009-09-10 01:21:12 +00001634 CheckCodeGenerationOptions(D, Args);
1635
Daniel Dunbar44e71222009-04-29 18:32:25 +00001636 // Perform argument translation for LLVM backend. This
1637 // takes some care in reconciling with llvm-gcc. The
1638 // issue is that llvm-gcc translates these options based on
1639 // the values in cc1, whereas we are processing based on
1640 // the driver arguments.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001641
Daniel Dunbar44e71222009-04-29 18:32:25 +00001642 // This comes from the default translation the driver + cc1
1643 // would do to enable flag_pic.
Simon Atanasyana16b7fd2012-05-29 18:50:33 +00001644
1645 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1646 options::OPT_fpic, options::OPT_fno_pic,
1647 options::OPT_fPIE, options::OPT_fno_PIE,
1648 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruthc0c04552012-04-08 16:40:35 +00001649 bool PICDisabled = false;
1650 bool PICEnabled = false;
1651 bool PICForPIE = false;
1652 if (LastPICArg) {
1653 PICForPIE = (LastPICArg->getOption().matches(options::OPT_fPIE) ||
1654 LastPICArg->getOption().matches(options::OPT_fpie));
1655 PICEnabled = (PICForPIE ||
1656 LastPICArg->getOption().matches(options::OPT_fPIC) ||
1657 LastPICArg->getOption().matches(options::OPT_fpic));
1658 PICDisabled = !PICEnabled;
1659 }
1660 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1661 // PIC or PIE options above, if these show up, PIC is disabled.
1662 if (Args.hasArg(options::OPT_mkernel))
1663 PICDisabled = true;
1664 if (Args.hasArg(options::OPT_static))
1665 PICDisabled = true;
1666 bool DynamicNoPIC = Args.hasArg(options::OPT_mdynamic_no_pic);
1667
1668 // Select the relocation model.
Daniel Dunbar44e71222009-04-29 18:32:25 +00001669 const char *Model = getToolChain().GetForcedPicModel();
1670 if (!Model) {
Chandler Carruthc0c04552012-04-08 16:40:35 +00001671 if (DynamicNoPIC)
Daniel Dunbar44e71222009-04-29 18:32:25 +00001672 Model = "dynamic-no-pic";
1673 else if (PICDisabled)
1674 Model = "static";
1675 else if (PICEnabled)
1676 Model = "pic";
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001677 else
Daniel Dunbar44e71222009-04-29 18:32:25 +00001678 Model = getToolChain().GetDefaultRelocationModel();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001679 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001680 StringRef ModelStr = Model ? Model : "";
1681 if (Model && ModelStr != "pic") {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001682 CmdArgs.push_back("-mrelocation-model");
1683 CmdArgs.push_back(Model);
1684 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001685
Chandler Carruthc0c04552012-04-08 16:40:35 +00001686 // Infer the __PIC__ and __PIE__ values.
1687 if (ModelStr == "pic" && PICForPIE) {
1688 CmdArgs.push_back("-pie-level");
1689 CmdArgs.push_back((LastPICArg &&
1690 LastPICArg->getOption().matches(options::OPT_fPIE)) ?
1691 "2" : "1");
1692 } else if (ModelStr == "pic" || ModelStr == "dynamic-no-pic") {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00001693 CmdArgs.push_back("-pic-level");
Chandler Carruthc0c04552012-04-08 16:40:35 +00001694 CmdArgs.push_back(((ModelStr != "dynamic-no-pic" && LastPICArg &&
1695 LastPICArg->getOption().matches(options::OPT_fPIC)) ||
1696 getToolChain().getTriple().isOSDarwin()) ? "2" : "1");
Daniel Dunbar44e71222009-04-29 18:32:25 +00001697 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001698
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00001699 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1700 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00001701 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00001702
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001703 // LLVM Code Generator Options.
1704
Daniel Dunbar0bb03312011-02-09 17:54:19 +00001705 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
1706 CmdArgs.push_back("-mregparm");
1707 CmdArgs.push_back(A->getValue(Args));
1708 }
1709
Roman Divacky65b88cd2011-03-01 17:40:53 +00001710 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1711 CmdArgs.push_back("-mrtd");
1712
Rafael Espindola224dd632011-12-14 21:02:23 +00001713 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001714 CmdArgs.push_back("-mdisable-fp-elim");
1715 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1716 options::OPT_fno_zero_initialized_in_bss))
1717 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00001718 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1719 options::OPT_fno_strict_aliasing,
1720 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00001721 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00001722 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
1723 false))
1724 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00001725 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
1726 options::OPT_fno_optimize_sibling_calls))
1727 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001728
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001729 // Handle various floating point optimization flags, mapping them to the
1730 // appropriate LLVM code generation flags. The pattern for all of these is to
1731 // default off the codegen optimizations, and if any flag enables them and no
1732 // flag disables them after the flag enabling them, enable the codegen
1733 // optimization. This is complicated by several "umbrella" flags.
1734 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1735 options::OPT_ffinite_math_only,
1736 options::OPT_fno_finite_math_only,
1737 options::OPT_fhonor_infinities,
1738 options::OPT_fno_honor_infinities))
1739 if (A->getOption().getID() != options::OPT_fno_finite_math_only &&
1740 A->getOption().getID() != options::OPT_fhonor_infinities)
1741 CmdArgs.push_back("-menable-no-infs");
1742 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1743 options::OPT_ffinite_math_only,
1744 options::OPT_fno_finite_math_only,
1745 options::OPT_fhonor_nans,
1746 options::OPT_fno_honor_nans))
1747 if (A->getOption().getID() != options::OPT_fno_finite_math_only &&
1748 A->getOption().getID() != options::OPT_fhonor_nans)
1749 CmdArgs.push_back("-menable-no-nans");
1750
Benjamin Kramerc242ef22012-05-02 14:55:48 +00001751 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
1752 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001753 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1754 options::OPT_fmath_errno,
Chandler Carruth3634c662012-04-26 02:10:51 +00001755 options::OPT_fno_math_errno))
1756 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
1757 if (MathErrno)
1758 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001759
1760 // There are several flags which require disabling very specific
1761 // optimizations. Any of these being disabled forces us to turn off the
1762 // entire set of LLVM optimizations, so collect them through all the flag
1763 // madness.
1764 bool AssociativeMath = false;
1765 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1766 options::OPT_funsafe_math_optimizations,
1767 options::OPT_fno_unsafe_math_optimizations,
1768 options::OPT_fassociative_math,
1769 options::OPT_fno_associative_math))
1770 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1771 A->getOption().getID() != options::OPT_fno_associative_math)
1772 AssociativeMath = true;
1773 bool ReciprocalMath = false;
1774 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1775 options::OPT_funsafe_math_optimizations,
1776 options::OPT_fno_unsafe_math_optimizations,
1777 options::OPT_freciprocal_math,
1778 options::OPT_fno_reciprocal_math))
1779 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1780 A->getOption().getID() != options::OPT_fno_reciprocal_math)
1781 ReciprocalMath = true;
1782 bool SignedZeros = true;
1783 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1784 options::OPT_funsafe_math_optimizations,
1785 options::OPT_fno_unsafe_math_optimizations,
1786 options::OPT_fsigned_zeros,
1787 options::OPT_fno_signed_zeros))
1788 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1789 A->getOption().getID() != options::OPT_fsigned_zeros)
1790 SignedZeros = false;
1791 bool TrappingMath = true;
1792 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1793 options::OPT_funsafe_math_optimizations,
1794 options::OPT_fno_unsafe_math_optimizations,
1795 options::OPT_ftrapping_math,
1796 options::OPT_fno_trapping_math))
1797 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1798 A->getOption().getID() != options::OPT_ftrapping_math)
1799 TrappingMath = false;
1800 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
1801 !TrappingMath)
1802 CmdArgs.push_back("-menable-unsafe-fp-math");
1803
Lang Hamesaa53b932012-07-06 00:59:19 +00001804
1805 // Validate and pass through -fp-contract option.
1806 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1807 options::OPT_ffp_contract)) {
1808 if (A->getOption().getID() == options::OPT_ffp_contract) {
1809 StringRef Val = A->getValue(Args);
1810 if (Val == "fast" || Val == "on" || Val == "off") {
1811 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
1812 } else {
1813 D.Diag(diag::err_drv_unsupported_option_argument)
1814 << A->getOption().getName() << Val;
1815 }
1816 } else { // A is OPT_ffast_math
1817 // If fast-math is set then set the fp-contract mode to fast.
1818 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
1819 }
1820 }
1821
Bob Wilson6a039162012-07-19 03:52:53 +00001822 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
1823 // and if we find them, tell the frontend to provide the appropriate
1824 // preprocessor macros. This is distinct from enabling any optimizations as
1825 // these options induce language changes which must survive serialization
1826 // and deserialization, etc.
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001827 if (Args.hasArg(options::OPT_ffast_math))
1828 CmdArgs.push_back("-ffast-math");
Bob Wilson6a039162012-07-19 03:52:53 +00001829 if (Args.hasArg(options::OPT_ffinite_math_only))
1830 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001831
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001832 // Decide whether to use verbose asm. Verbose assembly is the default on
1833 // toolchains which have the integrated assembler on by default.
1834 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
1835 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001836 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001837 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001838 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001839
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001840 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
1841 CmdArgs.push_back("-mdebug-pass");
1842 CmdArgs.push_back("Structure");
1843 }
1844 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
1845 CmdArgs.push_back("-mdebug-pass");
1846 CmdArgs.push_back("Arguments");
1847 }
1848
John McCall8517abc2010-02-19 02:45:38 +00001849 // Enable -mconstructor-aliases except on darwin, where we have to
1850 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00001851 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00001852 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00001853
John McCall7ef5cb32011-03-18 02:56:14 +00001854 // Darwin's kernel doesn't support guard variables; just die if we
1855 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00001856 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00001857 CmdArgs.push_back("-fforbid-guard-variables");
1858
Douglas Gregordbe39272011-02-01 15:15:22 +00001859 if (Args.hasArg(options::OPT_mms_bitfields)) {
1860 CmdArgs.push_back("-mms-bitfields");
1861 }
John McCall8517abc2010-02-19 02:45:38 +00001862
Daniel Dunbar306945d2009-09-16 06:17:29 +00001863 // This is a coarse approximation of what llvm-gcc actually does, both
1864 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
1865 // complicated ways.
1866 bool AsynchronousUnwindTables =
1867 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
1868 options::OPT_fno_asynchronous_unwind_tables,
1869 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001870 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00001871 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
1872 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001873 CmdArgs.push_back("-munwind-tables");
1874
Rafael Espindola66aa0452012-06-19 01:26:10 +00001875 getToolChain().addClangTargetOptions(CmdArgs);
1876
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001877 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
1878 CmdArgs.push_back("-mlimit-float-precision");
1879 CmdArgs.push_back(A->getValue(Args));
1880 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001881
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001882 // FIXME: Handle -mtune=.
1883 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00001884
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001885 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001886 CmdArgs.push_back("-mcode-model");
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001887 CmdArgs.push_back(A->getValue(Args));
1888 }
1889
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001890 // Add target specific cpu and features flags.
1891 switch(getToolChain().getTriple().getArch()) {
1892 default:
1893 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001894
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001895 case llvm::Triple::arm:
1896 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00001897 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001898 break;
1899
Eric Christopher0b26a612010-03-02 02:41:08 +00001900 case llvm::Triple::mips:
1901 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00001902 case llvm::Triple::mips64:
1903 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00001904 AddMIPSTargetArgs(Args, CmdArgs);
1905 break;
1906
Hal Finkel8eb59282012-06-11 22:35:19 +00001907 case llvm::Triple::ppc:
1908 case llvm::Triple::ppc64:
1909 AddPPCTargetArgs(Args, CmdArgs);
1910 break;
1911
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001912 case llvm::Triple::sparc:
1913 AddSparcTargetArgs(Args, CmdArgs);
1914 break;
1915
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001916 case llvm::Triple::x86:
1917 case llvm::Triple::x86_64:
1918 AddX86TargetArgs(Args, CmdArgs);
1919 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001920
1921 case llvm::Triple::hexagon:
1922 AddHexagonTargetArgs(Args, CmdArgs);
1923 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00001924 }
1925
Tony Linthicum76329bf2011-12-12 21:14:55 +00001926
1927
Daniel Dunbar976a2f52010-08-11 23:07:47 +00001928 // Pass the linker version in use.
1929 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1930 CmdArgs.push_back("-target-linker-version");
1931 CmdArgs.push_back(A->getValue(Args));
1932 }
1933
Nick Lewycky75033772011-02-02 06:43:03 +00001934 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00001935 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewycky75033772011-02-02 06:43:03 +00001936 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson6524dd32011-10-14 05:03:44 +00001937 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00001938 CmdArgs.push_back("-momit-leaf-frame-pointer");
1939
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00001940 // Explicitly error on some things we know we don't support and can't just
1941 // ignore.
1942 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001943 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
1944 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001945 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00001946 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001947 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00001948 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
1949 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001950 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001951 << Unsupported->getOption().getName();
1952 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00001953 }
1954
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001955 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00001956 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00001957 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00001958 CmdArgs.push_back("-header-include-file");
1959 CmdArgs.push_back(D.CCPrintHeadersFilename ?
1960 D.CCPrintHeadersFilename : "-");
1961 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001962 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00001963 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001964
Chad Rosierbe10f982011-08-02 17:58:04 +00001965 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00001966 CmdArgs.push_back("-diagnostic-log-file");
1967 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
1968 D.CCLogDiagnosticsFilename : "-");
1969 }
1970
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00001971 // Use the last option from "-g" group. "-gline-tables-only" is
1972 // preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00001973 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00001974 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
1975 if (A->getOption().matches(options::OPT_gline_tables_only)) {
1976 CmdArgs.push_back("-gline-tables-only");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00001977 } else if (!A->getOption().matches(options::OPT_g0) &&
1978 !A->getOption().matches(options::OPT_ggdb0)) {
Chad Rosier8fe3b112011-11-07 19:52:29 +00001979 CmdArgs.push_back("-g");
Chad Rosierc2bf3382011-11-04 19:28:44 +00001980 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00001981 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001982
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00001983 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
1984 Args.ClaimAllArgs(options::OPT_g_flags_Group);
1985
Rafael Espindola66bfb2752010-05-06 21:06:04 +00001986 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
1987 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
1988
Chris Lattner3c77a352010-06-22 00:03:40 +00001989 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
1990
Nick Lewycky207bce32011-04-21 23:44:07 +00001991 if (Args.hasArg(options::OPT_ftest_coverage) ||
1992 Args.hasArg(options::OPT_coverage))
1993 CmdArgs.push_back("-femit-coverage-notes");
1994 if (Args.hasArg(options::OPT_fprofile_arcs) ||
1995 Args.hasArg(options::OPT_coverage))
1996 CmdArgs.push_back("-femit-coverage-data");
1997
Nick Lewycky480cb992011-05-04 20:46:58 +00001998 if (C.getArgs().hasArg(options::OPT_c) ||
1999 C.getArgs().hasArg(options::OPT_S)) {
2000 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002001 CmdArgs.push_back("-coverage-file");
Bill Wendling8c0b4bc2012-08-30 00:43:41 +00002002 SmallString<128> absFilename(Output.getFilename());
2003 llvm::sys::fs::make_absolute(absFilename);
2004 CmdArgs.push_back(Args.MakeArgString(absFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002005 }
2006 }
2007
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002008 // Pass options for controlling the default header search paths.
2009 if (Args.hasArg(options::OPT_nostdinc)) {
2010 CmdArgs.push_back("-nostdsysteminc");
2011 CmdArgs.push_back("-nobuiltininc");
2012 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002013 if (Args.hasArg(options::OPT_nostdlibinc))
2014 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002015 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2016 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2017 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002018
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002019 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002020 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002021 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002022
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002023 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2024
Ted Kremenekf7639e12012-03-06 20:06:33 +00002025 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002026 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002027 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002028 options::OPT_ccc_arcmt_modify,
2029 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002030 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002031 switch (A->getOption().getID()) {
2032 default:
2033 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002034 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002035 CmdArgs.push_back("-arcmt-check");
2036 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002037 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002038 CmdArgs.push_back("-arcmt-modify");
2039 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002040 case options::OPT_ccc_arcmt_migrate:
2041 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002042 CmdArgs.push_back("-mt-migrate-directory");
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002043 CmdArgs.push_back(A->getValue(Args));
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002044
2045 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2046 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002047 break;
John McCalld70fb982011-06-15 23:25:17 +00002048 }
2049 }
2050 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002051
Ted Kremenekf7639e12012-03-06 20:06:33 +00002052 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2053 if (ARCMTEnabled) {
2054 D.Diag(diag::err_drv_argument_not_allowed_with)
2055 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2056 }
2057 CmdArgs.push_back("-mt-migrate-directory");
2058 CmdArgs.push_back(A->getValue(Args));
2059
2060 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2061 options::OPT_objcmt_migrate_subscripting)) {
2062 // None specified, means enable them all.
2063 CmdArgs.push_back("-objcmt-migrate-literals");
2064 CmdArgs.push_back("-objcmt-migrate-subscripting");
2065 } else {
2066 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2067 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2068 }
2069 }
2070
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002071 // Add preprocessing options like -I, -D, etc. if we are using the
2072 // preprocessor.
2073 //
2074 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002075 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Peter Collingbourne9b515cb2011-11-06 00:40:05 +00002076 AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002077
Rafael Espindolaa7431922011-07-21 23:40:37 +00002078 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2079 // that "The compiler can only warn and ignore the option if not recognized".
2080 // When building with ccache, it will pass -D options to clang even on
2081 // preprocessed inputs and configure concludes that -fPIC is not supported.
2082 Args.ClaimAllArgs(options::OPT_D);
2083
Daniel Dunbar58f78332009-09-17 06:53:36 +00002084 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002085 // others.
2086 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002087 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002088 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002089 else if (A->getOption().matches(options::OPT_O) &&
2090 A->getValue(Args)[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002091 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002092 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002093 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002094 }
2095
Daniel Dunbar945577c2009-10-29 02:24:45 +00002096 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002097 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2098 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002099 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002100 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002101
2102 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2103 // (-ansi is equivalent to -std=c89).
2104 //
2105 // If a std is supplied, only add -trigraphs if it follows the
2106 // option.
2107 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2108 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002109 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002110 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002111 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002112 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002113 else
2114 Std->render(Args, CmdArgs);
2115
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002116 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2117 options::OPT_trigraphs))
2118 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002119 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002120 } else {
2121 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002122 //
2123 // FIXME: Clang doesn't correctly handle -std= when the input language
2124 // doesn't match. For the time being just ignore this for C++ inputs;
2125 // eventually we want to do all the standard defaulting here instead of
2126 // splitting it between the driver and clang -cc1.
2127 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002128 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2129 "-std=", /*Joined=*/true);
2130 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2131 CmdArgs.push_back("-std=c++11");
2132
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002133 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002134 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002135
Chandler Carruthb009b142011-04-23 06:30:43 +00002136 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2137 // '-fconst-strings'; this better indicates its actual behavior.
2138 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2139 false)) {
2140 // For perfect compatibility with GCC, we do this even in the presence of
2141 // '-w'. This flag names something other than a warning for GCC.
2142 CmdArgs.push_back("-fconst-strings");
2143 }
2144
Chandler Carruth61fbf622011-04-23 09:27:53 +00002145 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002146 // during C++ compilation, which it is by default. GCC keeps this define even
2147 // in the presence of '-w', match this behavior bug-for-bug.
2148 if (types::isCXX(InputType) &&
2149 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2150 true)) {
2151 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002152 }
2153
Chandler Carruthe0391482010-05-22 02:21:53 +00002154 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2155 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2156 if (Asm->getOption().matches(options::OPT_fasm))
2157 CmdArgs.push_back("-fgnu-keywords");
2158 else
2159 CmdArgs.push_back("-fno-gnu-keywords");
2160 }
2161
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002162 if (ShouldDisableCFI(Args, getToolChain()))
2163 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002164
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002165 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2166 CmdArgs.push_back("-fno-dwarf-directory-asm");
2167
Nick Lewyckyba743b72011-10-21 02:32:14 +00002168 if (const char *pwd = ::getenv("PWD")) {
2169 // GCC also verifies that stat(pwd) and stat(".") have the same inode
2170 // number. Not doing those because stats are slow, but we could.
NAKAMURA Takumib5e6fa22011-10-22 10:25:25 +00002171 if (llvm::sys::path::is_absolute(pwd)) {
Nick Lewyckyba743b72011-10-21 02:32:14 +00002172 std::string CompDir = pwd;
2173 CmdArgs.push_back("-fdebug-compilation-dir");
2174 CmdArgs.push_back(Args.MakeArgString(CompDir));
2175 }
2176 }
2177
Richard Smith9a568822011-11-21 19:36:32 +00002178 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2179 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002180 CmdArgs.push_back("-ftemplate-depth");
2181 CmdArgs.push_back(A->getValue(Args));
2182 }
2183
Richard Smith9a568822011-11-21 19:36:32 +00002184 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2185 CmdArgs.push_back("-fconstexpr-depth");
2186 CmdArgs.push_back(A->getValue(Args));
2187 }
2188
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002189 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2190 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002191 if (A->getNumValues()) {
2192 StringRef bytes = A->getValue(Args);
2193 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2194 } else
2195 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002196 }
2197
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002198 if (Arg *A = Args.getLastArg(options::OPT_fbounds_checking,
2199 options::OPT_fbounds_checking_EQ)) {
2200 if (A->getNumValues()) {
2201 StringRef val = A->getValue(Args);
2202 CmdArgs.push_back(Args.MakeArgString("-fbounds-checking=" + val));
2203 } else
2204 CmdArgs.push_back("-fbounds-checking=1");
2205 }
2206
Daniel Dunbarfffd1812009-11-19 04:00:53 +00002207 if (Args.hasArg(options::OPT__relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002208 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002209
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002210 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2211 CmdArgs.push_back("-fconstant-string-class");
2212 CmdArgs.push_back(A->getValue(Args));
2213 }
David Chisnall5778fce2009-08-31 16:41:57 +00002214
Chris Lattnere23003d2010-01-09 21:54:33 +00002215 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2216 CmdArgs.push_back("-ftabstop");
2217 CmdArgs.push_back(A->getValue(Args));
2218 }
2219
Chris Lattnerb35583d2010-04-07 20:49:23 +00002220 CmdArgs.push_back("-ferror-limit");
2221 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
2222 CmdArgs.push_back(A->getValue(Args));
2223 else
2224 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002225
Chandler Carrutha77a7272010-05-06 04:55:18 +00002226 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2227 CmdArgs.push_back("-fmacro-backtrace-limit");
Douglas Gregorcd121fb2010-05-04 17:13:42 +00002228 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002229 }
2230
2231 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2232 CmdArgs.push_back("-ftemplate-backtrace-limit");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002233 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002234 }
2235
Richard Smithf6f003a2011-12-16 19:06:07 +00002236 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2237 CmdArgs.push_back("-fconstexpr-backtrace-limit");
2238 CmdArgs.push_back(A->getValue(Args));
2239 }
2240
Daniel Dunbar2c978472009-11-04 06:24:47 +00002241 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002242 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002243 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002244 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002245 } else {
2246 // If -fmessage-length=N was not specified, determine whether this is a
2247 // terminal and, if so, implicitly define -fmessage-length appropriately.
2248 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002249 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002250 }
2251
Daniel Dunbare357d562009-12-03 18:42:11 +00002252 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2253 CmdArgs.push_back("-fvisibility");
2254 CmdArgs.push_back(A->getValue(Args));
2255 }
2256
Douglas Gregor08329632010-06-15 17:05:35 +00002257 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002258
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002259 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2260
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002261 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002262 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2263 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002264 CmdArgs.push_back("-ffreestanding");
2265
Daniel Dunbare357d562009-12-03 18:42:11 +00002266 // Forward -f (flag) options which we can pass directly.
Mike Stumpd9546382009-12-12 01:27:46 +00002267 Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002268 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002269 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002270 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002271 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002272 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002273 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002274 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2275 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002276
2277 // Report and error for -faltivec on anything other then PowerPC.
2278 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2279 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2280 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2281 D.Diag(diag::err_drv_argument_only_allowed_with)
2282 << A->getAsString(Args) << "ppc/ppc64";
2283
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002284 if (getToolChain().SupportsProfiling())
2285 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002286
Kostya Serebryany8855ff62011-11-16 17:34:26 +00002287 if (Args.hasFlag(options::OPT_faddress_sanitizer,
2288 options::OPT_fno_address_sanitizer, false))
2289 CmdArgs.push_back("-faddress-sanitizer");
2290
Kostya Serebryany28a7a112012-03-01 22:27:08 +00002291 if (Args.hasFlag(options::OPT_fthread_sanitizer,
2292 options::OPT_fno_thread_sanitizer, false))
2293 CmdArgs.push_back("-fthread-sanitizer");
2294
Daniel Dunbar35621a92010-03-16 16:57:46 +00002295 // -flax-vector-conversions is default.
2296 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2297 options::OPT_fno_lax_vector_conversions))
2298 CmdArgs.push_back("-fno-lax-vector-conversions");
2299
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002300 if (Args.getLastArg(options::OPT_fapple_kext))
2301 CmdArgs.push_back("-fapple-kext");
2302
David Blaikie690f21e2012-06-14 18:55:27 +00002303 if (Args.hasFlag(options::OPT_frewrite_includes,
2304 options::OPT_fno_rewrite_includes, false))
2305 CmdArgs.push_back("-frewrite-includes");
2306
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002307 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002308 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002309 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002310 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2311 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002312
2313 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2314 CmdArgs.push_back("-ftrapv-handler");
2315 CmdArgs.push_back(A->getValue(Args));
2316 }
2317
Bob Wilson14adb362012-02-03 06:27:22 +00002318 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002319
Chandler Carruth6e501032011-03-27 00:04:55 +00002320 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2321 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2322 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2323 options::OPT_fno_wrapv)) {
2324 if (A->getOption().matches(options::OPT_fwrapv))
2325 CmdArgs.push_back("-fwrapv");
2326 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2327 options::OPT_fno_strict_overflow)) {
2328 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2329 CmdArgs.push_back("-fwrapv");
2330 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002331 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002332 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002333
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002334 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2335
Daniel Dunbar4930e332009-11-17 08:07:36 +00002336 // -stack-protector=0 is default.
2337 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002338 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2339 options::OPT_fstack_protector_all,
2340 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002341 if (A->getOption().matches(options::OPT_fstack_protector))
2342 StackProtectorLevel = 1;
2343 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2344 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002345 } else {
2346 StackProtectorLevel =
2347 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2348 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002349 if (StackProtectorLevel) {
2350 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002351 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002352 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002353
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002354 // --param ssp-buffer-size=
2355 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2356 ie = Args.filtered_end(); it != ie; ++it) {
2357 StringRef Str((*it)->getValue(Args));
2358 if (Str.startswith("ssp-buffer-size=")) {
2359 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00002360 CmdArgs.push_back("-stack-protector-buffer-size");
2361 // FIXME: Verify the argument is a valid integer.
2362 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002363 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002364 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00002365 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002366 }
2367
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002368 // Translate -mstackrealign
2369 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2370 false)) {
2371 CmdArgs.push_back("-backend-option");
2372 CmdArgs.push_back("-force-align-stack");
2373 }
2374 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2375 false)) {
2376 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2377 }
2378
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002379 if (Args.hasArg(options::OPT_mstack_alignment)) {
2380 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2381 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002382 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002383
Daniel Dunbard18049a2009-04-07 21:16:11 +00002384 // Forward -f options with positive and negative forms; we translate
2385 // these by hand.
2386
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002387 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002388 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002389 CmdArgs.push_back("-fapple-kext");
2390 if (!Args.hasArg(options::OPT_fbuiltin))
2391 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002392 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002393 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002394 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002395 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002396 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002397
Nuno Lopes13c88c72009-12-16 16:59:22 +00002398 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2399 options::OPT_fno_assume_sane_operator_new))
2400 CmdArgs.push_back("-fno-assume-sane-operator-new");
2401
Daniel Dunbar4930e332009-11-17 08:07:36 +00002402 // -fblocks=0 is default.
2403 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002404 getToolChain().IsBlocksDefault()) ||
2405 (Args.hasArg(options::OPT_fgnu_runtime) &&
2406 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2407 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002408 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002409
2410 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2411 !getToolChain().hasBlocksRuntime())
2412 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002413 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002414
Douglas Gregor226173a2012-01-18 15:19:58 +00002415 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2416 // users must also pass -fcxx-modules. The latter flag will disappear once the
2417 // modules implementation is solid for C++/Objective-C++ programs as well.
2418 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2419 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2420 options::OPT_fno_cxx_modules,
2421 false);
2422 if (AllowedInCXX || !types::isCXX(InputType))
2423 CmdArgs.push_back("-fmodules");
2424 }
Douglas Gregor787869b2012-01-03 17:13:05 +00002425
John McCalldfea9982010-04-09 19:12:06 +00002426 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002427 if (Args.hasFlag(options::OPT_fno_access_control,
2428 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002429 false))
John McCall3155f572010-04-09 19:03:51 +00002430 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00002431
Anders Carlssond470fef2010-11-21 00:09:52 +00002432 // -felide-constructors is the default.
2433 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2434 options::OPT_felide_constructors,
2435 false))
2436 CmdArgs.push_back("-fno-elide-constructors");
2437
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002438 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002439 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
2440 KernelOrKext)
Daniel Dunbar484afa22009-11-19 04:55:23 +00002441 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00002442
Tony Linthicum76329bf2011-12-12 21:14:55 +00002443 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002444 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00002445 options::OPT_fno_short_enums,
2446 getToolChain().getTriple().getArch() ==
2447 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002448 CmdArgs.push_back("-fshort-enums");
2449
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002450 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002451 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002452 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00002453 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00002454
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002455 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002456 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002457 options::OPT_fno_threadsafe_statics))
2458 CmdArgs.push_back("-fno-threadsafe-statics");
2459
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002460 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002461 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2462 options::OPT_fno_use_cxa_atexit,
2463 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00002464 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00002465 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2466 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002467 CmdArgs.push_back("-fno-use-cxa-atexit");
2468
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002469 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002470 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002471 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2472 CmdArgs.push_back("-fms-extensions");
2473
Chad Rosiered943242012-07-20 21:20:33 +00002474 // -fms-inline-asm.
Chad Rosierd3957e52012-07-20 23:12:26 +00002475 if (Args.hasArg(options::OPT_fenable_experimental_ms_inline_asm))
2476 CmdArgs.push_back("-fenable-experimental-ms-inline-asm");
Chad Rosiered943242012-07-20 21:20:33 +00002477
Francois Pichet1b4f1632011-09-17 04:32:15 +00002478 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00002479 if (Args.hasFlag(options::OPT_fms_compatibility,
2480 options::OPT_fno_ms_compatibility,
2481 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2482 Args.hasFlag(options::OPT_fms_extensions,
2483 options::OPT_fno_ms_extensions,
2484 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00002485 CmdArgs.push_back("-fms-compatibility");
2486
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002487 // -fmsc-version=1300 is default.
2488 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2489 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2490 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002491 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002492 if (msc_ver.empty())
2493 CmdArgs.push_back("-fmsc-version=1300");
2494 else
2495 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2496 }
2497
2498
Dawn Perchik68bb1b42010-09-02 23:59:25 +00002499 // -fborland-extensions=0 is default.
2500 if (Args.hasFlag(options::OPT_fborland_extensions,
2501 options::OPT_fno_borland_extensions, false))
2502 CmdArgs.push_back("-fborland-extensions");
2503
Francois Pichet02744872011-09-01 16:38:08 +00002504 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2505 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00002506 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2507 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00002508 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00002509 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00002510
Chandler Carruthe03aa552010-04-17 20:17:31 +00002511 // -fgnu-keywords default varies depending on language; only pass if
2512 // specified.
2513 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00002514 options::OPT_fno_gnu_keywords))
2515 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00002516
Rafael Espindola922a6242011-06-02 17:30:53 +00002517 if (Args.hasFlag(options::OPT_fgnu89_inline,
2518 options::OPT_fno_gnu89_inline,
2519 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00002520 CmdArgs.push_back("-fgnu89-inline");
2521
Chad Rosier9c76d242012-03-15 22:31:42 +00002522 if (Args.hasArg(options::OPT_fno_inline))
2523 CmdArgs.push_back("-fno-inline");
2524
Chad Rosier64d6be92012-03-06 21:17:19 +00002525 if (Args.hasArg(options::OPT_fno_inline_functions))
2526 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00002527
John McCall5fb5df92012-06-20 06:18:46 +00002528 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00002529
John McCall5fb5df92012-06-20 06:18:46 +00002530 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2531 // legacy is the default.
2532 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00002533 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2534 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00002535 objcRuntime.isLegacyDispatchDefaultForArch(
2536 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00002537 if (getToolChain().UseObjCMixedDispatch())
2538 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2539 else
2540 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2541 }
2542 }
2543
Nico Weber97bd94b2012-03-09 21:19:44 +00002544 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2545 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00002546 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00002547 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2548 }
2549
John McCall24fc0de2011-07-06 00:26:06 +00002550 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2551 // NOTE: This logic is duplicated in ToolChains.cpp.
2552 bool ARC = isObjCAutoRefCount(Args);
2553 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00002554 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00002555
John McCall24fc0de2011-07-06 00:26:06 +00002556 CmdArgs.push_back("-fobjc-arc");
2557
Chandler Carruth491db322011-11-04 07:34:47 +00002558 // FIXME: It seems like this entire block, and several around it should be
2559 // wrapped in isObjC, but for now we just use it here as this is where it
2560 // was being used previously.
2561 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2562 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2563 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2564 else
2565 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2566 }
2567
John McCall24fc0de2011-07-06 00:26:06 +00002568 // Allow the user to enable full exceptions code emission.
2569 // We define off for Objective-CC, on for Objective-C++.
2570 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2571 options::OPT_fno_objc_arc_exceptions,
2572 /*default*/ types::isCXX(InputType)))
2573 CmdArgs.push_back("-fobjc-arc-exceptions");
2574 }
2575
2576 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2577 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00002578 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00002579 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002580
John McCall24fc0de2011-07-06 00:26:06 +00002581 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2582 // takes precedence.
2583 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2584 if (!GCArg)
2585 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2586 if (GCArg) {
2587 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002588 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00002589 << GCArg->getAsString(Args);
2590 } else if (getToolChain().SupportsObjCGC()) {
2591 GCArg->render(Args, CmdArgs);
2592 } else {
2593 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002594 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00002595 << GCArg->getAsString(Args);
2596 }
2597 }
2598
John McCallb5f652e2011-06-22 00:53:57 +00002599 // Add exception args.
2600 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00002601 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00002602
2603 if (getToolChain().UseSjLjExceptions())
2604 CmdArgs.push_back("-fsjlj-exceptions");
2605
2606 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00002607 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2608 options::OPT_fno_assume_sane_operator_new))
2609 CmdArgs.push_back("-fno-assume-sane-operator-new");
2610
Daniel Dunbar34d7a992010-04-27 15:34:57 +00002611 // -fconstant-cfstrings is default, and may be subject to argument translation
2612 // on Darwin.
2613 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2614 options::OPT_fno_constant_cfstrings) ||
2615 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2616 options::OPT_mno_constant_cfstrings))
2617 CmdArgs.push_back("-fno-constant-cfstrings");
2618
John Thompsoned4e2952009-11-05 20:14:16 +00002619 // -fshort-wchar default varies depending on platform; only
2620 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00002621 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2622 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00002623
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00002624 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2625 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00002626 //
2627 // FIXME: This is gross; that translation should be pulled from the
2628 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002629 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00002630 options::OPT_fno_pascal_strings,
2631 false) ||
2632 Args.hasFlag(options::OPT_mpascal_strings,
2633 options::OPT_mno_pascal_strings,
2634 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002635 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002636
Daniel Dunbar096ed292011-10-05 21:04:55 +00002637 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2638 // -fno-pack-struct doesn't apply to -fpack-struct=.
2639 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00002640 std::string PackStructStr = "-fpack-struct=";
2641 PackStructStr += A->getValue(Args);
2642 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00002643 } else if (Args.hasFlag(options::OPT_fpack_struct,
2644 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00002645 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00002646 }
2647
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002648 if (Args.hasArg(options::OPT_mkernel) ||
2649 Args.hasArg(options::OPT_fapple_kext)) {
2650 if (!Args.hasArg(options::OPT_fcommon))
2651 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00002652 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002653 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00002654
Daniel Dunbard18049a2009-04-07 21:16:11 +00002655 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002656 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002657 CmdArgs.push_back("-fno-common");
2658
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002659 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00002660 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00002661 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002662 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002663 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002664 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2665
Daniel Dunbar6358d682010-10-15 22:30:42 +00002666 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2667 if (!Args.hasFlag(options::OPT_ffor_scope,
2668 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002669 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00002670 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2671
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00002672 // -fcaret-diagnostics is default.
2673 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2674 options::OPT_fno_caret_diagnostics, true))
2675 CmdArgs.push_back("-fno-caret-diagnostics");
2676
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002677 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00002678 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002679 options::OPT_fno_diagnostics_fixit_info))
2680 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002681
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002682 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00002683 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002684 options::OPT_fno_diagnostics_show_option))
2685 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002686
Chris Lattnerbf6fac82010-05-04 21:55:25 +00002687 if (const Arg *A =
2688 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
2689 CmdArgs.push_back("-fdiagnostics-show-category");
2690 CmdArgs.push_back(A->getValue(Args));
2691 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002692
Douglas Gregor643c9222011-05-21 17:07:29 +00002693 if (const Arg *A =
2694 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
2695 CmdArgs.push_back("-fdiagnostics-format");
2696 CmdArgs.push_back(A->getValue(Args));
2697 }
2698
Chandler Carruthb6766f02011-03-27 01:50:55 +00002699 if (Arg *A = Args.getLastArg(
2700 options::OPT_fdiagnostics_show_note_include_stack,
2701 options::OPT_fno_diagnostics_show_note_include_stack)) {
2702 if (A->getOption().matches(
2703 options::OPT_fdiagnostics_show_note_include_stack))
2704 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
2705 else
2706 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
2707 }
2708
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002709 // Color diagnostics are the default, unless the terminal doesn't support
2710 // them.
2711 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidis4f920162010-09-23 12:56:06 +00002712 options::OPT_fno_color_diagnostics,
2713 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002714 CmdArgs.push_back("-fcolor-diagnostics");
2715
Daniel Dunbardb097022009-06-08 21:13:54 +00002716 if (!Args.hasFlag(options::OPT_fshow_source_location,
2717 options::OPT_fno_show_source_location))
2718 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002719
Douglas Gregor643c9222011-05-21 17:07:29 +00002720 if (!Args.hasFlag(options::OPT_fshow_column,
2721 options::OPT_fno_show_column,
2722 true))
2723 CmdArgs.push_back("-fno-show-column");
2724
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00002725 if (!Args.hasFlag(options::OPT_fspell_checking,
2726 options::OPT_fno_spell_checking))
2727 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002728
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002729
Daniel Dunbar3ada2b72010-11-02 19:42:04 +00002730 // Silently ignore -fasm-blocks for now.
2731 (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
2732 false);
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002733
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00002734 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
2735 A->render(Args, CmdArgs);
2736
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002737 // -fdollars-in-identifiers default varies depending on platform and
2738 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00002739 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002740 options::OPT_fno_dollars_in_identifiers)) {
2741 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002742 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002743 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002744 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002745 }
2746
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002747 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
2748 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00002749 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002750 options::OPT_fno_unit_at_a_time)) {
2751 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002752 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002753 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002754
Eli Friedman055c9702011-11-02 01:53:16 +00002755 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
2756 options::OPT_fno_apple_pragma_pack, false))
2757 CmdArgs.push_back("-fapple-pragma-pack");
2758
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002759 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002760 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002761 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002762#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00002763 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002764 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
2765 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
2766 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
2767 CmdArgs.push_back("-fno-builtin-strcat");
2768 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
2769 CmdArgs.push_back("-fno-builtin-strcpy");
2770 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002771#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002772
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002773 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00002774 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002775 options::OPT_traditional_cpp)) {
2776 if (isa<PreprocessJobAction>(JA))
2777 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002778 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002779 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002780 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002781
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002782 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00002783 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00002784
2785 // Handle serialized diagnostics.
2786 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
2787 CmdArgs.push_back("-serialize-diagnostic-file");
2788 CmdArgs.push_back(Args.MakeArgString(A->getValue(Args)));
2789 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002790
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00002791 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
2792 CmdArgs.push_back("-fretain-comments-from-system-headers");
2793
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002794 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
2795 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002796 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002797 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
2798 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00002799 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00002800
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002801 // We translate this by hand to the -cc1 argument, since nightly test uses
2802 // it and developers have been trained to spell it with -mllvm.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002803 if (StringRef((*it)->getValue(Args, 0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002804 CmdArgs.push_back("-disable-llvm-optzns");
2805 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00002806 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002807 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002808
Daniel Dunbard67a3222009-03-30 06:36:42 +00002809 if (Output.getType() == types::TY_Dependencies) {
2810 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002811 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00002812 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002813 CmdArgs.push_back(Output.getFilename());
2814 } else {
2815 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002816 }
2817
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002818 for (InputInfoList::const_iterator
2819 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2820 const InputInfo &II = *it;
2821 CmdArgs.push_back("-x");
2822 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00002823 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002824 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002825 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002826 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002827 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002828
Chris Lattnere9d7d782009-11-03 19:50:27 +00002829 Args.AddAllArgs(CmdArgs, options::OPT_undef);
2830
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00002831 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002832
2833 // Optionally embed the -cc1 level arguments into the debug info, for build
2834 // analysis.
2835 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002836 ArgStringList OriginalArgs;
2837 for (ArgList::const_iterator it = Args.begin(),
2838 ie = Args.end(); it != ie; ++it)
2839 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002840
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00002841 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002842 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002843 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002844 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002845 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002846 }
2847 CmdArgs.push_back("-dwarf-debug-flags");
2848 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
2849 }
2850
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00002851 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00002852
Roman Divacky178e01602011-02-10 16:52:03 +00002853 if (Arg *A = Args.getLastArg(options::OPT_pg))
2854 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002855 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00002856 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002857
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002858 // Claim some arguments which clang supports automatically.
2859
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00002860 // -fpch-preprocess is used with gcc to add a special marker in the output to
2861 // include the PCH file. Clang's PTH solution is completely transparent, so we
2862 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002863 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002864
Daniel Dunbar17731772009-03-23 19:03:36 +00002865 // Claim some arguments which clang doesn't support, but we don't
2866 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00002867 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
2868 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00002869
Rafael Espindolad95a8122011-03-01 05:25:27 +00002870 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00002871 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00002872 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002873}
2874
Jim Grosbach576452b2012-02-10 20:37:10 +00002875void ClangAs::AddARMTargetArgs(const ArgList &Args,
2876 ArgStringList &CmdArgs) const {
2877 const Driver &D = getToolChain().getDriver();
2878 llvm::Triple Triple = getToolChain().getTriple();
2879
2880 // Set the CPU based on -march= and -mcpu=.
2881 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00002882 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00002883
2884 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00002885 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00002886 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00002887
2888 // Honor -mfpmath=.
2889 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00002890 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00002891}
2892
John McCall5fb5df92012-06-20 06:18:46 +00002893/// Add options related to the Objective-C runtime/ABI.
2894///
2895/// Returns true if the runtime is non-fragile.
2896ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
2897 ArgStringList &cmdArgs,
2898 RewriteKind rewriteKind) const {
2899 // Look for the controlling runtime option.
2900 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
2901 options::OPT_fgnu_runtime,
2902 options::OPT_fobjc_runtime_EQ);
2903
2904 // Just forward -fobjc-runtime= to the frontend. This supercedes
2905 // options about fragility.
2906 if (runtimeArg &&
2907 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
2908 ObjCRuntime runtime;
2909 StringRef value = runtimeArg->getValue(args);
2910 if (runtime.tryParse(value)) {
2911 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
2912 << value;
2913 }
2914
2915 runtimeArg->render(args, cmdArgs);
2916 return runtime;
2917 }
2918
2919 // Otherwise, we'll need the ABI "version". Version numbers are
2920 // slightly confusing for historical reasons:
2921 // 1 - Traditional "fragile" ABI
2922 // 2 - Non-fragile ABI, version 1
2923 // 3 - Non-fragile ABI, version 2
2924 unsigned objcABIVersion = 1;
2925 // If -fobjc-abi-version= is present, use that to set the version.
2926 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
2927 StringRef value = abiArg->getValue(args);
2928 if (value == "1")
2929 objcABIVersion = 1;
2930 else if (value == "2")
2931 objcABIVersion = 2;
2932 else if (value == "3")
2933 objcABIVersion = 3;
2934 else
2935 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2936 << value;
2937 } else {
2938 // Otherwise, determine if we are using the non-fragile ABI.
2939 bool nonFragileABIIsDefault =
2940 (rewriteKind == RK_NonFragile ||
2941 (rewriteKind == RK_None &&
2942 getToolChain().IsObjCNonFragileABIDefault()));
2943 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
2944 options::OPT_fno_objc_nonfragile_abi,
2945 nonFragileABIIsDefault)) {
2946 // Determine the non-fragile ABI version to use.
2947#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
2948 unsigned nonFragileABIVersion = 1;
2949#else
2950 unsigned nonFragileABIVersion = 2;
2951#endif
2952
2953 if (Arg *abiArg = args.getLastArg(
2954 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
2955 StringRef value = abiArg->getValue(args);
2956 if (value == "1")
2957 nonFragileABIVersion = 1;
2958 else if (value == "2")
2959 nonFragileABIVersion = 2;
2960 else
2961 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2962 << value;
2963 }
2964
2965 objcABIVersion = 1 + nonFragileABIVersion;
2966 } else {
2967 objcABIVersion = 1;
2968 }
2969 }
2970
2971 // We don't actually care about the ABI version other than whether
2972 // it's non-fragile.
2973 bool isNonFragile = objcABIVersion != 1;
2974
2975 // If we have no runtime argument, ask the toolchain for its default runtime.
2976 // However, the rewriter only really supports the Mac runtime, so assume that.
2977 ObjCRuntime runtime;
2978 if (!runtimeArg) {
2979 switch (rewriteKind) {
2980 case RK_None:
2981 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
2982 break;
2983 case RK_Fragile:
2984 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
2985 break;
2986 case RK_NonFragile:
2987 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
2988 break;
2989 }
2990
2991 // -fnext-runtime
2992 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
2993 // On Darwin, make this use the default behavior for the toolchain.
2994 if (getToolChain().getTriple().isOSDarwin()) {
2995 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
2996
2997 // Otherwise, build for a generic macosx port.
2998 } else {
2999 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3000 }
3001
3002 // -fgnu-runtime
3003 } else {
3004 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003005 // Legacy behaviour is to target the gnustep runtime if we are i
3006 // non-fragile mode or the GCC runtime in fragile mode.
3007 if (isNonFragile)
3008 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple());
3009 else
3010 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003011 }
3012
3013 cmdArgs.push_back(args.MakeArgString(
3014 "-fobjc-runtime=" + runtime.getAsString()));
3015 return runtime;
3016}
3017
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003018void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003019 const InputInfo &Output,
3020 const InputInfoList &Inputs,
3021 const ArgList &Args,
3022 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003023 ArgStringList CmdArgs;
3024
3025 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3026 const InputInfo &Input = Inputs[0];
3027
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003028 // Don't warn about "clang -w -c foo.s"
3029 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003030 // and "clang -emit-llvm -c foo.s"
3031 Args.ClaimAllArgs(options::OPT_emit_llvm);
3032 // and "clang -use-gold-plugin -c foo.s"
3033 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003034
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003035 // Invoke ourselves in -cc1as mode.
3036 //
3037 // FIXME: Implement custom jobs for internal actions.
3038 CmdArgs.push_back("-cc1as");
3039
3040 // Add the "effective" target triple.
3041 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003042 std::string TripleStr =
3043 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003044 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3045
3046 // Set the output mode, we currently only expect to be used as a real
3047 // assembler.
3048 CmdArgs.push_back("-filetype");
3049 CmdArgs.push_back("obj");
3050
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003051 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003052 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003053
Jim Grosbach576452b2012-02-10 20:37:10 +00003054 // Add target specific cpu and features flags.
3055 switch(getToolChain().getTriple().getArch()) {
3056 default:
3057 break;
3058
3059 case llvm::Triple::arm:
3060 case llvm::Triple::thumb:
3061 AddARMTargetArgs(Args, CmdArgs);
3062 break;
3063 }
3064
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003065 // Ignore explicit -force_cpusubtype_ALL option.
3066 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003067
Eric Christopherfc3ee562012-01-10 00:38:01 +00003068 // Determine the original source input.
3069 const Action *SourceAction = &JA;
3070 while (SourceAction->getKind() != Action::InputClass) {
3071 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3072 SourceAction = SourceAction->getInputs()[0];
3073 }
3074
3075 // Forward -g, assuming we are dealing with an actual assembly file.
3076 if (SourceAction->getType() == types::TY_Asm ||
3077 SourceAction->getType() == types::TY_PP_Asm) {
3078 Args.ClaimAllArgs(options::OPT_g_Group);
3079 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3080 if (!A->getOption().matches(options::OPT_g0))
3081 CmdArgs.push_back("-g");
3082 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003083
3084 // Optionally embed the -cc1as level arguments into the debug info, for build
3085 // analysis.
3086 if (getToolChain().UseDwarfDebugFlags()) {
3087 ArgStringList OriginalArgs;
3088 for (ArgList::const_iterator it = Args.begin(),
3089 ie = Args.end(); it != ie; ++it)
3090 (*it)->render(Args, OriginalArgs);
3091
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003092 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003093 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3094 Flags += Exec;
3095 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3096 Flags += " ";
3097 Flags += OriginalArgs[i];
3098 }
3099 CmdArgs.push_back("-dwarf-debug-flags");
3100 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3101 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003102
3103 // FIXME: Add -static support, once we have it.
3104
3105 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3106 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003107 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003108
3109 assert(Output.isFilename() && "Unexpected lipo output.");
3110 CmdArgs.push_back("-o");
3111 CmdArgs.push_back(Output.getFilename());
3112
Daniel Dunbarb440f562010-08-02 02:38:21 +00003113 assert(Input.isFilename() && "Invalid input.");
3114 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003115
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003116 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003117 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003118}
3119
Daniel Dunbara3246a02009-03-18 08:07:30 +00003120void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003121 const InputInfo &Output,
3122 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003123 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003124 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003125 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003126 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003127
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003128 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003129 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003130 Arg *A = *it;
Daniel Dunbar2da02722009-03-19 07:55:12 +00003131 if (A->getOption().hasForwardToGCC()) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003132 // Don't forward any -g arguments to assembly steps.
3133 if (isa<AssembleJobAction>(JA) &&
3134 A->getOption().matches(options::OPT_g_Group))
3135 continue;
3136
Daniel Dunbar2da02722009-03-19 07:55:12 +00003137 // It is unfortunate that we have to claim here, as this means
3138 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003139 // platforms using a generic gcc, even if we are just using gcc
3140 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003141 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003142 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003143 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003144 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003145
Daniel Dunbar4e295052010-01-25 22:35:08 +00003146 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003147
3148 // If using a driver driver, force the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003149 const std::string &Arch = getToolChain().getArchName();
Bob Wilson6524dd32011-10-14 05:03:44 +00003150 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003151 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003152
3153 // FIXME: Remove these special cases.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003154 if (Arch == "powerpc")
3155 CmdArgs.push_back("ppc");
3156 else if (Arch == "powerpc64")
3157 CmdArgs.push_back("ppc64");
3158 else
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003159 CmdArgs.push_back(Args.MakeArgString(Arch));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003160 }
3161
Daniel Dunbar5716d872009-05-02 21:41:52 +00003162 // Try to force gcc to match the tool chain we want, if we recognize
3163 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003164 //
3165 // FIXME: The triple class should directly provide the information we want
3166 // here.
3167 if (Arch == "i386" || Arch == "powerpc")
Daniel Dunbar5716d872009-05-02 21:41:52 +00003168 CmdArgs.push_back("-m32");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003169 else if (Arch == "x86_64" || Arch == "powerpc64")
Daniel Dunbar5716d872009-05-02 21:41:52 +00003170 CmdArgs.push_back("-m64");
3171
Daniel Dunbarb440f562010-08-02 02:38:21 +00003172 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003173 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003174 CmdArgs.push_back(Output.getFilename());
3175 } else {
3176 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003177 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003178 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003179
Tony Linthicum76329bf2011-12-12 21:14:55 +00003180 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3181 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003182
3183 // Only pass -x if gcc will understand it; otherwise hope gcc
3184 // understands the suffix correctly. The main use case this would go
3185 // wrong in is for linker inputs if they happened to have an odd
3186 // suffix; really the only way to get this to happen is a command
3187 // like '-x foobar a.c' which will treat a.c like a linker input.
3188 //
3189 // FIXME: For the linker case specifically, can we safely convert
3190 // inputs into '-Wl,' options?
3191 for (InputInfoList::const_iterator
3192 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3193 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003194
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003195 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003196 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3197 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003198 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003199 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003200 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003201 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003202 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003203
Daniel Dunbara3246a02009-03-18 08:07:30 +00003204 if (types::canTypeBeUserSpecified(II.getType())) {
3205 CmdArgs.push_back("-x");
3206 CmdArgs.push_back(types::getTypeName(II.getType()));
3207 }
3208
Daniel Dunbarb440f562010-08-02 02:38:21 +00003209 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003210 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003211 else {
3212 const Arg &A = II.getInputArg();
3213
3214 // Reverse translate some rewritten options.
3215 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3216 CmdArgs.push_back("-lstdc++");
3217 continue;
3218 }
3219
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003220 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003221 A.render(Args, CmdArgs);
3222 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003223 }
3224
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003225 const std::string customGCCName = D.getCCCGenericGCCName();
3226 const char *GCCName;
3227 if (!customGCCName.empty())
3228 GCCName = customGCCName.c_str();
3229 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003230 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003231 } else
3232 GCCName = "gcc";
3233
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003234 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003235 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003236 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003237}
3238
Daniel Dunbar4e295052010-01-25 22:35:08 +00003239void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3240 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003241 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003242}
3243
Daniel Dunbar4e295052010-01-25 22:35:08 +00003244void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3245 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003246 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003247}
3248
Daniel Dunbar4e295052010-01-25 22:35:08 +00003249void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3250 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003251 const Driver &D = getToolChain().getDriver();
3252
Daniel Dunbar4e295052010-01-25 22:35:08 +00003253 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003254 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3255 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003256 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003257 else {
3258 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003259 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003260 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003261
Daniel Dunbar4e295052010-01-25 22:35:08 +00003262 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003263 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003264}
3265
Daniel Dunbar4e295052010-01-25 22:35:08 +00003266void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3267 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003268 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003269}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003270
Daniel Dunbar4e295052010-01-25 22:35:08 +00003271void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3272 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003273 // The types are (hopefully) good enough.
3274}
3275
Tony Linthicum76329bf2011-12-12 21:14:55 +00003276// Hexagon tools start.
3277void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3278 ArgStringList &CmdArgs) const {
3279
3280}
3281void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3282 const InputInfo &Output,
3283 const InputInfoList &Inputs,
3284 const ArgList &Args,
3285 const char *LinkingOutput) const {
3286
3287 const Driver &D = getToolChain().getDriver();
3288 ArgStringList CmdArgs;
3289
3290 std::string MarchString = "-march=";
3291 MarchString += getHexagonTargetCPU(Args);
3292 CmdArgs.push_back(Args.MakeArgString(MarchString));
3293
3294 RenderExtraToolArgs(JA, CmdArgs);
3295
3296 if (Output.isFilename()) {
3297 CmdArgs.push_back("-o");
3298 CmdArgs.push_back(Output.getFilename());
3299 } else {
3300 assert(Output.isNothing() && "Unexpected output");
3301 CmdArgs.push_back("-fsyntax-only");
3302 }
3303
3304
3305 // Only pass -x if gcc will understand it; otherwise hope gcc
3306 // understands the suffix correctly. The main use case this would go
3307 // wrong in is for linker inputs if they happened to have an odd
3308 // suffix; really the only way to get this to happen is a command
3309 // like '-x foobar a.c' which will treat a.c like a linker input.
3310 //
3311 // FIXME: For the linker case specifically, can we safely convert
3312 // inputs into '-Wl,' options?
3313 for (InputInfoList::const_iterator
3314 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3315 const InputInfo &II = *it;
3316
3317 // Don't try to pass LLVM or AST inputs to a generic gcc.
3318 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3319 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3320 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3321 << getToolChain().getTripleString();
3322 else if (II.getType() == types::TY_AST)
3323 D.Diag(clang::diag::err_drv_no_ast_support)
3324 << getToolChain().getTripleString();
3325
3326 if (II.isFilename())
3327 CmdArgs.push_back(II.getFilename());
3328 else
3329 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3330 II.getInputArg().render(Args, CmdArgs);
3331 }
3332
3333 const char *GCCName = "hexagon-as";
3334 const char *Exec =
3335 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3336 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3337
3338}
3339void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3340 ArgStringList &CmdArgs) const {
3341 // The types are (hopefully) good enough.
3342}
3343
3344void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3345 const InputInfo &Output,
3346 const InputInfoList &Inputs,
3347 const ArgList &Args,
3348 const char *LinkingOutput) const {
3349
3350 const Driver &D = getToolChain().getDriver();
3351 ArgStringList CmdArgs;
3352
3353 for (ArgList::const_iterator
3354 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3355 Arg *A = *it;
3356 if (A->getOption().hasForwardToGCC()) {
3357 // Don't forward any -g arguments to assembly steps.
3358 if (isa<AssembleJobAction>(JA) &&
3359 A->getOption().matches(options::OPT_g_Group))
3360 continue;
3361
3362 // It is unfortunate that we have to claim here, as this means
3363 // we will basically never report anything interesting for
3364 // platforms using a generic gcc, even if we are just using gcc
3365 // to get to the assembler.
3366 A->claim();
3367 A->render(Args, CmdArgs);
3368 }
3369 }
3370
3371 RenderExtraToolArgs(JA, CmdArgs);
3372
3373 // Add Arch Information
3374 Arg *A;
Sebastian Pop86500282012-01-13 20:37:10 +00003375 if ((A = getLastHexagonArchArg(Args))) {
3376 if (A->getOption().matches(options::OPT_m_Joined))
3377 A->render(Args, CmdArgs);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003378 else
Sebastian Pop86500282012-01-13 20:37:10 +00003379 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003380 }
Sebastian Pop86500282012-01-13 20:37:10 +00003381 else {
3382 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
3383 }
3384
Tony Linthicum76329bf2011-12-12 21:14:55 +00003385 CmdArgs.push_back("-mqdsp6-compat");
3386
3387 const char *GCCName;
3388 if (C.getDriver().CCCIsCXX)
3389 GCCName = "hexagon-g++";
3390 else
3391 GCCName = "hexagon-gcc";
3392 const char *Exec =
3393 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3394
3395 if (Output.isFilename()) {
3396 CmdArgs.push_back("-o");
3397 CmdArgs.push_back(Output.getFilename());
3398 }
3399
3400 for (InputInfoList::const_iterator
3401 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3402 const InputInfo &II = *it;
3403
3404 // Don't try to pass LLVM or AST inputs to a generic gcc.
3405 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3406 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3407 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3408 << getToolChain().getTripleString();
3409 else if (II.getType() == types::TY_AST)
3410 D.Diag(clang::diag::err_drv_no_ast_support)
3411 << getToolChain().getTripleString();
3412
3413 if (II.isFilename())
3414 CmdArgs.push_back(II.getFilename());
3415 else
3416 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3417 II.getInputArg().render(Args, CmdArgs);
3418 }
3419 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3420
3421}
3422// Hexagon tools end.
3423
3424
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003425const char *darwin::CC1::getCC1Name(types::ID Type) const {
3426 switch (Type) {
3427 default:
David Blaikie83d382b2011-09-23 05:06:16 +00003428 llvm_unreachable("Unexpected type for Darwin CC1 tool.");
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003429 case types::TY_Asm:
3430 case types::TY_C: case types::TY_CHeader:
3431 case types::TY_PP_C: case types::TY_PP_CHeader:
3432 return "cc1";
3433 case types::TY_ObjC: case types::TY_ObjCHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003434 case types::TY_PP_ObjC: case types::TY_PP_ObjC_Alias:
3435 case types::TY_PP_ObjCHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003436 return "cc1obj";
3437 case types::TY_CXX: case types::TY_CXXHeader:
3438 case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
3439 return "cc1plus";
3440 case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003441 case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXX_Alias:
3442 case types::TY_PP_ObjCXXHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003443 return "cc1objplus";
3444 }
3445}
3446
David Blaikie68e081d2011-12-20 02:48:34 +00003447void darwin::CC1::anchor() {}
3448
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003449const char *darwin::CC1::getBaseInputName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003450 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00003451 return Args.MakeArgString(
3452 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003453}
3454
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003455const char *darwin::CC1::getBaseInputStem(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003456 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003457 const char *Str = getBaseInputName(Args, Inputs);
3458
Chris Lattner906bb902011-01-16 08:14:11 +00003459 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003460 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003461
3462 return Str;
3463}
3464
3465const char *
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003466darwin::CC1::getDependencyFileName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003467 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003468 // FIXME: Think about this more.
3469 std::string Res;
3470
3471 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3472 std::string Str(OutputOpt->getValue(Args));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003473 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003474 } else {
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003475 Res = darwin::CC1::getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003476 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003477 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003478}
3479
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003480void darwin::CC1::RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const {
Eric Christopher84fbdb42011-08-19 00:30:14 +00003481 for (ArgStringList::iterator it = CmdArgs.begin(), ie = CmdArgs.end();
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003482 it != ie;) {
Chad Rosier2f818792011-08-18 17:56:32 +00003483
3484 StringRef Option = *it;
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003485 bool RemoveOption = false;
Chad Rosier30453862011-08-18 01:18:28 +00003486
Bob Wilson7ecbd322012-02-07 01:17:55 +00003487 // Erase both -fmodule-cache-path and its argument.
3488 if (Option.equals("-fmodule-cache-path") && it+2 != ie) {
3489 it = CmdArgs.erase(it, it+2);
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003490 ie = CmdArgs.end();
Chad Rosier30453862011-08-18 01:18:28 +00003491 continue;
3492 }
3493
Bob Wilson7ecbd322012-02-07 01:17:55 +00003494 // Remove unsupported -f options.
3495 if (Option.startswith("-f")) {
3496 // Remove -f/-fno- to reduce the number of cases.
3497 if (Option.startswith("-fno-"))
3498 Option = Option.substr(5);
3499 else
3500 Option = Option.substr(2);
3501 RemoveOption = llvm::StringSwitch<bool>(Option)
3502 .Case("altivec", true)
3503 .Case("modules", true)
3504 .Case("diagnostics-show-note-include-stack", true)
3505 .Default(false);
3506 }
3507
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003508 // Handle machine specific options.
3509 if (Option.startswith("-m")) {
3510 RemoveOption = llvm::StringSwitch<bool>(Option)
3511 .Case("-mthumb", true)
3512 .Case("-mno-thumb", true)
3513 .Case("-mno-fused-madd", true)
3514 .Case("-mlong-branch", true)
3515 .Case("-mlongcall", true)
3516 .Case("-mcpu=G4", true)
3517 .Case("-mcpu=G5", true)
3518 .Default(false);
3519 }
3520
3521 // Handle warning options.
3522 if (Option.startswith("-W")) {
3523 // Remove -W/-Wno- to reduce the number of cases.
3524 if (Option.startswith("-Wno-"))
3525 Option = Option.substr(5);
3526 else
3527 Option = Option.substr(2);
3528
3529 RemoveOption = llvm::StringSwitch<bool>(Option)
3530 .Case("address-of-temporary", true)
3531 .Case("ambiguous-member-template", true)
3532 .Case("analyzer-incompatible-plugin", true)
3533 .Case("array-bounds", true)
3534 .Case("array-bounds-pointer-arithmetic", true)
3535 .Case("bind-to-temporary-copy", true)
3536 .Case("bitwise-op-parentheses", true)
3537 .Case("bool-conversions", true)
3538 .Case("builtin-macro-redefined", true)
3539 .Case("c++-hex-floats", true)
3540 .Case("c++0x-compat", true)
3541 .Case("c++0x-extensions", true)
3542 .Case("c++0x-narrowing", true)
Richard Smith31ce7932011-10-13 23:32:09 +00003543 .Case("c++11-compat", true)
3544 .Case("c++11-extensions", true)
3545 .Case("c++11-narrowing", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003546 .Case("conditional-uninitialized", true)
3547 .Case("constant-conversion", true)
David Blaikieebcbe4b2012-03-15 04:50:32 +00003548 .Case("conversion-null", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003549 .Case("CFString-literal", true)
3550 .Case("constant-logical-operand", true)
3551 .Case("custom-atomic-properties", true)
3552 .Case("default-arg-special-member", true)
3553 .Case("delegating-ctor-cycles", true)
3554 .Case("delete-non-virtual-dtor", true)
3555 .Case("deprecated-implementations", true)
3556 .Case("deprecated-writable-strings", true)
3557 .Case("distributed-object-modifiers", true)
3558 .Case("duplicate-method-arg", true)
3559 .Case("dynamic-class-memaccess", true)
3560 .Case("enum-compare", true)
3561 .Case("exit-time-destructors", true)
3562 .Case("gnu", true)
3563 .Case("gnu-designator", true)
3564 .Case("header-hygiene", true)
3565 .Case("idiomatic-parentheses", true)
3566 .Case("ignored-qualifiers", true)
3567 .Case("implicit-atomic-properties", true)
3568 .Case("incompatible-pointer-types", true)
3569 .Case("incomplete-implementation", true)
3570 .Case("initializer-overrides", true)
3571 .Case("invalid-noreturn", true)
3572 .Case("invalid-token-paste", true)
Ivan Krasin31f74112011-10-06 02:46:34 +00003573 .Case("language-extension-token", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003574 .Case("literal-conversion", true)
3575 .Case("literal-range", true)
3576 .Case("local-type-template-args", true)
3577 .Case("logical-op-parentheses", true)
3578 .Case("method-signatures", true)
3579 .Case("microsoft", true)
3580 .Case("mismatched-tags", true)
3581 .Case("missing-method-return-type", true)
3582 .Case("non-pod-varargs", true)
3583 .Case("nonfragile-abi2", true)
3584 .Case("null-arithmetic", true)
3585 .Case("null-dereference", true)
3586 .Case("out-of-line-declaration", true)
3587 .Case("overriding-method-mismatch", true)
3588 .Case("readonly-setter-attrs", true)
3589 .Case("return-stack-address", true)
3590 .Case("self-assign", true)
3591 .Case("semicolon-before-method-body", true)
3592 .Case("sentinel", true)
3593 .Case("shift-overflow", true)
3594 .Case("shift-sign-overflow", true)
3595 .Case("sign-conversion", true)
3596 .Case("sizeof-array-argument", true)
3597 .Case("sizeof-pointer-memaccess", true)
3598 .Case("string-compare", true)
3599 .Case("super-class-method-mismatch", true)
3600 .Case("tautological-compare", true)
3601 .Case("typedef-redefinition", true)
3602 .Case("typename-missing", true)
3603 .Case("undefined-reinterpret-cast", true)
3604 .Case("unknown-warning-option", true)
3605 .Case("unnamed-type-template-args", true)
3606 .Case("unneeded-internal-declaration", true)
3607 .Case("unneeded-member-function", true)
3608 .Case("unused-comparison", true)
3609 .Case("unused-exception-parameter", true)
3610 .Case("unused-member-function", true)
3611 .Case("unused-result", true)
3612 .Case("vector-conversions", true)
3613 .Case("vla", true)
3614 .Case("used-but-marked-unused", true)
3615 .Case("weak-vtables", true)
3616 .Default(false);
3617 } // if (Option.startswith("-W"))
Chad Rosier30453862011-08-18 01:18:28 +00003618 if (RemoveOption) {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003619 it = CmdArgs.erase(it);
Chad Rosier23594f62011-08-17 18:51:56 +00003620 ie = CmdArgs.end();
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003621 } else {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003622 ++it;
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003623 }
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003624 }
3625}
3626
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003627void darwin::CC1::AddCC1Args(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003628 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003629 const Driver &D = getToolChain().getDriver();
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003630
3631 CheckCodeGenerationOptions(D, Args);
3632
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003633 // Derived from cc1 spec.
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003634 if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) &&
3635 !Args.hasArg(options::OPT_mdynamic_no_pic))
3636 CmdArgs.push_back("-fPIC");
3637
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003638 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3639 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3640 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3641 CmdArgs.push_back("-fno-builtin-strcat");
3642 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3643 CmdArgs.push_back("-fno-builtin-strcpy");
3644 }
3645
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003646 if (Args.hasArg(options::OPT_g_Flag) &&
3647 !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
3648 CmdArgs.push_back("-feliminate-unused-debug-symbols");
3649}
3650
3651void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3652 const InputInfoList &Inputs,
3653 const ArgStringList &OutputArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003654 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003655
3656 // Derived from cc1_options spec.
3657 if (Args.hasArg(options::OPT_fast) ||
3658 Args.hasArg(options::OPT_fastf) ||
3659 Args.hasArg(options::OPT_fastcp))
3660 CmdArgs.push_back("-O3");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003661
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003662 if (Arg *A = Args.getLastArg(options::OPT_pg))
3663 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003664 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003665 << A->getAsString(Args) << "-fomit-frame-pointer";
3666
3667 AddCC1Args(Args, CmdArgs);
3668
3669 if (!Args.hasArg(options::OPT_Q))
3670 CmdArgs.push_back("-quiet");
3671
3672 CmdArgs.push_back("-dumpbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003673 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003674
3675 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3676
3677 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
3678 Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
3679
3680 // FIXME: The goal is to use the user provided -o if that is our
3681 // final output, otherwise to drive from the original input
3682 // name. Find a clean way to go about this.
3683 if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
3684 Args.hasArg(options::OPT_o)) {
3685 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
3686 CmdArgs.push_back("-auxbase-strip");
3687 CmdArgs.push_back(OutputOpt->getValue(Args));
3688 } else {
3689 CmdArgs.push_back("-auxbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003690 CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003691 }
3692
3693 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3694
3695 Args.AddAllArgs(CmdArgs, options::OPT_O);
3696 // FIXME: -Wall is getting some special treatment. Investigate.
3697 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3698 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003699 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003700 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003701 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3702 // Honor -std-default.
3703 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3704 "-std=", /*Joined=*/true);
3705 }
3706
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003707 if (Args.hasArg(options::OPT_v))
3708 CmdArgs.push_back("-version");
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003709 if (Args.hasArg(options::OPT_pg) &&
3710 getToolChain().SupportsProfiling())
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003711 CmdArgs.push_back("-p");
3712 Args.AddLastArg(CmdArgs, options::OPT_p);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003713
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003714 // The driver treats -fsyntax-only specially.
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003715 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3716 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3717 // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
3718 // used to inhibit the default -fno-builtin-str{cat,cpy}.
3719 //
3720 // FIXME: Should we grow a better way to deal with "removing" args?
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003721 for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
3722 options::OPT_fsyntax_only),
3723 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003724 if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
3725 !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
3726 (*it)->claim();
3727 (*it)->render(Args, CmdArgs);
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003728 }
3729 }
3730 } else
3731 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003732
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003733 // Claim Clang only -f options, they aren't worth warning about.
3734 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3735
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003736 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3737 if (Args.hasArg(options::OPT_Qn))
3738 CmdArgs.push_back("-fno-ident");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003739
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003740 // FIXME: This isn't correct.
3741 //Args.AddLastArg(CmdArgs, options::OPT__help)
3742 //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
3743
3744 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3745
3746 // FIXME: Still don't get what is happening here. Investigate.
3747 Args.AddAllArgs(CmdArgs, options::OPT__param);
3748
3749 if (Args.hasArg(options::OPT_fmudflap) ||
3750 Args.hasArg(options::OPT_fmudflapth)) {
3751 CmdArgs.push_back("-fno-builtin");
3752 CmdArgs.push_back("-fno-merge-constants");
3753 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003754
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003755 if (Args.hasArg(options::OPT_coverage)) {
3756 CmdArgs.push_back("-fprofile-arcs");
3757 CmdArgs.push_back("-ftest-coverage");
3758 }
3759
3760 if (types::isCXX(Inputs[0].getType()))
3761 CmdArgs.push_back("-D__private_extern__=extern");
3762}
3763
3764void darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3765 const InputInfoList &Inputs,
3766 const ArgStringList &OutputArgs) const {
3767 // Derived from cpp_options
3768 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003769
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003770 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3771
3772 AddCC1Args(Args, CmdArgs);
3773
3774 // NOTE: The code below has some commonality with cpp_options, but
3775 // in classic gcc style ends up sending things in different
3776 // orders. This may be a good merge candidate once we drop pedantic
3777 // compatibility.
3778
3779 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003780 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003781 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003782 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3783 // Honor -std-default.
3784 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3785 "-std=", /*Joined=*/true);
3786 }
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003787 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3788 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003789
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003790 // The driver treats -fsyntax-only specially.
3791 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
3792
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003793 // Claim Clang only -f options, they aren't worth warning about.
3794 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3795
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003796 if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
3797 !Args.hasArg(options::OPT_fno_working_directory))
3798 CmdArgs.push_back("-fworking-directory");
3799
3800 Args.AddAllArgs(CmdArgs, options::OPT_O);
3801 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3802 if (Args.hasArg(options::OPT_save_temps))
3803 CmdArgs.push_back("-fpch-preprocess");
3804}
3805
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003806void darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003807 ArgStringList &CmdArgs,
Mike Stump11289f42009-09-09 15:08:12 +00003808 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003809 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003810
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003811 CheckPreprocessingOptions(D, Args);
3812
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003813 // Derived from cpp_unique_options.
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003814 // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
3815 Args.AddLastArg(CmdArgs, options::OPT_C);
3816 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003817 if (!Args.hasArg(options::OPT_Q))
3818 CmdArgs.push_back("-quiet");
3819 Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
Douglas Gregor64b046f2010-03-24 20:13:48 +00003820 Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003821 Args.AddLastArg(CmdArgs, options::OPT_v);
3822 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
3823 Args.AddLastArg(CmdArgs, options::OPT_P);
3824
3825 // FIXME: Handle %I properly.
3826 if (getToolChain().getArchName() == "x86_64") {
3827 CmdArgs.push_back("-imultilib");
3828 CmdArgs.push_back("x86_64");
3829 }
3830
3831 if (Args.hasArg(options::OPT_MD)) {
3832 CmdArgs.push_back("-MD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003833 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003834 }
3835
3836 if (Args.hasArg(options::OPT_MMD)) {
3837 CmdArgs.push_back("-MMD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003838 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003839 }
3840
3841 Args.AddLastArg(CmdArgs, options::OPT_M);
3842 Args.AddLastArg(CmdArgs, options::OPT_MM);
3843 Args.AddAllArgs(CmdArgs, options::OPT_MF);
3844 Args.AddLastArg(CmdArgs, options::OPT_MG);
3845 Args.AddLastArg(CmdArgs, options::OPT_MP);
3846 Args.AddAllArgs(CmdArgs, options::OPT_MQ);
3847 Args.AddAllArgs(CmdArgs, options::OPT_MT);
3848 if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
3849 (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
3850 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3851 CmdArgs.push_back("-MQ");
3852 CmdArgs.push_back(OutputOpt->getValue(Args));
3853 }
3854 }
3855
3856 Args.AddLastArg(CmdArgs, options::OPT_remap);
3857 if (Args.hasArg(options::OPT_g3))
3858 CmdArgs.push_back("-dD");
3859 Args.AddLastArg(CmdArgs, options::OPT_H);
3860
3861 AddCPPArgs(Args, CmdArgs);
3862
3863 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
3864 Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
3865
3866 for (InputInfoList::const_iterator
3867 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3868 const InputInfo &II = *it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003869
Daniel Dunbarb440f562010-08-02 02:38:21 +00003870 CmdArgs.push_back(II.getFilename());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003871 }
3872
3873 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
3874 options::OPT_Xpreprocessor);
3875
3876 if (Args.hasArg(options::OPT_fmudflap)) {
3877 CmdArgs.push_back("-D_MUDFLAP");
3878 CmdArgs.push_back("-include");
3879 CmdArgs.push_back("mf-runtime.h");
3880 }
3881
3882 if (Args.hasArg(options::OPT_fmudflapth)) {
3883 CmdArgs.push_back("-D_MUDFLAP");
3884 CmdArgs.push_back("-D_MUDFLAPTH");
3885 CmdArgs.push_back("-include");
3886 CmdArgs.push_back("mf-runtime.h");
3887 }
3888}
3889
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003890void darwin::CC1::AddCPPArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003891 ArgStringList &CmdArgs) const {
3892 // Derived from cpp spec.
3893
3894 if (Args.hasArg(options::OPT_static)) {
3895 // The gcc spec is broken here, it refers to dynamic but
3896 // that has been translated. Start by being bug compatible.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003897
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003898 // if (!Args.hasArg(arglist.parser.dynamicOption))
3899 CmdArgs.push_back("-D__STATIC__");
3900 } else
3901 CmdArgs.push_back("-D__DYNAMIC__");
3902
3903 if (Args.hasArg(options::OPT_pthread))
3904 CmdArgs.push_back("-D_REENTRANT");
3905}
3906
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003907void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003908 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003909 const InputInfoList &Inputs,
3910 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003911 const char *LinkingOutput) const {
3912 ArgStringList CmdArgs;
3913
3914 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3915
3916 CmdArgs.push_back("-E");
3917
3918 if (Args.hasArg(options::OPT_traditional) ||
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003919 Args.hasArg(options::OPT_traditional_cpp))
3920 CmdArgs.push_back("-traditional-cpp");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003921
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003922 ArgStringList OutputArgs;
Daniel Dunbarb440f562010-08-02 02:38:21 +00003923 assert(Output.isFilename() && "Unexpected CC1 output.");
3924 OutputArgs.push_back("-o");
3925 OutputArgs.push_back(Output.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003926
Joerg Sonnenbergerb86f5f42011-03-06 23:31:01 +00003927 if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
Daniel Dunbarf64f5302009-03-29 22:27:40 +00003928 AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3929 } else {
3930 AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
3931 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3932 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003933
Daniel Dunbar6a8803a2009-04-03 01:27:06 +00003934 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3935
Chad Rosierc31e48d2011-09-08 00:38:00 +00003936 RemoveCC1UnsupportedArgs(CmdArgs);
3937
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003938 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003939 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003940 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003941 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003942}
3943
3944void darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003945 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003946 const InputInfoList &Inputs,
3947 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003948 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003949 const Driver &D = getToolChain().getDriver();
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003950 ArgStringList CmdArgs;
3951
3952 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3953
Bob Wilson0090df22012-04-01 23:03:29 +00003954 // Silence warning about unused --serialize-diagnostics
3955 Args.ClaimAllArgs(options::OPT__serialize_diags);
3956
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003957 types::ID InputType = Inputs[0].getType();
David Blaikie747ff7e2012-04-04 20:43:14 +00003958 if (const Arg *A = Args.getLastArg(options::OPT_traditional))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003959 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003960 << A->getAsString(Args) << "-E";
3961
Daniel Dunbar24e52992010-06-07 23:28:45 +00003962 if (JA.getType() == types::TY_LLVM_IR ||
3963 JA.getType() == types::TY_LTO_IR)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003964 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003965 else if (JA.getType() == types::TY_LLVM_BC ||
3966 JA.getType() == types::TY_LTO_BC)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003967 CmdArgs.push_back("-emit-llvm-bc");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003968 else if (Output.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003969 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003970 << getToolChain().getTripleString();
Daniel Dunbarbcd554f2010-02-11 17:33:45 +00003971 else if (JA.getType() != types::TY_PP_Asm &&
3972 JA.getType() != types::TY_PCH)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003973 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003974 << getTypeName(JA.getType());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003975
3976 ArgStringList OutputArgs;
3977 if (Output.getType() != types::TY_PCH) {
3978 OutputArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00003979 if (Output.isNothing())
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003980 OutputArgs.push_back("/dev/null");
3981 else
3982 OutputArgs.push_back(Output.getFilename());
3983 }
3984
3985 // There is no need for this level of compatibility, but it makes
3986 // diffing easier.
3987 bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
3988 Args.hasArg(options::OPT_S));
3989
3990 if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003991 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003992 if (OutputArgsEarly) {
3993 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3994 } else {
3995 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
3996 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3997 }
3998 } else {
3999 CmdArgs.push_back("-fpreprocessed");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004000
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004001 for (InputInfoList::const_iterator
4002 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4003 const InputInfo &II = *it;
4004
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004005 // Reject AST inputs.
4006 if (II.getType() == types::TY_AST) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004007 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004008 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004009 return;
4010 }
4011
Daniel Dunbarb440f562010-08-02 02:38:21 +00004012 CmdArgs.push_back(II.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004013 }
4014
4015 if (OutputArgsEarly) {
4016 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4017 } else {
4018 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4019 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4020 }
4021 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004022
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004023 if (Output.getType() == types::TY_PCH) {
4024 assert(Output.isFilename() && "Invalid PCH output.");
4025
4026 CmdArgs.push_back("-o");
4027 // NOTE: gcc uses a temp .s file for this, but there doesn't seem
4028 // to be a good reason.
Chad Rosier96d690c2011-08-01 19:58:48 +00004029 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004030 D.GetTemporaryPath("cc", "s"));
Chad Rosier96d690c2011-08-01 19:58:48 +00004031 C.addTempFile(TmpPath);
4032 CmdArgs.push_back(TmpPath);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004033
Eric Christopher84fbdb42011-08-19 00:30:14 +00004034 // If we're emitting a pch file with the last 4 characters of ".pth"
4035 // and falling back to llvm-gcc we want to use ".gch" instead.
4036 std::string OutputFile(Output.getFilename());
4037 size_t loc = OutputFile.rfind(".pth");
4038 if (loc != std::string::npos)
4039 OutputFile.replace(loc, 4, ".gch");
4040 const char *Tmp = C.getArgs().MakeArgString("--output-pch="+OutputFile);
4041 CmdArgs.push_back(Tmp);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004042 }
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004043
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00004044 RemoveCC1UnsupportedArgs(CmdArgs);
4045
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004046 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004047 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004048 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004049 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004050}
4051
Daniel Dunbarbe220842009-03-20 16:06:39 +00004052void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004053 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004054 const InputInfoList &Inputs,
4055 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004056 const char *LinkingOutput) const {
4057 ArgStringList CmdArgs;
4058
4059 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4060 const InputInfo &Input = Inputs[0];
4061
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004062 // Determine the original source input.
4063 const Action *SourceAction = &JA;
4064 while (SourceAction->getKind() != Action::InputClass) {
4065 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4066 SourceAction = SourceAction->getInputs()[0];
4067 }
4068
4069 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004070 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004071 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004072 if (Args.hasArg(options::OPT_gstabs))
4073 CmdArgs.push_back("--gstabs");
4074 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004075 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004076 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004077
Daniel Dunbarbe220842009-03-20 16:06:39 +00004078 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004079 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004080
Daniel Dunbar6d484762010-07-22 01:47:22 +00004081 // Use -force_cpusubtype_ALL on x86 by default.
4082 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4083 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004084 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4085 CmdArgs.push_back("-force_cpusubtype_ALL");
4086
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004087 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
4088 (Args.hasArg(options::OPT_mkernel) ||
Daniel Dunbarbe220842009-03-20 16:06:39 +00004089 Args.hasArg(options::OPT_static) ||
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004090 Args.hasArg(options::OPT_fapple_kext)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004091 CmdArgs.push_back("-static");
4092
Daniel Dunbarbe220842009-03-20 16:06:39 +00004093 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4094 options::OPT_Xassembler);
4095
4096 assert(Output.isFilename() && "Unexpected lipo output.");
4097 CmdArgs.push_back("-o");
4098 CmdArgs.push_back(Output.getFilename());
4099
Daniel Dunbarb440f562010-08-02 02:38:21 +00004100 assert(Input.isFilename() && "Invalid input.");
4101 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004102
4103 // asm_final spec is empty.
4104
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004105 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004106 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004107 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004108}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004109
David Blaikie68e081d2011-12-20 02:48:34 +00004110void darwin::DarwinTool::anchor() {}
4111
Daniel Dunbare9ded432009-09-09 18:36:20 +00004112void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4113 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004114 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004115
Daniel Dunbarc1964212009-03-26 16:23:12 +00004116 // Derived from darwin_arch spec.
4117 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004118 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004119
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004120 // FIXME: Is this needed anymore?
4121 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004122 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004123}
4124
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004125void darwin::Link::AddLinkArgs(Compilation &C,
4126 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004127 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004128 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004129 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004130
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004131 unsigned Version[3] = { 0, 0, 0 };
4132 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4133 bool HadExtra;
4134 if (!Driver::GetReleaseVersion(A->getValue(Args), Version[0],
4135 Version[1], Version[2], HadExtra) ||
4136 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004137 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004138 << A->getAsString(Args);
4139 }
4140
4141 // Newer linkers support -demangle, pass it if supported and not disabled by
4142 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004143 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004144 // Don't pass -demangle to ld_classic.
4145 //
4146 // FIXME: This is a temporary workaround, ld should be handling this.
4147 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4148 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004149 if (getToolChain().getArch() == llvm::Triple::x86) {
4150 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4151 options::OPT_Wl_COMMA),
4152 ie = Args.filtered_end(); it != ie; ++it) {
4153 const Arg *A = *it;
4154 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004155 if (StringRef(A->getValue(Args, i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004156 UsesLdClassic = true;
4157 }
4158 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004159 if (!UsesLdClassic)
4160 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004161 }
4162
Daniel Dunbaref889c72011-06-21 20:55:11 +00004163 // If we are using LTO, then automatically create a temporary file path for
4164 // the linker to use, so that it's lifetime will extend past a possible
4165 // dsymutil step.
Daniel Dunbar3d125d32011-06-21 21:18:32 +00004166 if (Version[0] >= 116 && D.IsUsingLTO(Args)) {
Daniel Dunbaref889c72011-06-21 20:55:11 +00004167 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004168 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Daniel Dunbaref889c72011-06-21 20:55:11 +00004169 C.addTempFile(TmpPath);
4170 CmdArgs.push_back("-object_path_lto");
4171 CmdArgs.push_back(TmpPath);
4172 }
4173
Daniel Dunbarc1964212009-03-26 16:23:12 +00004174 // Derived from the "link" spec.
4175 Args.AddAllArgs(CmdArgs, options::OPT_static);
4176 if (!Args.hasArg(options::OPT_static))
4177 CmdArgs.push_back("-dynamic");
4178 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4179 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4180 // here. How do we wish to handle such things?
4181 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004182
Daniel Dunbarc1964212009-03-26 16:23:12 +00004183 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004184 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004185 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004186 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004187
4188 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4189 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4190 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4191
4192 Arg *A;
4193 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4194 (A = Args.getLastArg(options::OPT_current__version)) ||
4195 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004196 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004197 << A->getAsString(Args) << "-dynamiclib";
4198
4199 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4200 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4201 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4202 } else {
4203 CmdArgs.push_back("-dylib");
4204
4205 Arg *A;
4206 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4207 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4208 (A = Args.getLastArg(options::OPT_client__name)) ||
4209 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4210 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4211 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004212 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004213 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004214
Daniel Dunbarc1964212009-03-26 16:23:12 +00004215 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4216 "-dylib_compatibility_version");
4217 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4218 "-dylib_current_version");
4219
Daniel Dunbara48823f2010-01-22 02:04:52 +00004220 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004221
4222 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4223 "-dylib_install_name");
4224 }
4225
4226 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4227 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4228 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004229 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004230 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004231 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4232 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4233 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4234 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4235 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4236 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004237 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004238 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4239 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4240 Args.AddAllArgs(CmdArgs, options::OPT_init);
4241
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004242 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004243 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004244
4245 // If we had an explicit -mios-simulator-version-min argument, honor that,
4246 // otherwise use the traditional deployment targets. We can't just check the
4247 // is-sim attribute because existing code follows this path, and the linker
4248 // may not handle the argument.
4249 //
4250 // FIXME: We may be able to remove this, once we can verify no one depends on
4251 // it.
4252 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4253 CmdArgs.push_back("-ios_simulator_version_min");
4254 else if (DarwinTC.isTargetIPhoneOS())
4255 CmdArgs.push_back("-iphoneos_version_min");
4256 else
4257 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004258 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004259
Daniel Dunbarc1964212009-03-26 16:23:12 +00004260 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4261 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4262 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4263 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4264 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004265
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004266 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4267 options::OPT_fno_pie,
4268 options::OPT_fno_PIE)) {
4269 if (A->getOption().matches(options::OPT_fpie) ||
4270 A->getOption().matches(options::OPT_fPIE))
4271 CmdArgs.push_back("-pie");
4272 else
4273 CmdArgs.push_back("-no_pie");
4274 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004275
4276 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4277 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4278 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4279 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4280 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4281 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4282 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4283 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4284 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4285 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4286 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4287 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4288 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4289 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4290 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4291 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004292
Daniel Dunbar84384642011-05-02 21:03:47 +00004293 // Give --sysroot= preference, over the Apple specific behavior to also use
4294 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004295 StringRef sysroot = C.getSysRoot();
4296 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004297 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004298 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004299 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4300 CmdArgs.push_back("-syslibroot");
4301 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004302 }
4303
Daniel Dunbarc1964212009-03-26 16:23:12 +00004304 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4305 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4306 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4307 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4308 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004309 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004310 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4311 Args.AddAllArgs(CmdArgs, options::OPT_y);
4312 Args.AddLastArg(CmdArgs, options::OPT_w);
4313 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4314 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4315 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4316 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4317 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4318 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4319 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4320 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4321 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4322 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4323 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4324 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4325}
4326
4327void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004328 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004329 const InputInfoList &Inputs,
4330 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004331 const char *LinkingOutput) const {
4332 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004333
Daniel Dunbarc1964212009-03-26 16:23:12 +00004334 // The logic here is derived from gcc's behavior; most of which
4335 // comes from specs (starting with link_command). Consult gcc for
4336 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004337 ArgStringList CmdArgs;
4338
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004339 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4340 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4341 options::OPT_ccc_arcmt_migrate)) {
4342 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4343 (*I)->claim();
4344 const char *Exec =
4345 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4346 CmdArgs.push_back(Output.getFilename());
4347 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4348 return;
4349 }
4350
Daniel Dunbarc1964212009-03-26 16:23:12 +00004351 // I'm not sure why this particular decomposition exists in gcc, but
4352 // we follow suite for ease of comparison.
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004353 AddLinkArgs(C, Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004354
Daniel Dunbarc1964212009-03-26 16:23:12 +00004355 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4356 Args.AddAllArgs(CmdArgs, options::OPT_s);
4357 Args.AddAllArgs(CmdArgs, options::OPT_t);
4358 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4359 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004360 Args.AddLastArg(CmdArgs, options::OPT_e);
4361 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4362 Args.AddAllArgs(CmdArgs, options::OPT_r);
4363
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004364 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4365 // members of static archive libraries which implement Objective-C classes or
4366 // categories.
4367 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4368 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004369
Daniel Dunbarc1964212009-03-26 16:23:12 +00004370 CmdArgs.push_back("-o");
4371 CmdArgs.push_back(Output.getFilename());
4372
Chad Rosier06fd3c62012-05-16 23:45:12 +00004373 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004374 !Args.hasArg(options::OPT_nostartfiles)) {
4375 // Derived from startfile spec.
4376 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004377 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004378 if (getDarwinToolChain().isTargetIOSSimulator()) {
4379 // The simulator doesn't have a versioned crt1 file.
4380 CmdArgs.push_back("-ldylib1.o");
4381 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004382 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4383 CmdArgs.push_back("-ldylib1.o");
4384 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004385 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004386 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004387 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004388 CmdArgs.push_back("-ldylib1.10.5.o");
4389 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004390 } else {
4391 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004392 if (!Args.hasArg(options::OPT_static)) {
4393 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004394 if (getDarwinToolChain().isTargetIOSSimulator()) {
4395 // The simulator doesn't have a versioned crt1 file.
4396 CmdArgs.push_back("-lbundle1.o");
4397 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004398 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4399 CmdArgs.push_back("-lbundle1.o");
4400 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004401 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004402 CmdArgs.push_back("-lbundle1.o");
4403 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004404 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004405 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004406 if (Args.hasArg(options::OPT_pg) &&
4407 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004408 if (Args.hasArg(options::OPT_static) ||
4409 Args.hasArg(options::OPT_object) ||
4410 Args.hasArg(options::OPT_preload)) {
4411 CmdArgs.push_back("-lgcrt0.o");
4412 } else {
4413 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004414
Daniel Dunbarc1964212009-03-26 16:23:12 +00004415 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004416 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004417 // By default on OS X 10.8 and later, we don't link with a crt1.o
4418 // file and the linker knows to use _main as the entry point. But,
4419 // when compiling with -pg, we need to link with the gcrt1.o file,
4420 // so pass the -no_new_main option to tell the linker to use the
4421 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004422 if (getDarwinToolChain().isTargetMacOS() &&
4423 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4424 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004425 } else {
4426 if (Args.hasArg(options::OPT_static) ||
4427 Args.hasArg(options::OPT_object) ||
4428 Args.hasArg(options::OPT_preload)) {
4429 CmdArgs.push_back("-lcrt0.o");
4430 } else {
4431 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004432 if (getDarwinToolChain().isTargetIOSSimulator()) {
4433 // The simulator doesn't have a versioned crt1 file.
4434 CmdArgs.push_back("-lcrt1.o");
4435 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004436 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4437 CmdArgs.push_back("-lcrt1.o");
4438 else
4439 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004440 } else {
4441 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4442 CmdArgs.push_back("-lcrt1.o");
4443 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4444 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004445 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004446 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004447
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004448 // darwin_crt2 spec is empty.
4449 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004450 }
4451 }
4452 }
4453 }
4454
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004455 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4456 Args.hasArg(options::OPT_shared_libgcc) &&
4457 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004458 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004459 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004460 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004461 }
4462 }
4463
4464 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004465
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004466 // If we're building a dynamic lib with -faddress-sanitizer, unresolved
4467 // symbols may appear. Mark all of them as dynamic_lookup.
4468 // Linking executables is handled in lib/Driver/ToolChains.cpp.
4469 if (Args.hasFlag(options::OPT_faddress_sanitizer,
4470 options::OPT_fno_address_sanitizer, false)) {
4471 if (Args.hasArg(options::OPT_dynamiclib) ||
4472 Args.hasArg(options::OPT_bundle)) {
4473 CmdArgs.push_back("-undefined");
4474 CmdArgs.push_back("dynamic_lookup");
4475 }
4476 }
4477
Daniel Dunbarc1964212009-03-26 16:23:12 +00004478 if (Args.hasArg(options::OPT_fopenmp))
4479 // This is more complicated in gcc...
4480 CmdArgs.push_back("-lgomp");
4481
Douglas Gregor9295df02012-05-15 21:00:27 +00004482 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4483
Bob Wilson16d93952012-05-15 18:57:39 +00004484 if (isObjCRuntimeLinked(Args) &&
4485 !Args.hasArg(options::OPT_nostdlib) &&
4486 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004487 // Avoid linking compatibility stubs on i386 mac.
4488 if (!getDarwinToolChain().isTargetMacOS() ||
4489 getDarwinToolChain().getArchName() != "i386") {
4490 // If we don't have ARC or subscripting runtime support, link in the
4491 // runtime stubs. We have to do this *before* adding any of the normal
4492 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004493 ObjCRuntime runtime =
4494 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004495 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004496 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004497 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004498 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004499 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004500 CmdArgs.push_back("-framework");
4501 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004502 // Link libobj.
4503 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004504 }
John McCall31168b02011-06-15 23:02:42 +00004505
Daniel Dunbarc1964212009-03-26 16:23:12 +00004506 if (LinkingOutput) {
4507 CmdArgs.push_back("-arch_multiple");
4508 CmdArgs.push_back("-final_output");
4509 CmdArgs.push_back(LinkingOutput);
4510 }
4511
Daniel Dunbarc1964212009-03-26 16:23:12 +00004512 if (Args.hasArg(options::OPT_fnested_functions))
4513 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004514
Daniel Dunbarc1964212009-03-26 16:23:12 +00004515 if (!Args.hasArg(options::OPT_nostdlib) &&
4516 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004517 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004518 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004519
Daniel Dunbarc1964212009-03-26 16:23:12 +00004520 // link_ssp spec is empty.
4521
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004522 // Let the tool chain choose which runtime library to link.
4523 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004524 }
4525
Chad Rosier06fd3c62012-05-16 23:45:12 +00004526 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004527 !Args.hasArg(options::OPT_nostartfiles)) {
4528 // endfile_spec is empty.
4529 }
4530
4531 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4532 Args.AddAllArgs(CmdArgs, options::OPT_F);
4533
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004534 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004535 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004536 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004537}
4538
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004539void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004540 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004541 const InputInfoList &Inputs,
4542 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004543 const char *LinkingOutput) const {
4544 ArgStringList CmdArgs;
4545
4546 CmdArgs.push_back("-create");
4547 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004548
4549 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004550 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004551
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004552 for (InputInfoList::const_iterator
4553 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4554 const InputInfo &II = *it;
4555 assert(II.isFilename() && "Unexpected lipo input.");
4556 CmdArgs.push_back(II.getFilename());
4557 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004558 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004559 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004560 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004561}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004562
Daniel Dunbar88299622010-06-04 18:28:36 +00004563void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004564 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004565 const InputInfoList &Inputs,
4566 const ArgList &Args,
4567 const char *LinkingOutput) const {
4568 ArgStringList CmdArgs;
4569
Daniel Dunbareb86b042011-05-09 17:23:16 +00004570 CmdArgs.push_back("-o");
4571 CmdArgs.push_back(Output.getFilename());
4572
Daniel Dunbar88299622010-06-04 18:28:36 +00004573 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4574 const InputInfo &Input = Inputs[0];
4575 assert(Input.isFilename() && "Unexpected dsymutil input.");
4576 CmdArgs.push_back(Input.getFilename());
4577
Daniel Dunbar88299622010-06-04 18:28:36 +00004578 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004579 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004580 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004581}
4582
Eric Christopher551ef452011-08-23 17:56:55 +00004583void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4584 const InputInfo &Output,
4585 const InputInfoList &Inputs,
4586 const ArgList &Args,
4587 const char *LinkingOutput) const {
4588 ArgStringList CmdArgs;
4589 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004590 CmdArgs.push_back("--debug-info");
4591 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004592 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004593
4594 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4595 const InputInfo &Input = Inputs[0];
4596 assert(Input.isFilename() && "Unexpected verify input");
4597
4598 // Grabbing the output of the earlier dsymutil run.
4599 CmdArgs.push_back(Input.getFilename());
4600
4601 const char *Exec =
4602 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4603 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4604}
4605
David Chisnallf571cde2012-02-15 13:39:01 +00004606void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4607 const InputInfo &Output,
4608 const InputInfoList &Inputs,
4609 const ArgList &Args,
4610 const char *LinkingOutput) const {
4611 ArgStringList CmdArgs;
4612
4613 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4614 options::OPT_Xassembler);
4615
4616 CmdArgs.push_back("-o");
4617 CmdArgs.push_back(Output.getFilename());
4618
4619 for (InputInfoList::const_iterator
4620 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4621 const InputInfo &II = *it;
4622 CmdArgs.push_back(II.getFilename());
4623 }
4624
4625 const char *Exec =
4626 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4627 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4628}
4629
4630
4631void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4632 const InputInfo &Output,
4633 const InputInfoList &Inputs,
4634 const ArgList &Args,
4635 const char *LinkingOutput) const {
4636 // FIXME: Find a real GCC, don't hard-code versions here
4637 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4638 const llvm::Triple &T = getToolChain().getTriple();
4639 std::string LibPath = "/usr/lib/";
4640 llvm::Triple::ArchType Arch = T.getArch();
4641 switch (Arch) {
4642 case llvm::Triple::x86:
4643 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4644 T.getOSName()).str() + "/4.5.2/";
4645 break;
4646 case llvm::Triple::x86_64:
4647 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4648 T.getOSName()).str();
4649 GCCLibPath += "/4.5.2/amd64/";
4650 LibPath += "amd64/";
4651 break;
4652 default:
4653 assert(0 && "Unsupported architecture");
4654 }
4655
4656 ArgStringList CmdArgs;
4657
David Chisnall272a0712012-02-29 15:06:12 +00004658 // Demangle C++ names in errors
4659 CmdArgs.push_back("-C");
4660
David Chisnallf571cde2012-02-15 13:39:01 +00004661 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4662 (!Args.hasArg(options::OPT_shared))) {
4663 CmdArgs.push_back("-e");
4664 CmdArgs.push_back("_start");
4665 }
4666
4667 if (Args.hasArg(options::OPT_static)) {
4668 CmdArgs.push_back("-Bstatic");
4669 CmdArgs.push_back("-dn");
4670 } else {
4671 CmdArgs.push_back("-Bdynamic");
4672 if (Args.hasArg(options::OPT_shared)) {
4673 CmdArgs.push_back("-shared");
4674 } else {
4675 CmdArgs.push_back("--dynamic-linker");
4676 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4677 }
4678 }
4679
4680 if (Output.isFilename()) {
4681 CmdArgs.push_back("-o");
4682 CmdArgs.push_back(Output.getFilename());
4683 } else {
4684 assert(Output.isNothing() && "Invalid output.");
4685 }
4686
4687 if (!Args.hasArg(options::OPT_nostdlib) &&
4688 !Args.hasArg(options::OPT_nostartfiles)) {
4689 if (!Args.hasArg(options::OPT_shared)) {
4690 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4691 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004692 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004693 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4694 } else {
4695 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004696 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4697 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004698 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004699 if (getToolChain().getDriver().CCCIsCXX)
4700 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004701 }
4702
4703 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4704
4705 Args.AddAllArgs(CmdArgs, options::OPT_L);
4706 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4707 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004708 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00004709
4710 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4711
4712 if (!Args.hasArg(options::OPT_nostdlib) &&
4713 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00004714 if (getToolChain().getDriver().CCCIsCXX)
4715 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00004716 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004717 if (!Args.hasArg(options::OPT_shared)) {
4718 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00004719 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00004720 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004721 }
David Chisnallf571cde2012-02-15 13:39:01 +00004722 }
4723
4724 if (!Args.hasArg(options::OPT_nostdlib) &&
4725 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00004726 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004727 }
David Chisnall96de9932012-02-16 16:00:47 +00004728 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004729
4730 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4731
4732 const char *Exec =
4733 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4734 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4735}
4736
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004737void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004738 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004739 const InputInfoList &Inputs,
4740 const ArgList &Args,
4741 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004742 ArgStringList CmdArgs;
4743
4744 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4745 options::OPT_Xassembler);
4746
4747 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004748 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004749
4750 for (InputInfoList::const_iterator
4751 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4752 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004753 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004754 }
4755
4756 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004757 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004758 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004759}
4760
4761void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004762 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004763 const InputInfoList &Inputs,
4764 const ArgList &Args,
4765 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004766 ArgStringList CmdArgs;
4767
4768 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004769 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004770 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004771 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004772 }
4773
4774 if (Args.hasArg(options::OPT_static)) {
4775 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004776 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004777 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004778// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004779 CmdArgs.push_back("-Bdynamic");
4780 if (Args.hasArg(options::OPT_shared)) {
4781 CmdArgs.push_back("-shared");
4782 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00004783 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004784 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4785 }
4786 }
4787
Daniel Dunbarb440f562010-08-02 02:38:21 +00004788 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004789 CmdArgs.push_back("-o");
4790 CmdArgs.push_back(Output.getFilename());
4791 } else {
4792 assert(Output.isNothing() && "Invalid output.");
4793 }
4794
4795 if (!Args.hasArg(options::OPT_nostdlib) &&
4796 !Args.hasArg(options::OPT_nostartfiles)) {
4797 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004798 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004799 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004800 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004801 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004802 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004803 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004804 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004805 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004806 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004807 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00004808 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004809 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004810 }
4811
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004812 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4813 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004814 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004815
4816 Args.AddAllArgs(CmdArgs, options::OPT_L);
4817 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4818 Args.AddAllArgs(CmdArgs, options::OPT_e);
4819
Daniel Dunbar54423b22010-09-17 00:24:54 +00004820 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004821
4822 if (!Args.hasArg(options::OPT_nostdlib) &&
4823 !Args.hasArg(options::OPT_nodefaultlibs)) {
4824 // FIXME: For some reason GCC passes -lgcc before adding
4825 // the default system libraries. Just mimic this for now.
4826 CmdArgs.push_back("-lgcc");
4827
4828 if (Args.hasArg(options::OPT_pthread))
4829 CmdArgs.push_back("-pthread");
4830 if (!Args.hasArg(options::OPT_shared))
4831 CmdArgs.push_back("-lc");
4832 CmdArgs.push_back("-lgcc");
4833 }
4834
4835 if (!Args.hasArg(options::OPT_nostdlib) &&
4836 !Args.hasArg(options::OPT_nostartfiles)) {
4837 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004838 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004839 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004840 }
4841
Bill Wendling08760582011-06-27 19:15:03 +00004842 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00004843
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004844 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004845 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004846 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004847}
4848
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004849void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004850 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004851 const InputInfoList &Inputs,
4852 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00004853 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004854 ArgStringList CmdArgs;
4855
4856 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4857 options::OPT_Xassembler);
4858
4859 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004860 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004861
4862 for (InputInfoList::const_iterator
4863 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4864 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004865 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004866 }
4867
4868 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004869 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004870 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004871}
4872
4873void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004874 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004875 const InputInfoList &Inputs,
4876 const ArgList &Args,
4877 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004878 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004879 ArgStringList CmdArgs;
4880
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004881 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004882 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004883 CmdArgs.push_back("-e");
4884 CmdArgs.push_back("__start");
4885 }
4886
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004887 if (Args.hasArg(options::OPT_static)) {
4888 CmdArgs.push_back("-Bstatic");
4889 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00004890 if (Args.hasArg(options::OPT_rdynamic))
4891 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004892 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004893 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004894 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004895 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004896 } else {
4897 CmdArgs.push_back("-dynamic-linker");
4898 CmdArgs.push_back("/usr/libexec/ld.so");
4899 }
4900 }
4901
Daniel Dunbarb440f562010-08-02 02:38:21 +00004902 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004903 CmdArgs.push_back("-o");
4904 CmdArgs.push_back(Output.getFilename());
4905 } else {
4906 assert(Output.isNothing() && "Invalid output.");
4907 }
4908
4909 if (!Args.hasArg(options::OPT_nostdlib) &&
4910 !Args.hasArg(options::OPT_nostartfiles)) {
4911 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00004912 if (Args.hasArg(options::OPT_pg))
4913 CmdArgs.push_back(Args.MakeArgString(
4914 getToolChain().GetFilePath("gcrt0.o")));
4915 else
4916 CmdArgs.push_back(Args.MakeArgString(
4917 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004918 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004919 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004920 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004921 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004922 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004923 }
4924 }
4925
Edward O'Callaghan5c521462009-10-28 15:13:08 +00004926 std::string Triple = getToolChain().getTripleString();
4927 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004928 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004929 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004930 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004931
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004932 Args.AddAllArgs(CmdArgs, options::OPT_L);
4933 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4934 Args.AddAllArgs(CmdArgs, options::OPT_e);
4935
Daniel Dunbar54423b22010-09-17 00:24:54 +00004936 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004937
4938 if (!Args.hasArg(options::OPT_nostdlib) &&
4939 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004940 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004941 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00004942 if (Args.hasArg(options::OPT_pg))
4943 CmdArgs.push_back("-lm_p");
4944 else
4945 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004946 }
4947
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004948 // FIXME: For some reason GCC passes -lgcc before adding
4949 // the default system libraries. Just mimic this for now.
4950 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004951
Eric Christopher17674ec2012-09-13 06:32:34 +00004952 if (Args.hasArg(options::OPT_pthread)) {
4953 if (!Args.hasArg(options::OPT_shared) &&
4954 Args.hasArg(options::OPT_pg))
4955 CmdArgs.push_back("-lpthread_p");
4956 else
4957 CmdArgs.push_back("-lpthread");
4958 }
4959
Chandler Carruth45661652011-12-17 22:32:42 +00004960 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00004961 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00004962 CmdArgs.push_back("-lc_p");
4963 else
4964 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00004965 }
Eric Christopher17674ec2012-09-13 06:32:34 +00004966
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004967 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004968 }
4969
4970 if (!Args.hasArg(options::OPT_nostdlib) &&
4971 !Args.hasArg(options::OPT_nostartfiles)) {
4972 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004973 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004974 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004975 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00004976 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004977 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004978 }
4979
4980 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004981 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004982 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004983}
Ed Schoutene33194b2009-04-02 19:13:12 +00004984
Eli Friedman9fa28852012-08-08 23:57:20 +00004985void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4986 const InputInfo &Output,
4987 const InputInfoList &Inputs,
4988 const ArgList &Args,
4989 const char *LinkingOutput) const {
4990 ArgStringList CmdArgs;
4991
4992 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4993 options::OPT_Xassembler);
4994
4995 CmdArgs.push_back("-o");
4996 CmdArgs.push_back(Output.getFilename());
4997
4998 for (InputInfoList::const_iterator
4999 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5000 const InputInfo &II = *it;
5001 CmdArgs.push_back(II.getFilename());
5002 }
5003
5004 const char *Exec =
5005 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5006 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5007}
5008
5009void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5010 const InputInfo &Output,
5011 const InputInfoList &Inputs,
5012 const ArgList &Args,
5013 const char *LinkingOutput) const {
5014 const Driver &D = getToolChain().getDriver();
5015 ArgStringList CmdArgs;
5016
5017 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5018 (!Args.hasArg(options::OPT_shared))) {
5019 CmdArgs.push_back("-e");
5020 CmdArgs.push_back("__start");
5021 }
5022
5023 if (Args.hasArg(options::OPT_static)) {
5024 CmdArgs.push_back("-Bstatic");
5025 } else {
5026 if (Args.hasArg(options::OPT_rdynamic))
5027 CmdArgs.push_back("-export-dynamic");
5028 CmdArgs.push_back("--eh-frame-hdr");
5029 CmdArgs.push_back("-Bdynamic");
5030 if (Args.hasArg(options::OPT_shared)) {
5031 CmdArgs.push_back("-shared");
5032 } else {
5033 CmdArgs.push_back("-dynamic-linker");
5034 CmdArgs.push_back("/usr/libexec/ld.so");
5035 }
5036 }
5037
5038 if (Output.isFilename()) {
5039 CmdArgs.push_back("-o");
5040 CmdArgs.push_back(Output.getFilename());
5041 } else {
5042 assert(Output.isNothing() && "Invalid output.");
5043 }
5044
5045 if (!Args.hasArg(options::OPT_nostdlib) &&
5046 !Args.hasArg(options::OPT_nostartfiles)) {
5047 if (!Args.hasArg(options::OPT_shared)) {
5048 if (Args.hasArg(options::OPT_pg))
5049 CmdArgs.push_back(Args.MakeArgString(
5050 getToolChain().GetFilePath("gcrt0.o")));
5051 else
5052 CmdArgs.push_back(Args.MakeArgString(
5053 getToolChain().GetFilePath("crt0.o")));
5054 CmdArgs.push_back(Args.MakeArgString(
5055 getToolChain().GetFilePath("crtbegin.o")));
5056 } else {
5057 CmdArgs.push_back(Args.MakeArgString(
5058 getToolChain().GetFilePath("crtbeginS.o")));
5059 }
5060 }
5061
5062 Args.AddAllArgs(CmdArgs, options::OPT_L);
5063 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5064 Args.AddAllArgs(CmdArgs, options::OPT_e);
5065
5066 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5067
5068 if (!Args.hasArg(options::OPT_nostdlib) &&
5069 !Args.hasArg(options::OPT_nodefaultlibs)) {
5070 if (D.CCCIsCXX) {
5071 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5072 if (Args.hasArg(options::OPT_pg))
5073 CmdArgs.push_back("-lm_p");
5074 else
5075 CmdArgs.push_back("-lm");
5076 }
5077
5078 if (Args.hasArg(options::OPT_pthread))
5079 CmdArgs.push_back("-lpthread");
5080 if (!Args.hasArg(options::OPT_shared)) {
5081 if (Args.hasArg(options::OPT_pg))
5082 CmdArgs.push_back("-lc_p");
5083 else
5084 CmdArgs.push_back("-lc");
5085 }
5086
5087 std::string myarch = "-lclang_rt.";
5088 const llvm::Triple &T = getToolChain().getTriple();
5089 llvm::Triple::ArchType Arch = T.getArch();
5090 switch (Arch) {
5091 case llvm::Triple::arm:
5092 myarch += ("arm");
5093 break;
5094 case llvm::Triple::x86:
5095 myarch += ("i386");
5096 break;
5097 case llvm::Triple::x86_64:
5098 myarch += ("amd64");
5099 break;
5100 default:
5101 assert(0 && "Unsupported architecture");
5102 }
5103 CmdArgs.push_back(Args.MakeArgString(myarch));
5104 }
5105
5106 if (!Args.hasArg(options::OPT_nostdlib) &&
5107 !Args.hasArg(options::OPT_nostartfiles)) {
5108 if (!Args.hasArg(options::OPT_shared))
5109 CmdArgs.push_back(Args.MakeArgString(
5110 getToolChain().GetFilePath("crtend.o")));
5111 else
5112 CmdArgs.push_back(Args.MakeArgString(
5113 getToolChain().GetFilePath("crtendS.o")));
5114 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005115
5116 const char *Exec =
5117 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5118 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005119}
5120
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005121void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005122 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005123 const InputInfoList &Inputs,
5124 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005125 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005126 ArgStringList CmdArgs;
5127
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005128 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5129 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005130 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005131 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005132 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005133 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005134 else if (getToolChain().getArch() == llvm::Triple::mips ||
5135 getToolChain().getArch() == llvm::Triple::mipsel ||
5136 getToolChain().getArch() == llvm::Triple::mips64 ||
5137 getToolChain().getArch() == llvm::Triple::mips64el) {
5138 StringRef CPUName;
5139 StringRef ABIName;
5140 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005141
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005142 CmdArgs.push_back("-march");
5143 CmdArgs.push_back(CPUName.data());
5144
5145 // Convert ABI name to the GNU tools acceptable variant.
5146 if (ABIName == "o32")
5147 ABIName = "32";
5148 else if (ABIName == "n64")
5149 ABIName = "64";
5150
5151 CmdArgs.push_back("-mabi");
5152 CmdArgs.push_back(ABIName.data());
5153
5154 if (getToolChain().getArch() == llvm::Triple::mips ||
5155 getToolChain().getArch() == llvm::Triple::mips64)
5156 CmdArgs.push_back("-EB");
5157 else
5158 CmdArgs.push_back("-EL");
5159
5160 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5161 options::OPT_fpic, options::OPT_fno_pic,
5162 options::OPT_fPIE, options::OPT_fno_PIE,
5163 options::OPT_fpie, options::OPT_fno_pie);
5164 if (LastPICArg &&
5165 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5166 LastPICArg->getOption().matches(options::OPT_fpic) ||
5167 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5168 LastPICArg->getOption().matches(options::OPT_fpie))) {
5169 CmdArgs.push_back("-KPIC");
5170 }
5171 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005172
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005173 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5174 options::OPT_Xassembler);
5175
5176 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005177 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005178
5179 for (InputInfoList::const_iterator
5180 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5181 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005182 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005183 }
5184
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005185 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005186 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005187 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005188}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005189
5190void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005191 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005192 const InputInfoList &Inputs,
5193 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005194 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005195 const toolchains::FreeBSD& ToolChain =
5196 static_cast<const toolchains::FreeBSD&>(getToolChain());
5197 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005198 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005199
5200 // Silence warning for "clang -g foo.o -o foo"
5201 Args.ClaimAllArgs(options::OPT_g_Group);
5202 // and "clang -emit-llvm foo.o -o foo"
5203 Args.ClaimAllArgs(options::OPT_emit_llvm);
5204 // and for "clang -w foo.o -o foo". Other warning options are already
5205 // handled somewhere else.
5206 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005207
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005208 if (!D.SysRoot.empty())
5209 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5210
Roman Divackyafe2f232012-08-28 15:09:03 +00005211 if (Args.hasArg(options::OPT_pie))
5212 CmdArgs.push_back("-pie");
5213
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005214 if (Args.hasArg(options::OPT_static)) {
5215 CmdArgs.push_back("-Bstatic");
5216 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005217 if (Args.hasArg(options::OPT_rdynamic))
5218 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005219 CmdArgs.push_back("--eh-frame-hdr");
5220 if (Args.hasArg(options::OPT_shared)) {
5221 CmdArgs.push_back("-Bshareable");
5222 } else {
5223 CmdArgs.push_back("-dynamic-linker");
5224 CmdArgs.push_back("/libexec/ld-elf.so.1");
5225 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005226 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5227 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005228 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5229 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5230 CmdArgs.push_back("--hash-style=both");
5231 }
5232 }
5233 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005234 }
5235
5236 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5237 // instruct ld in the base system to link 32-bit code.
Roman Divackyafe2f232012-08-28 15:09:03 +00005238 if (ToolChain.getArchName() == "i386") {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005239 CmdArgs.push_back("-m");
5240 CmdArgs.push_back("elf_i386_fbsd");
5241 }
5242
Roman Divackyafe2f232012-08-28 15:09:03 +00005243 if (ToolChain.getArchName() == "powerpc") {
Roman Divacky5e300b82011-06-04 07:40:24 +00005244 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005245 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005246 }
5247
Daniel Dunbarb440f562010-08-02 02:38:21 +00005248 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005249 CmdArgs.push_back("-o");
5250 CmdArgs.push_back(Output.getFilename());
5251 } else {
5252 assert(Output.isNothing() && "Invalid output.");
5253 }
5254
5255 if (!Args.hasArg(options::OPT_nostdlib) &&
5256 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005257 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005258 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005259 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005260 crt1 = "gcrt1.o";
5261 else if (Args.hasArg(options::OPT_pie))
5262 crt1 = "Scrt1.o";
5263 else
5264 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005265 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005266 if (crt1)
5267 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5268
5269 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5270
5271 const char *crtbegin = NULL;
5272 if (Args.hasArg(options::OPT_static))
5273 crtbegin = "crtbeginT.o";
5274 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5275 crtbegin = "crtbeginS.o";
5276 else
5277 crtbegin = "crtbegin.o";
5278
5279 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005280 }
5281
5282 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005283 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005284 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5285 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005286 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005287 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5288 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005289 Args.AddAllArgs(CmdArgs, options::OPT_s);
5290 Args.AddAllArgs(CmdArgs, options::OPT_t);
5291 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5292 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005293
Roman Divackyafe2f232012-08-28 15:09:03 +00005294 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005295
5296 if (!Args.hasArg(options::OPT_nostdlib) &&
5297 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005298 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005299 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005300 if (Args.hasArg(options::OPT_pg))
5301 CmdArgs.push_back("-lm_p");
5302 else
5303 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005304 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005305 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5306 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005307 if (Args.hasArg(options::OPT_pg))
5308 CmdArgs.push_back("-lgcc_p");
5309 else
5310 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005311 if (Args.hasArg(options::OPT_static)) {
5312 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005313 } else if (Args.hasArg(options::OPT_pg)) {
5314 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005315 } else {
5316 CmdArgs.push_back("--as-needed");
5317 CmdArgs.push_back("-lgcc_s");
5318 CmdArgs.push_back("--no-as-needed");
5319 }
5320
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005321 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005322 if (Args.hasArg(options::OPT_pg))
5323 CmdArgs.push_back("-lpthread_p");
5324 else
5325 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005326 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005327
Roman Divacky66f22762011-02-10 16:59:40 +00005328 if (Args.hasArg(options::OPT_pg)) {
5329 if (Args.hasArg(options::OPT_shared))
5330 CmdArgs.push_back("-lc");
5331 else
5332 CmdArgs.push_back("-lc_p");
5333 CmdArgs.push_back("-lgcc_p");
5334 } else {
5335 CmdArgs.push_back("-lc");
5336 CmdArgs.push_back("-lgcc");
5337 }
5338
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005339 if (Args.hasArg(options::OPT_static)) {
5340 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005341 } else if (Args.hasArg(options::OPT_pg)) {
5342 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005343 } else {
5344 CmdArgs.push_back("--as-needed");
5345 CmdArgs.push_back("-lgcc_s");
5346 CmdArgs.push_back("--no-as-needed");
5347 }
5348 }
5349
5350 if (!Args.hasArg(options::OPT_nostdlib) &&
5351 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005352 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005353 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005354 else
5355 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005356 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005357 }
5358
Roman Divackyafe2f232012-08-28 15:09:03 +00005359 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005360
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005361 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005362 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005363 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005364}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005365
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005366void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5367 const InputInfo &Output,
5368 const InputInfoList &Inputs,
5369 const ArgList &Args,
5370 const char *LinkingOutput) const {
5371 ArgStringList CmdArgs;
5372
5373 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5374 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005375 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005376 CmdArgs.push_back("--32");
5377
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005378 // Set byte order explicitly
5379 if (getToolChain().getArchName() == "mips")
5380 CmdArgs.push_back("-EB");
5381 else if (getToolChain().getArchName() == "mipsel")
5382 CmdArgs.push_back("-EL");
5383
5384 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5385 options::OPT_Xassembler);
5386
5387 CmdArgs.push_back("-o");
5388 CmdArgs.push_back(Output.getFilename());
5389
5390 for (InputInfoList::const_iterator
5391 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5392 const InputInfo &II = *it;
5393 CmdArgs.push_back(II.getFilename());
5394 }
5395
David Chisnallddbd68f2011-09-27 22:03:18 +00005396 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005397 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5398}
5399
5400void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5401 const InputInfo &Output,
5402 const InputInfoList &Inputs,
5403 const ArgList &Args,
5404 const char *LinkingOutput) const {
5405 const Driver &D = getToolChain().getDriver();
5406 ArgStringList CmdArgs;
5407
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005408 if (!D.SysRoot.empty())
5409 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5410
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005411 if (Args.hasArg(options::OPT_static)) {
5412 CmdArgs.push_back("-Bstatic");
5413 } else {
5414 if (Args.hasArg(options::OPT_rdynamic))
5415 CmdArgs.push_back("-export-dynamic");
5416 CmdArgs.push_back("--eh-frame-hdr");
5417 if (Args.hasArg(options::OPT_shared)) {
5418 CmdArgs.push_back("-Bshareable");
5419 } else {
5420 CmdArgs.push_back("-dynamic-linker");
5421 CmdArgs.push_back("/libexec/ld.elf_so");
5422 }
5423 }
5424
5425 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5426 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005427 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005428 CmdArgs.push_back("-m");
5429 CmdArgs.push_back("elf_i386");
5430 }
5431
5432 if (Output.isFilename()) {
5433 CmdArgs.push_back("-o");
5434 CmdArgs.push_back(Output.getFilename());
5435 } else {
5436 assert(Output.isNothing() && "Invalid output.");
5437 }
5438
5439 if (!Args.hasArg(options::OPT_nostdlib) &&
5440 !Args.hasArg(options::OPT_nostartfiles)) {
5441 if (!Args.hasArg(options::OPT_shared)) {
5442 CmdArgs.push_back(Args.MakeArgString(
5443 getToolChain().GetFilePath("crt0.o")));
5444 CmdArgs.push_back(Args.MakeArgString(
5445 getToolChain().GetFilePath("crti.o")));
5446 CmdArgs.push_back(Args.MakeArgString(
5447 getToolChain().GetFilePath("crtbegin.o")));
5448 } else {
5449 CmdArgs.push_back(Args.MakeArgString(
5450 getToolChain().GetFilePath("crti.o")));
5451 CmdArgs.push_back(Args.MakeArgString(
5452 getToolChain().GetFilePath("crtbeginS.o")));
5453 }
5454 }
5455
5456 Args.AddAllArgs(CmdArgs, options::OPT_L);
5457 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5458 Args.AddAllArgs(CmdArgs, options::OPT_e);
5459 Args.AddAllArgs(CmdArgs, options::OPT_s);
5460 Args.AddAllArgs(CmdArgs, options::OPT_t);
5461 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5462 Args.AddAllArgs(CmdArgs, options::OPT_r);
5463
5464 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5465
5466 if (!Args.hasArg(options::OPT_nostdlib) &&
5467 !Args.hasArg(options::OPT_nodefaultlibs)) {
5468 if (D.CCCIsCXX) {
5469 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5470 CmdArgs.push_back("-lm");
5471 }
5472 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5473 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005474 if (Args.hasArg(options::OPT_static)) {
5475 CmdArgs.push_back("-lgcc_eh");
5476 } else {
5477 CmdArgs.push_back("--as-needed");
5478 CmdArgs.push_back("-lgcc_s");
5479 CmdArgs.push_back("--no-as-needed");
5480 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005481 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005482
5483 if (Args.hasArg(options::OPT_pthread))
5484 CmdArgs.push_back("-lpthread");
5485 CmdArgs.push_back("-lc");
5486
5487 CmdArgs.push_back("-lgcc");
5488 if (Args.hasArg(options::OPT_static)) {
5489 CmdArgs.push_back("-lgcc_eh");
5490 } else {
5491 CmdArgs.push_back("--as-needed");
5492 CmdArgs.push_back("-lgcc_s");
5493 CmdArgs.push_back("--no-as-needed");
5494 }
5495 }
5496
5497 if (!Args.hasArg(options::OPT_nostdlib) &&
5498 !Args.hasArg(options::OPT_nostartfiles)) {
5499 if (!Args.hasArg(options::OPT_shared))
5500 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5501 "crtend.o")));
5502 else
5503 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5504 "crtendS.o")));
5505 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5506 "crtn.o")));
5507 }
5508
Bill Wendling08760582011-06-27 19:15:03 +00005509 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005510
David Chisnallddbd68f2011-09-27 22:03:18 +00005511 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005512 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5513}
5514
Rafael Espindola92b00932010-08-10 00:25:48 +00005515void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5516 const InputInfo &Output,
5517 const InputInfoList &Inputs,
5518 const ArgList &Args,
5519 const char *LinkingOutput) const {
5520 ArgStringList CmdArgs;
5521
5522 // Add --32/--64 to make sure we get the format we want.
5523 // This is incomplete
5524 if (getToolChain().getArch() == llvm::Triple::x86) {
5525 CmdArgs.push_back("--32");
5526 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5527 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005528 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5529 CmdArgs.push_back("-a32");
5530 CmdArgs.push_back("-mppc");
5531 CmdArgs.push_back("-many");
5532 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5533 CmdArgs.push_back("-a64");
5534 CmdArgs.push_back("-mppc64");
5535 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005536 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005537 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005538 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5539 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005540
5541 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5542 getToolChain().getTriple());
5543 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005544
5545 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5546 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5547 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005548 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5549 getToolChain().getArch() == llvm::Triple::mipsel ||
5550 getToolChain().getArch() == llvm::Triple::mips64 ||
5551 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005552 StringRef CPUName;
5553 StringRef ABIName;
5554 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005555
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005556 CmdArgs.push_back("-march");
5557 CmdArgs.push_back(CPUName.data());
5558
5559 // Convert ABI name to the GNU tools acceptable variant.
5560 if (ABIName == "o32")
5561 ABIName = "32";
5562 else if (ABIName == "n64")
5563 ABIName = "64";
5564
5565 CmdArgs.push_back("-mabi");
5566 CmdArgs.push_back(ABIName.data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005567
5568 if (getToolChain().getArch() == llvm::Triple::mips ||
5569 getToolChain().getArch() == llvm::Triple::mips64)
5570 CmdArgs.push_back("-EB");
5571 else
5572 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005573
5574 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5575 options::OPT_fpic, options::OPT_fno_pic,
5576 options::OPT_fPIE, options::OPT_fno_PIE,
5577 options::OPT_fpie, options::OPT_fno_pie);
5578 if (LastPICArg &&
5579 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5580 LastPICArg->getOption().matches(options::OPT_fpic) ||
5581 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5582 LastPICArg->getOption().matches(options::OPT_fpie))) {
5583 CmdArgs.push_back("-KPIC");
5584 }
Rafael Espindola92b00932010-08-10 00:25:48 +00005585 }
5586
5587 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5588 options::OPT_Xassembler);
5589
5590 CmdArgs.push_back("-o");
5591 CmdArgs.push_back(Output.getFilename());
5592
5593 for (InputInfoList::const_iterator
5594 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5595 const InputInfo &II = *it;
5596 CmdArgs.push_back(II.getFilename());
5597 }
5598
5599 const char *Exec =
5600 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5601 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5602}
5603
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005604static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5605 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00005606 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005607 bool StaticLibgcc = isAndroid || Args.hasArg(options::OPT_static) ||
Rafael Espindolacc354322011-10-17 21:39:04 +00005608 Args.hasArg(options::OPT_static_libgcc);
5609 if (!D.CCCIsCXX)
5610 CmdArgs.push_back("-lgcc");
5611
5612 if (StaticLibgcc) {
5613 if (D.CCCIsCXX)
5614 CmdArgs.push_back("-lgcc");
5615 } else {
5616 if (!D.CCCIsCXX)
5617 CmdArgs.push_back("--as-needed");
5618 CmdArgs.push_back("-lgcc_s");
5619 if (!D.CCCIsCXX)
5620 CmdArgs.push_back("--no-as-needed");
5621 }
5622
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005623 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005624 CmdArgs.push_back("-lgcc_eh");
5625 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5626 CmdArgs.push_back("-lgcc");
5627}
5628
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005629void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5630 const InputInfo &Output,
5631 const InputInfoList &Inputs,
5632 const ArgList &Args,
5633 const char *LinkingOutput) const {
5634 const toolchains::Linux& ToolChain =
5635 static_cast<const toolchains::Linux&>(getToolChain());
5636 const Driver &D = ToolChain.getDriver();
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005637 const bool isAndroid = ToolChain.getTriple().getEnvironment() ==
Logan Chienc6fd8202012-09-02 09:30:11 +00005638 llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005639
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005640 ArgStringList CmdArgs;
5641
Rafael Espindolad1002f62010-11-15 18:28:16 +00005642 // Silence warning for "clang -g foo.o -o foo"
5643 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005644 // and "clang -emit-llvm foo.o -o foo"
5645 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00005646 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005647 // handled somewhere else.
5648 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005649
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005650 if (!D.SysRoot.empty())
5651 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005652
Rafael Espindolad47ac232010-11-17 22:26:15 +00005653 if (Args.hasArg(options::OPT_pie))
5654 CmdArgs.push_back("-pie");
5655
Rafael Espindola1c76c592010-11-07 22:57:16 +00005656 if (Args.hasArg(options::OPT_rdynamic))
5657 CmdArgs.push_back("-export-dynamic");
5658
Rafael Espindola34d77dc2010-11-11 19:34:42 +00005659 if (Args.hasArg(options::OPT_s))
5660 CmdArgs.push_back("-s");
5661
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005662 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5663 e = ToolChain.ExtraOpts.end();
5664 i != e; ++i)
5665 CmdArgs.push_back(i->c_str());
5666
5667 if (!Args.hasArg(options::OPT_static)) {
5668 CmdArgs.push_back("--eh-frame-hdr");
5669 }
5670
5671 CmdArgs.push_back("-m");
5672 if (ToolChain.getArch() == llvm::Triple::x86)
5673 CmdArgs.push_back("elf_i386");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005674 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00005675 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005676 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005677 else if (ToolChain.getArch() == llvm::Triple::ppc)
5678 CmdArgs.push_back("elf32ppclinux");
5679 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5680 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005681 else if (ToolChain.getArch() == llvm::Triple::mips)
5682 CmdArgs.push_back("elf32btsmip");
5683 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5684 CmdArgs.push_back("elf32ltsmip");
5685 else if (ToolChain.getArch() == llvm::Triple::mips64)
5686 CmdArgs.push_back("elf64btsmip");
5687 else if (ToolChain.getArch() == llvm::Triple::mips64el)
5688 CmdArgs.push_back("elf64ltsmip");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005689 else
5690 CmdArgs.push_back("elf_x86_64");
5691
5692 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00005693 if (ToolChain.getArch() == llvm::Triple::arm
5694 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005695 CmdArgs.push_back("-Bstatic");
5696 else
5697 CmdArgs.push_back("-static");
5698 } else if (Args.hasArg(options::OPT_shared)) {
5699 CmdArgs.push_back("-shared");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005700 if ((ToolChain.getArch() == llvm::Triple::arm
5701 || ToolChain.getArch() == llvm::Triple::thumb) && isAndroid) {
5702 CmdArgs.push_back("-Bsymbolic");
5703 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005704 }
5705
5706 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00005707 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005708 (!Args.hasArg(options::OPT_static) &&
5709 !Args.hasArg(options::OPT_shared))) {
5710 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005711 if (isAndroid)
5712 CmdArgs.push_back("/system/bin/linker");
5713 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005714 CmdArgs.push_back("/lib/ld-linux.so.2");
Douglas Gregord9bb1522011-03-06 19:11:49 +00005715 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liueabbf922012-07-30 11:05:56 +00005716 ToolChain.getArch() == llvm::Triple::thumb) {
5717 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5718 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5719 else
5720 CmdArgs.push_back("/lib/ld-linux.so.3");
5721 }
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005722 else if (ToolChain.getArch() == llvm::Triple::mips ||
5723 ToolChain.getArch() == llvm::Triple::mipsel)
5724 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan1e1e2e22012-04-06 20:14:27 +00005725 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
5726 ToolChain.getArch() == llvm::Triple::mips64el)
5727 CmdArgs.push_back("/lib64/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005728 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner20b90d02011-04-11 21:15:37 +00005729 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005730 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner20b90d02011-04-11 21:15:37 +00005731 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005732 else
5733 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5734 }
5735
5736 CmdArgs.push_back("-o");
5737 CmdArgs.push_back(Output.getFilename());
5738
Rafael Espindola81937ec2010-12-01 01:52:43 +00005739 if (!Args.hasArg(options::OPT_nostdlib) &&
5740 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005741 if (!isAndroid) {
5742 const char *crt1 = NULL;
5743 if (!Args.hasArg(options::OPT_shared)){
5744 if (Args.hasArg(options::OPT_pie))
5745 crt1 = "Scrt1.o";
5746 else
5747 crt1 = "crt1.o";
5748 }
5749 if (crt1)
5750 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005751
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005752 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5753 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005754
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005755 const char *crtbegin;
5756 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005757 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005758 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005759 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005760 else if (Args.hasArg(options::OPT_pie))
5761 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005762 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005763 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005764 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
5765 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005766
5767 Args.AddAllArgs(CmdArgs, options::OPT_L);
5768
5769 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5770
Roman Divackyee8188a2011-03-01 17:53:14 +00005771 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5772 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005773 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005774
Rafael Espindola9446d762012-04-09 23:53:34 +00005775 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5776 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5777 // forward.
5778 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5779 CmdArgs.push_back("-plugin");
5780 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5781 CmdArgs.push_back(Args.MakeArgString(Plugin));
5782 }
5783
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00005784 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5785 CmdArgs.push_back("--no-demangle");
5786
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005787 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5788
Chandler Carruth94a32012012-05-14 18:31:18 +00005789 if (D.CCCIsCXX &&
5790 !Args.hasArg(options::OPT_nostdlib) &&
5791 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00005792 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5793 !Args.hasArg(options::OPT_static);
5794 if (OnlyLibstdcxxStatic)
5795 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005796 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00005797 if (OnlyLibstdcxxStatic)
5798 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005799 CmdArgs.push_back("-lm");
5800 }
5801
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005802 // Call this before we add the C run-time.
5803 addAsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00005804 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005805
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005806 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00005807 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5808 if (Args.hasArg(options::OPT_static))
5809 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00005810
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005811 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005812
Chandler Carruth94a32012012-05-14 18:31:18 +00005813 if (Args.hasArg(options::OPT_pthread) ||
5814 Args.hasArg(options::OPT_pthreads))
5815 CmdArgs.push_back("-lpthread");
5816
5817 CmdArgs.push_back("-lc");
5818
5819 if (Args.hasArg(options::OPT_static))
5820 CmdArgs.push_back("--end-group");
5821 else
5822 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5823 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00005824
Rafael Espindola81937ec2010-12-01 01:52:43 +00005825 if (!Args.hasArg(options::OPT_nostartfiles)) {
5826 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005827 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005828 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005829 else if (Args.hasArg(options::OPT_pie))
5830 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00005831 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005832 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005833
Rafael Espindola81937ec2010-12-01 01:52:43 +00005834 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005835 if (!isAndroid)
5836 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00005837 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005838 }
5839
Bill Wendling08760582011-06-27 19:15:03 +00005840 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005841
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005842 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5843}
Rafael Espindola92b00932010-08-10 00:25:48 +00005844
Chris Lattner3e2ee142010-07-07 16:01:42 +00005845void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005846 const InputInfo &Output,
5847 const InputInfoList &Inputs,
5848 const ArgList &Args,
5849 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005850 ArgStringList CmdArgs;
5851
5852 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5853 options::OPT_Xassembler);
5854
5855 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005856 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005857
5858 for (InputInfoList::const_iterator
5859 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5860 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005861 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005862 }
5863
5864 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00005865 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005866 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005867}
5868
5869void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005870 const InputInfo &Output,
5871 const InputInfoList &Inputs,
5872 const ArgList &Args,
5873 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005874 const Driver &D = getToolChain().getDriver();
5875 ArgStringList CmdArgs;
5876
Daniel Dunbarb440f562010-08-02 02:38:21 +00005877 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005878 CmdArgs.push_back("-o");
5879 CmdArgs.push_back(Output.getFilename());
5880 } else {
5881 assert(Output.isNothing() && "Invalid output.");
5882 }
5883
5884 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00005885 !Args.hasArg(options::OPT_nostartfiles)) {
5886 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
5887 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5888 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
5889 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
5890 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005891
5892 Args.AddAllArgs(CmdArgs, options::OPT_L);
5893 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5894 Args.AddAllArgs(CmdArgs, options::OPT_e);
5895
Daniel Dunbar54423b22010-09-17 00:24:54 +00005896 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005897
Eli Friedman83de5132011-12-08 23:54:21 +00005898 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5899
Chris Lattner3e2ee142010-07-07 16:01:42 +00005900 if (!Args.hasArg(options::OPT_nostdlib) &&
5901 !Args.hasArg(options::OPT_nodefaultlibs)) {
5902 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005903 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005904 CmdArgs.push_back("-lm");
5905 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005906 }
5907
5908 if (!Args.hasArg(options::OPT_nostdlib) &&
5909 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00005910 if (Args.hasArg(options::OPT_pthread))
5911 CmdArgs.push_back("-lpthread");
5912 CmdArgs.push_back("-lc");
5913 CmdArgs.push_back("-lCompilerRT-Generic");
5914 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
5915 CmdArgs.push_back(
5916 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005917 }
5918
Eli Friedman83de5132011-12-08 23:54:21 +00005919 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005920 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005921}
5922
Daniel Dunbarcc912342009-05-02 18:28:39 +00005923/// DragonFly Tools
5924
5925// For now, DragonFly Assemble does just about the same as for
5926// FreeBSD, but this may change soon.
5927void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005928 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005929 const InputInfoList &Inputs,
5930 const ArgList &Args,
5931 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005932 ArgStringList CmdArgs;
5933
5934 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5935 // instruct as in the base system to assemble 32-bit code.
5936 if (getToolChain().getArchName() == "i386")
5937 CmdArgs.push_back("--32");
5938
5939 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5940 options::OPT_Xassembler);
5941
5942 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005943 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005944
5945 for (InputInfoList::const_iterator
5946 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5947 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005948 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005949 }
5950
5951 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005952 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005953 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005954}
5955
5956void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005957 const InputInfo &Output,
5958 const InputInfoList &Inputs,
5959 const ArgList &Args,
5960 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005961 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00005962 ArgStringList CmdArgs;
5963
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005964 if (!D.SysRoot.empty())
5965 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5966
Daniel Dunbarcc912342009-05-02 18:28:39 +00005967 if (Args.hasArg(options::OPT_static)) {
5968 CmdArgs.push_back("-Bstatic");
5969 } else {
5970 if (Args.hasArg(options::OPT_shared))
5971 CmdArgs.push_back("-Bshareable");
5972 else {
5973 CmdArgs.push_back("-dynamic-linker");
5974 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
5975 }
5976 }
5977
5978 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5979 // instruct ld in the base system to link 32-bit code.
5980 if (getToolChain().getArchName() == "i386") {
5981 CmdArgs.push_back("-m");
5982 CmdArgs.push_back("elf_i386");
5983 }
5984
Daniel Dunbarb440f562010-08-02 02:38:21 +00005985 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005986 CmdArgs.push_back("-o");
5987 CmdArgs.push_back(Output.getFilename());
5988 } else {
5989 assert(Output.isNothing() && "Invalid output.");
5990 }
5991
5992 if (!Args.hasArg(options::OPT_nostdlib) &&
5993 !Args.hasArg(options::OPT_nostartfiles)) {
5994 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005995 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005996 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005997 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005998 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005999 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006000 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006001 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006002 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006003 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006004 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006005 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006006 }
6007 }
6008
6009 Args.AddAllArgs(CmdArgs, options::OPT_L);
6010 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6011 Args.AddAllArgs(CmdArgs, options::OPT_e);
6012
Daniel Dunbar54423b22010-09-17 00:24:54 +00006013 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006014
6015 if (!Args.hasArg(options::OPT_nostdlib) &&
6016 !Args.hasArg(options::OPT_nodefaultlibs)) {
6017 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6018 // rpaths
6019 CmdArgs.push_back("-L/usr/lib/gcc41");
6020
6021 if (!Args.hasArg(options::OPT_static)) {
6022 CmdArgs.push_back("-rpath");
6023 CmdArgs.push_back("/usr/lib/gcc41");
6024
6025 CmdArgs.push_back("-rpath-link");
6026 CmdArgs.push_back("/usr/lib/gcc41");
6027
6028 CmdArgs.push_back("-rpath");
6029 CmdArgs.push_back("/usr/lib");
6030
6031 CmdArgs.push_back("-rpath-link");
6032 CmdArgs.push_back("/usr/lib");
6033 }
6034
Rafael Espindola38360b32010-07-20 12:59:03 +00006035 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006036 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006037 CmdArgs.push_back("-lm");
6038 }
6039
Daniel Dunbarcc912342009-05-02 18:28:39 +00006040 if (Args.hasArg(options::OPT_shared)) {
6041 CmdArgs.push_back("-lgcc_pic");
6042 } else {
6043 CmdArgs.push_back("-lgcc");
6044 }
6045
6046
6047 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006048 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006049
6050 if (!Args.hasArg(options::OPT_nolibc)) {
6051 CmdArgs.push_back("-lc");
6052 }
6053
6054 if (Args.hasArg(options::OPT_shared)) {
6055 CmdArgs.push_back("-lgcc_pic");
6056 } else {
6057 CmdArgs.push_back("-lgcc");
6058 }
6059 }
6060
6061 if (!Args.hasArg(options::OPT_nostdlib) &&
6062 !Args.hasArg(options::OPT_nostartfiles)) {
6063 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006064 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006065 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006066 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006067 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006068 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006069 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006070 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006071 }
6072
Bill Wendling08760582011-06-27 19:15:03 +00006073 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006074
Daniel Dunbarcc912342009-05-02 18:28:39 +00006075 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006076 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006077 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006078}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006079
6080void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6081 const InputInfo &Output,
6082 const InputInfoList &Inputs,
6083 const ArgList &Args,
6084 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006085 ArgStringList CmdArgs;
6086
6087 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006088 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6089 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006090 } else {
6091 assert(Output.isNothing() && "Invalid output.");
6092 }
6093
6094 if (!Args.hasArg(options::OPT_nostdlib) &&
6095 !Args.hasArg(options::OPT_nostartfiles)) {
6096 CmdArgs.push_back("-defaultlib:libcmt");
6097 }
6098
6099 CmdArgs.push_back("-nologo");
6100
Michael J. Spencere2f49362012-06-18 16:56:04 +00006101 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6102
6103 // Add filenames immediately.
6104 for (InputInfoList::const_iterator
6105 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6106 if (it->isFilename())
6107 CmdArgs.push_back(it->getFilename());
6108 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006109
6110 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006111 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006112 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6113}