blob: c113406670ba6bec21218877bfca53a5ec43e0ae [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
11
Daniel Dunbara2aedc62009-03-18 10:01:51 +000012#include "clang/Driver/Action.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000013#include "clang/Driver/Arg.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000014#include "clang/Driver/ArgList.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000015#include "clang/Driver/Driver.h"
16#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000017#include "clang/Driver/Compilation.h"
18#include "clang/Driver/Job.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000019#include "clang/Driver/Option.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000020#include "clang/Driver/Options.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000021#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Util.h"
John McCall5fb5df92012-06-20 06:18:46 +000023#include "clang/Basic/ObjCRuntime.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000024
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000025#include "llvm/ADT/SmallString.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000026#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000027#include "llvm/ADT/Twine.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000028#include "llvm/Support/FileSystem.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000029#include "llvm/Support/Format.h"
30#include "llvm/Support/raw_ostream.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000031#include "llvm/Support/Host.h"
32#include "llvm/Support/Process.h"
John McCall31168b02011-06-15 23:02:42 +000033#include "llvm/Support/ErrorHandling.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000034
35#include "InputInfo.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000036#include "ToolChains.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000037
Daniel Dunbar1a093d22009-03-18 06:00:36 +000038using namespace clang::driver;
39using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000040using namespace clang;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000041
Daniel Dunbar64198ef2009-09-10 01:21:05 +000042/// CheckPreprocessingOptions - Perform some validation of preprocessing
43/// arguments that is shared with gcc.
44static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
45 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
Joerg Sonnenbergerb86f5f42011-03-06 23:31:01 +000046 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP)
Chris Lattner0e62c1c2011-07-23 10:55:15 +000047 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar64198ef2009-09-10 01:21:05 +000048 << A->getAsString(Args) << "-E";
49}
50
Daniel Dunbar4eadb602009-09-10 01:21:12 +000051/// CheckCodeGenerationOptions - Perform some validation of code generation
52/// arguments that is shared with gcc.
53static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
54 // In gcc, only ARM checks this, but it seems reasonable to check universally.
55 if (Args.hasArg(options::OPT_static))
56 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
57 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000058 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000059 << A->getAsString(Args) << "-static";
60}
61
Chris Lattnerbf2803f2010-03-29 17:55:58 +000062// Quote target names for inclusion in GNU Make dependency files.
63// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000064static void QuoteTarget(StringRef Target,
65 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +000066 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
67 switch (Target[i]) {
68 case ' ':
69 case '\t':
70 // Escape the preceding backslashes
71 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
72 Res.push_back('\\');
73
74 // Escape the space/tab
75 Res.push_back('\\');
76 break;
77 case '$':
78 Res.push_back('$');
79 break;
80 case '#':
81 Res.push_back('\\');
82 break;
83 default:
84 break;
85 }
86
87 Res.push_back(Target[i]);
88 }
89}
90
Bill Wendlingc0938f32012-03-12 22:10:06 +000091static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +000092 ArgStringList &CmdArgs,
93 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +000094 const char *EnvVar) {
95 const char *DirList = ::getenv(EnvVar);
Bill Wendling281ca292012-03-12 21:22:35 +000096 if (!DirList)
97 return; // Nothing to do.
98
99 StringRef Dirs(DirList);
100 if (Dirs.empty()) // Empty string should not add '.'.
101 return;
102
103 StringRef::size_type Delim;
104 while ((Delim = Dirs.find(llvm::sys::PathSeparator)) != StringRef::npos) {
105 if (Delim == 0) { // Leading colon.
106 CmdArgs.push_back(ArgName);
107 CmdArgs.push_back(".");
108 } else {
109 CmdArgs.push_back(ArgName);
Nico Weber89355782012-03-19 15:00:03 +0000110 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
Bill Wendling281ca292012-03-12 21:22:35 +0000111 }
Nico Weber89355782012-03-19 15:00:03 +0000112 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000113 }
114
115 if (Dirs.empty()) { // Trailing colon.
116 CmdArgs.push_back(ArgName);
117 CmdArgs.push_back(".");
118 } else { // Add the last path.
119 CmdArgs.push_back(ArgName);
120 CmdArgs.push_back(Args.MakeArgString(Dirs));
121 }
122}
123
Daniel Dunbar54423b22010-09-17 00:24:54 +0000124static void AddLinkerInputs(const ToolChain &TC,
125 const InputInfoList &Inputs, const ArgList &Args,
126 ArgStringList &CmdArgs) {
127 const Driver &D = TC.getDriver();
128
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000129 // Add extra linker input arguments which are not treated as inputs
130 // (constructed via -Xarch_).
131 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
132
Daniel Dunbar54423b22010-09-17 00:24:54 +0000133 for (InputInfoList::const_iterator
134 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
135 const InputInfo &II = *it;
136
137 if (!TC.HasNativeLLVMSupport()) {
138 // Don't try to pass LLVM inputs unless we have native support.
139 if (II.getType() == types::TY_LLVM_IR ||
140 II.getType() == types::TY_LTO_IR ||
141 II.getType() == types::TY_LLVM_BC ||
142 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000143 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000144 << TC.getTripleString();
145 }
146
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000147 // Add filenames immediately.
148 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000149 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000150 continue;
151 }
152
153 // Otherwise, this is a linker input argument.
154 const Arg &A = II.getInputArg();
155
156 // Handle reserved library options.
157 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000158 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Senafeb03b2010-09-17 18:39:08 +0000159 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
160 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000161 } else
162 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar54423b22010-09-17 00:24:54 +0000163 }
Bill Wendling281ca292012-03-12 21:22:35 +0000164
165 // LIBRARY_PATH - included following the user specified library paths.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000166 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000167}
168
John McCall31168b02011-06-15 23:02:42 +0000169/// \brief Determine whether Objective-C automated reference counting is
170/// enabled.
171static bool isObjCAutoRefCount(const ArgList &Args) {
172 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
173}
174
Ted Kremeneke65b0862012-03-06 20:05:56 +0000175/// \brief Determine whether we are linking the ObjC runtime.
176static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000177 if (isObjCAutoRefCount(Args)) {
178 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000179 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000180 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000181 return Args.hasArg(options::OPT_fobjc_link_runtime);
182}
183
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000184static void addProfileRT(const ToolChain &TC, const ArgList &Args,
Bill Wendling08760582011-06-27 19:15:03 +0000185 ArgStringList &CmdArgs,
186 llvm::Triple Triple) {
187 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
188 Args.hasArg(options::OPT_fprofile_generate) ||
189 Args.hasArg(options::OPT_fcreate_profile) ||
190 Args.hasArg(options::OPT_coverage)))
191 return;
192
193 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
194 // the link line. We cannot do the same thing because unlike gcov there is a
195 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
196 // not supported by old linkers.
Benjamin Kramerf5fbe432011-11-07 16:02:25 +0000197 std::string ProfileRT =
198 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
Bill Wendling08760582011-06-27 19:15:03 +0000199
Bill Wendling08760582011-06-27 19:15:03 +0000200 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000201}
202
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000203void Clang::AddPreprocessingOptions(Compilation &C,
204 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000205 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000206 ArgStringList &CmdArgs,
207 const InputInfo &Output,
208 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000209 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000210
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000211 CheckPreprocessingOptions(D, Args);
212
213 Args.AddLastArg(CmdArgs, options::OPT_C);
214 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000215
216 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000217 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000218 (A = Args.getLastArg(options::OPT_MD)) ||
219 (A = Args.getLastArg(options::OPT_MMD))) {
220 // Determine the output location.
221 const char *DepFile;
222 if (Output.getType() == types::TY_Dependencies) {
Daniel Dunbarb440f562010-08-02 02:38:21 +0000223 DepFile = Output.getFilename();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000224 } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
225 DepFile = MF->getValue(Args);
Peter Collingbourne119cfaa2011-11-21 00:01:05 +0000226 C.addFailureResultFile(DepFile);
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000227 } else if (A->getOption().matches(options::OPT_M) ||
228 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000229 DepFile = "-";
230 } else {
231 DepFile = darwin::CC1::getDependencyFileName(Args, Inputs);
Peter Collingbourne119cfaa2011-11-21 00:01:05 +0000232 C.addFailureResultFile(DepFile);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000233 }
234 CmdArgs.push_back("-dependency-file");
235 CmdArgs.push_back(DepFile);
236
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000237 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000238 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
239 const char *DepTarget;
240
241 // If user provided -o, that is the dependency target, except
242 // when we are only generating a dependency file.
243 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
244 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
245 DepTarget = OutputOpt->getValue(Args);
246 } else {
247 // Otherwise derive from the base input.
248 //
249 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000250 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000251 llvm::sys::path::replace_extension(P, "o");
252 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000253 }
254
255 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000256 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000257 QuoteTarget(DepTarget, Quoted);
258 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000259 }
260
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000261 if (A->getOption().matches(options::OPT_M) ||
262 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000263 CmdArgs.push_back("-sys-header-deps");
264 }
265
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000266 if (Args.hasArg(options::OPT_MG)) {
267 if (!A || A->getOption().matches(options::OPT_MD) ||
268 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000269 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000270 CmdArgs.push_back("-MG");
271 }
272
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000273 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000274
275 // Convert all -MQ <target> args to -MT <quoted target>
276 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
277 options::OPT_MQ),
278 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000279 const Arg *A = *it;
280 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000281
Daniel Dunbara442fd52010-06-11 22:00:13 +0000282 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000283 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000284 SmallString<128> Quoted;
Daniel Dunbara442fd52010-06-11 22:00:13 +0000285 QuoteTarget(A->getValue(Args), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000286 CmdArgs.push_back(Args.MakeArgString(Quoted));
287
288 // -MT flag - no change
289 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000290 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000291 }
292 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293
Douglas Gregor111af7d2009-04-18 00:34:01 +0000294 // Add -i* options, and automatically translate to
295 // -include-pch/-include-pth for transparent PCH support. It's
296 // wonky, but we include looking for .gch so we can support seamless
297 // replacement into a build system already set up to be generating
298 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000299 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000300 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
301 ie = Args.filtered_end(); it != ie; ++it) {
302 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000303
304 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000305 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
306 RenderedImplicitInclude = true;
307
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000308 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000309 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000310
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000311 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000312 bool FoundPCH = false;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000313 llvm::sys::Path P(A->getValue(Args));
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000314 bool Exists;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000315 if (UsePCH) {
Douglas Gregor111af7d2009-04-18 00:34:01 +0000316 P.appendSuffix("pch");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000317 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregor111af7d2009-04-18 00:34:01 +0000318 FoundPCH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000319 else
Douglas Gregor111af7d2009-04-18 00:34:01 +0000320 P.eraseSuffix();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321 }
322
Douglas Gregor111af7d2009-04-18 00:34:01 +0000323 if (!FoundPCH) {
324 P.appendSuffix("pth");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000325 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregor111af7d2009-04-18 00:34:01 +0000326 FoundPTH = true;
327 else
328 P.eraseSuffix();
Mike Stump11289f42009-09-09 15:08:12 +0000329 }
330
Douglas Gregor111af7d2009-04-18 00:34:01 +0000331 if (!FoundPCH && !FoundPTH) {
332 P.appendSuffix("gch");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000333 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000334 FoundPCH = UsePCH;
335 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000336 }
Mike Stump11289f42009-09-09 15:08:12 +0000337 else
Douglas Gregor111af7d2009-04-18 00:34:01 +0000338 P.eraseSuffix();
339 }
340
341 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000342 if (IsFirstImplicitInclude) {
343 A->claim();
344 if (UsePCH)
345 CmdArgs.push_back("-include-pch");
346 else
347 CmdArgs.push_back("-include-pth");
348 CmdArgs.push_back(Args.MakeArgString(P.str()));
349 continue;
350 } else {
351 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000352 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000353 << P.str() << A->getAsString(Args);
354 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000355 }
356 }
357
358 // Not translated, render as usual.
359 A->claim();
360 A->render(Args, CmdArgs);
361 }
362
363 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000364 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
365 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000366
367 // Add -Wp, and -Xassembler if using the preprocessor.
368
369 // FIXME: There is a very unfortunate problem here, some troubled
370 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
371 // really support that we would have to parse and then translate
372 // those options. :(
373 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
374 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000375
376 // -I- is a deprecated GCC feature, reject it.
377 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000378 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000379
380 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
381 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000382 StringRef sysroot = C.getSysRoot();
383 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000384 if (!Args.hasArg(options::OPT_isysroot)) {
385 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000386 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000387 }
388 }
Douglas Gregorf936f782011-09-14 20:28:46 +0000389
390 // If a module path was provided, pass it along. Otherwise, use a temporary
391 // directory.
392 if (Arg *A = Args.getLastArg(options::OPT_fmodule_cache_path)) {
Douglas Gregorf936f782011-09-14 20:28:46 +0000393 A->claim();
394 A->render(Args, CmdArgs);
395 } else {
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000396 SmallString<128> DefaultModuleCache;
Douglas Gregorf936f782011-09-14 20:28:46 +0000397 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
398 DefaultModuleCache);
399 llvm::sys::path::append(DefaultModuleCache, "clang-module-cache");
400 CmdArgs.push_back("-fmodule-cache-path");
401 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
402 }
Douglas Gregor97eec242011-09-15 22:00:41 +0000403
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000404 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000405 // FIXME: We should probably sink the logic for handling these from the
406 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000407 // CPATH - included following the user specified includes (but prior to
408 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000409 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000410 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000411 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000412 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000413 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000414 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000415 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000416 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000417 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000418
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000419 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000420 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000421 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000422
423 // Add system include arguments.
424 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000425}
426
Daniel Dunbarf492c922009-09-10 22:59:51 +0000427/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000428/// CPU.
429//
430// FIXME: This is redundant with -mcpu, why does LLVM use this.
431// FIXME: tblgen this, or kill it!
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000432static const char *getLLVMArchSuffixForARM(StringRef CPU) {
Chad Rosier9ac84512011-10-07 17:48:56 +0000433 return llvm::StringSwitch<const char *>(CPU)
434 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
435 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
436 .Cases("arm920", "arm920t", "arm922t", "v4t")
437 .Cases("arm940t", "ep9312","v4t")
438 .Cases("arm10tdmi", "arm1020t", "v5")
439 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
440 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
441 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
442 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
443 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
444 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
445 .Cases("cortex-a8", "cortex-a9", "v7")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000446 .Case("cortex-m3", "v7m")
Jim Grosbach903e63f2012-03-29 19:53:34 +0000447 .Case("cortex-m4", "v7m")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000448 .Case("cortex-m0", "v6m")
Chad Rosier9ac84512011-10-07 17:48:56 +0000449 .Default("");
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000450}
451
Benjamin Kramer09811c72012-06-26 22:20:06 +0000452/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
453//
454// FIXME: tblgen this.
455static std::string getARMTargetCPU(const ArgList &Args,
456 const llvm::Triple &Triple) {
457 // FIXME: Warn on inconsistent use of -mcpu and -march.
458
459 // If we have -mcpu=, use that.
460 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
461 StringRef MCPU = A->getValue(Args);
462 // Handle -mcpu=native.
463 if (MCPU == "native")
464 return llvm::sys::getHostCPUName();
465 else
466 return MCPU;
467 }
468
469 StringRef MArch;
470 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
471 // Otherwise, if we have -march= choose the base CPU for that arch.
472 MArch = A->getValue(Args);
473 } else {
474 // Otherwise, use the Arch from the triple.
475 MArch = Triple.getArchName();
476 }
477
478 // Handle -march=native.
479 std::string NativeMArch;
480 if (MArch == "native") {
481 std::string CPU = llvm::sys::getHostCPUName();
482 if (CPU != "generic") {
483 // Translate the native cpu into the architecture. The switch below will
484 // then chose the minimum cpu for that arch.
485 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
486 MArch = NativeMArch;
487 }
488 }
489
490 return llvm::StringSwitch<const char *>(MArch)
491 .Cases("armv2", "armv2a","arm2")
492 .Case("armv3", "arm6")
493 .Case("armv3m", "arm7m")
494 .Cases("armv4", "armv4t", "arm7tdmi")
495 .Cases("armv5", "armv5t", "arm10tdmi")
496 .Cases("armv5e", "armv5te", "arm1022e")
497 .Case("armv5tej", "arm926ej-s")
498 .Cases("armv6", "armv6k", "arm1136jf-s")
499 .Case("armv6j", "arm1136j-s")
500 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
501 .Case("armv6t2", "arm1156t2-s")
502 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
503 .Cases("armv7r", "armv7-r", "cortex-r4")
504 .Cases("armv7m", "armv7-m", "cortex-m3")
505 .Case("ep9312", "ep9312")
506 .Case("iwmmxt", "iwmmxt")
507 .Case("xscale", "xscale")
508 .Cases("armv6m", "armv6-m", "cortex-m0")
509 // If all else failed, return the most base CPU LLVM supports.
510 .Default("arm7tdmi");
511}
512
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000513// FIXME: Move to target hook.
514static bool isSignedCharDefault(const llvm::Triple &Triple) {
515 switch (Triple.getArch()) {
516 default:
517 return true;
518
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000519 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000520 case llvm::Triple::ppc:
521 case llvm::Triple::ppc64:
Bob Wilson6524dd32011-10-14 05:03:44 +0000522 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000523 return true;
524 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000525 }
526}
527
Chad Rosiercfbfc582012-04-04 20:51:35 +0000528// Handle -mfpu=.
529//
530// FIXME: Centralize feature selection, defaulting shouldn't be also in the
531// frontend target.
532static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
533 ArgStringList &CmdArgs) {
534 StringRef FPU = A->getValue(Args);
535
536 // Set the target features based on the FPU.
537 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
538 // Disable any default FPU support.
539 CmdArgs.push_back("-target-feature");
540 CmdArgs.push_back("-vfp2");
541 CmdArgs.push_back("-target-feature");
542 CmdArgs.push_back("-vfp3");
543 CmdArgs.push_back("-target-feature");
544 CmdArgs.push_back("-neon");
545 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
546 CmdArgs.push_back("-target-feature");
547 CmdArgs.push_back("+vfp3");
548 CmdArgs.push_back("-target-feature");
549 CmdArgs.push_back("+d16");
550 CmdArgs.push_back("-target-feature");
551 CmdArgs.push_back("-neon");
552 } else if (FPU == "vfp") {
553 CmdArgs.push_back("-target-feature");
554 CmdArgs.push_back("+vfp2");
555 CmdArgs.push_back("-target-feature");
556 CmdArgs.push_back("-neon");
557 } else if (FPU == "vfp3" || FPU == "vfpv3") {
558 CmdArgs.push_back("-target-feature");
559 CmdArgs.push_back("+vfp3");
560 CmdArgs.push_back("-target-feature");
561 CmdArgs.push_back("-neon");
562 } else if (FPU == "neon") {
563 CmdArgs.push_back("-target-feature");
564 CmdArgs.push_back("+neon");
565 } else
566 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
567}
568
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000569// Handle -mfpmath=.
570static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
Chad Rosier45619cb2012-04-04 22:13:40 +0000571 ArgStringList &CmdArgs, StringRef CPU) {
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000572 StringRef FPMath = A->getValue(Args);
573
574 // Set the target features based on the FPMath.
575 if (FPMath == "neon") {
576 CmdArgs.push_back("-target-feature");
577 CmdArgs.push_back("+neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000578
579 if (CPU != "cortex-a8" && CPU != "cortex-a9" && CPU != "cortex-a9-mp")
580 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
581
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000582 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
583 FPMath == "vfp4") {
584 CmdArgs.push_back("-target-feature");
585 CmdArgs.push_back("-neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000586
587 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000588 } else
589 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
590}
591
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000592// Select the float ABI as determined by -msoft-float, -mhard-float, and
593// -mfloat-abi=.
594static StringRef getARMFloatABI(const Driver &D,
595 const ArgList &Args,
596 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000597 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000598 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
599 options::OPT_mhard_float,
600 options::OPT_mfloat_abi_EQ)) {
601 if (A->getOption().matches(options::OPT_msoft_float))
602 FloatABI = "soft";
603 else if (A->getOption().matches(options::OPT_mhard_float))
604 FloatABI = "hard";
605 else {
606 FloatABI = A->getValue(Args);
607 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000608 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000609 << A->getAsString(Args);
610 FloatABI = "soft";
611 }
612 }
613 }
614
615 // If unspecified, choose the default based on the platform.
616 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000617 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000618 case llvm::Triple::Darwin:
619 case llvm::Triple::MacOSX:
620 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000621 // Darwin defaults to "softfp" for v6 and v7.
622 //
623 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000624 std::string ArchName =
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000625 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000626 if (StringRef(ArchName).startswith("v6") ||
627 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000628 FloatABI = "softfp";
629 else
630 FloatABI = "soft";
631 break;
632 }
633
634 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000635 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000636 case llvm::Triple::GNUEABIHF:
637 FloatABI = "hard";
638 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000639 case llvm::Triple::GNUEABI:
640 FloatABI = "softfp";
641 break;
642 case llvm::Triple::EABI:
643 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
644 FloatABI = "softfp";
645 break;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000646 case llvm::Triple::ANDROIDEABI: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000647 std::string ArchName =
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000648 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000649 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000650 FloatABI = "softfp";
651 else
652 FloatABI = "soft";
653 break;
654 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000655 default:
656 // Assume "soft", but warn the user we are guessing.
657 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000658 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000659 break;
660 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000661 }
662 }
663
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000664 return FloatABI;
665}
666
667
668void Clang::AddARMTargetArgs(const ArgList &Args,
669 ArgStringList &CmdArgs,
670 bool KernelOrKext) const {
671 const Driver &D = getToolChain().getDriver();
672 llvm::Triple Triple = getToolChain().getTriple();
673
674 // Select the ABI to use.
675 //
676 // FIXME: Support -meabi.
677 const char *ABIName = 0;
678 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
679 ABIName = A->getValue(Args);
680 } else {
681 // Select the default based on the platform.
682 switch(Triple.getEnvironment()) {
683 case llvm::Triple::ANDROIDEABI:
684 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000685 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000686 ABIName = "aapcs-linux";
687 break;
688 case llvm::Triple::EABI:
689 ABIName = "aapcs";
690 break;
691 default:
692 ABIName = "apcs-gnu";
693 }
694 }
695 CmdArgs.push_back("-target-abi");
696 CmdArgs.push_back(ABIName);
697
698 // Set the CPU based on -march= and -mcpu=.
699 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +0000700 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000701
702 // Determine floating point ABI from the options & target defaults.
703 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000704 if (FloatABI == "soft") {
705 // Floating point operations and argument passing are soft.
706 //
707 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000708 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000709 CmdArgs.push_back("-mfloat-abi");
710 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000711 } else if (FloatABI == "softfp") {
712 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000713 CmdArgs.push_back("-mfloat-abi");
714 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000715 } else {
716 // Floating point operations and argument passing are hard.
717 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000718 CmdArgs.push_back("-mfloat-abi");
719 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000720 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000721
722 // Set appropriate target features for floating point mode.
723 //
724 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
725 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
726 // stripped out by the ARM target.
727
728 // Use software floating point operations?
729 if (FloatABI == "soft") {
730 CmdArgs.push_back("-target-feature");
731 CmdArgs.push_back("+soft-float");
732 }
733
734 // Use software floating point argument passing?
735 if (FloatABI != "hard") {
736 CmdArgs.push_back("-target-feature");
737 CmdArgs.push_back("+soft-float-abi");
738 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +0000739
740 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +0000741 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +0000742 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000743
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000744 // Honor -mfpmath=.
745 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +0000746 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000747
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000748 // Setting -msoft-float effectively disables NEON because of the GCC
749 // implementation, although the same isn't true of VFP or VFP3.
750 if (FloatABI == "soft") {
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000751 CmdArgs.push_back("-target-feature");
752 CmdArgs.push_back("-neon");
753 }
754
755 // Kernel code has more strict alignment requirements.
756 if (KernelOrKext) {
Daniel Dunbar12100e22011-03-22 16:48:17 +0000757 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000758 CmdArgs.push_back("-arm-long-calls");
759
Daniel Dunbar12100e22011-03-22 16:48:17 +0000760 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000761 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000762
763 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000764 CmdArgs.push_back("-backend-option");
765 CmdArgs.push_back("-arm-darwin-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000766 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000767
768 // Setting -mno-global-merge disables the codegen global merge pass. Setting
769 // -mglobal-merge has no effect as the pass is enabled by default.
770 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
771 options::OPT_mno_global_merge)) {
772 if (A->getOption().matches(options::OPT_mno_global_merge))
773 CmdArgs.push_back("-mno-global-merge");
774 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000775
Chad Rosierc14ded72012-05-16 21:19:55 +0000776 if (Args.hasArg(options::OPT_mno_implicit_float))
Chad Rosierf1985d22012-05-16 20:40:09 +0000777 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000778}
779
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000780// Get default architecture.
781static const char* getMipsArchFromCPU(StringRef CPUName) {
Akira Hatanakaa21f5da2011-11-29 23:09:24 +0000782 if (CPUName == "mips32" || CPUName == "mips32r2")
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000783 return "mips";
784
Akira Hatanakaa21f5da2011-11-29 23:09:24 +0000785 assert((CPUName == "mips64" || CPUName == "mips64r2") &&
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000786 "Unexpected cpu name.");
787
788 return "mips64";
789}
790
Akira Hatanaka5e9dde32011-11-30 19:31:38 +0000791// Check that ArchName is a known Mips architecture name.
792static bool checkMipsArchName(StringRef ArchName) {
793 return ArchName == "mips" ||
794 ArchName == "mipsel" ||
795 ArchName == "mips64" ||
796 ArchName == "mips64el";
797}
798
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000799// Get default target cpu.
Akira Hatanaka5e9dde32011-11-30 19:31:38 +0000800static const char* getMipsCPUFromArch(StringRef ArchName) {
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000801 if (ArchName == "mips" || ArchName == "mipsel")
Akira Hatanakaa21f5da2011-11-29 23:09:24 +0000802 return "mips32";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000803
Akira Hatanaka5e9dde32011-11-30 19:31:38 +0000804 assert((ArchName == "mips64" || ArchName == "mips64el") &&
805 "Unexpected arch name.");
806
807 return "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000808}
809
810// Get default ABI.
811static const char* getMipsABIFromArch(StringRef ArchName) {
812 if (ArchName == "mips" || ArchName == "mipsel")
813 return "o32";
814
815 assert((ArchName == "mips64" || ArchName == "mips64el") &&
816 "Unexpected arch name.");
817 return "n64";
818}
819
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000820// Get CPU and ABI names. They are not independent
821// so we have to calculate them together.
822static void getMipsCPUAndABI(const ArgList &Args,
823 const ToolChain &TC,
824 StringRef &CPUName,
825 StringRef &ABIName) {
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000826 StringRef ArchName;
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000827
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000828 // Select target cpu and architecture.
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000829 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
830 CPUName = A->getValue(Args);
831 ArchName = getMipsArchFromCPU(CPUName);
832 }
833 else {
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000834 ArchName = Args.MakeArgString(TC.getArchName());
Akira Hatanaka5e9dde32011-11-30 19:31:38 +0000835 if (!checkMipsArchName(ArchName))
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000836 TC.getDriver().Diag(diag::err_drv_invalid_arch_name) << ArchName;
Akira Hatanaka5e9dde32011-11-30 19:31:38 +0000837 else
838 CPUName = getMipsCPUFromArch(ArchName);
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000839 }
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000840
Eric Christopher0b26a612010-03-02 02:41:08 +0000841 // Select the ABI to use.
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000842 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
Eric Christopher0b26a612010-03-02 02:41:08 +0000843 ABIName = A->getValue(Args);
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000844 else
845 ABIName = getMipsABIFromArch(ArchName);
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000846}
847
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000848// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
849// and -mfloat-abi=.
850static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000851 // Select the float ABI as determined by -msoft-float, -mhard-float,
852 // and -mfloat-abi=.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000853 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000854 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000855 options::OPT_mhard_float,
856 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000857 if (A->getOption().matches(options::OPT_msoft_float))
858 FloatABI = "soft";
859 else if (A->getOption().matches(options::OPT_mhard_float))
860 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000861 else {
862 FloatABI = A->getValue(Args);
863 if (FloatABI != "soft" && FloatABI != "single" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000864 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000865 FloatABI = "hard";
866 }
867 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000868 }
869
870 // If unspecified, choose the default based on the platform.
871 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000872 // Assume "hard", because it's a default value used by gcc.
873 // When we start to recognize specific target MIPS processors,
874 // we will be able to select the default more correctly.
875 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000876 }
877
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000878 return FloatABI;
879}
880
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000881static void AddTargetFeature(const ArgList &Args,
882 ArgStringList &CmdArgs,
883 OptSpecifier OnOpt,
884 OptSpecifier OffOpt,
885 StringRef FeatureName) {
886 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
887 CmdArgs.push_back("-target-feature");
888 if (A->getOption().matches(OnOpt))
889 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
890 else
891 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
892 }
893}
894
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000895void Clang::AddMIPSTargetArgs(const ArgList &Args,
896 ArgStringList &CmdArgs) const {
897 const Driver &D = getToolChain().getDriver();
898 StringRef CPUName;
899 StringRef ABIName;
900 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
901
902 CmdArgs.push_back("-target-cpu");
903 CmdArgs.push_back(CPUName.data());
904
905 CmdArgs.push_back("-target-abi");
906 CmdArgs.push_back(ABIName.data());
907
908 StringRef FloatABI = getMipsFloatABI(D, Args);
909
Eric Christopher0b26a612010-03-02 02:41:08 +0000910 if (FloatABI == "soft") {
911 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +0000912 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000913 CmdArgs.push_back("-mfloat-abi");
914 CmdArgs.push_back("soft");
915
916 // FIXME: Note, this is a hack. We need to pass the selected float
917 // mode to the MipsTargetInfoBase to define appropriate macros there.
918 // Now it is the only method.
919 CmdArgs.push_back("-target-feature");
920 CmdArgs.push_back("+soft-float");
921 }
922 else if (FloatABI == "single") {
923 // Restrict the use of hardware floating-point
924 // instructions to 32-bit operations.
925 CmdArgs.push_back("-target-feature");
926 CmdArgs.push_back("+single-float");
927 }
928 else {
929 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +0000930 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000931 CmdArgs.push_back("-mfloat-abi");
932 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +0000933 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +0000934
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000935 AddTargetFeature(Args, CmdArgs,
936 options::OPT_mips16, options::OPT_mno_mips16,
937 "mips16");
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +0000938 AddTargetFeature(Args, CmdArgs,
939 options::OPT_mdsp, options::OPT_mno_dsp,
940 "dsp");
941 AddTargetFeature(Args, CmdArgs,
942 options::OPT_mdspr2, options::OPT_mno_dspr2,
943 "dspr2");
Simon Atanasyanec4b1c12012-08-27 20:55:56 +0000944
945 if (Arg *A = Args.getLastArg(options::OPT_G)) {
946 StringRef v = A->getValue(Args);
947 CmdArgs.push_back("-mllvm");
948 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
949 A->claim();
950 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000951}
952
Hal Finkel8eb59282012-06-11 22:35:19 +0000953/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
954static std::string getPPCTargetCPU(const ArgList &Args) {
955 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
956 StringRef CPUName = A->getValue(Args);
957
958 if (CPUName == "native") {
959 std::string CPU = llvm::sys::getHostCPUName();
960 if (!CPU.empty() && CPU != "generic")
961 return CPU;
962 else
963 return "";
964 }
965
966 return llvm::StringSwitch<const char *>(CPUName)
967 .Case("common", "generic")
968 .Case("440", "440")
969 .Case("440fp", "440")
970 .Case("450", "450")
971 .Case("601", "601")
972 .Case("602", "602")
973 .Case("603", "603")
974 .Case("603e", "603e")
975 .Case("603ev", "603ev")
976 .Case("604", "604")
977 .Case("604e", "604e")
978 .Case("620", "620")
979 .Case("G3", "g3")
980 .Case("7400", "7400")
981 .Case("G4", "g4")
982 .Case("7450", "7450")
983 .Case("G4+", "g4+")
984 .Case("750", "750")
985 .Case("970", "970")
986 .Case("G5", "g5")
987 .Case("a2", "a2")
988 .Case("power6", "pwr6")
989 .Case("power7", "pwr7")
990 .Case("powerpc", "ppc")
991 .Case("powerpc64", "ppc64")
992 .Default("");
993 }
994
995 return "";
996}
997
998void Clang::AddPPCTargetArgs(const ArgList &Args,
999 ArgStringList &CmdArgs) const {
1000 std::string TargetCPUName = getPPCTargetCPU(Args);
1001
1002 // LLVM may default to generating code for the native CPU,
1003 // but, like gcc, we default to a more generic option for
1004 // each architecture. (except on Darwin)
1005 llvm::Triple Triple = getToolChain().getTriple();
1006 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1007 if (Triple.getArch() == llvm::Triple::ppc64)
1008 TargetCPUName = "ppc64";
1009 else
1010 TargetCPUName = "ppc";
1011 }
1012
1013 if (!TargetCPUName.empty()) {
1014 CmdArgs.push_back("-target-cpu");
1015 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1016 }
1017}
1018
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001019void Clang::AddSparcTargetArgs(const ArgList &Args,
1020 ArgStringList &CmdArgs) const {
1021 const Driver &D = getToolChain().getDriver();
1022
1023 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001024 CmdArgs.push_back("-target-cpu");
Benjamin Kramereed4f2a2011-12-26 14:18:37 +00001025 CmdArgs.push_back(A->getValue(Args));
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001026 }
1027
1028 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001029 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001030 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1031 options::OPT_mhard_float)) {
1032 if (A->getOption().matches(options::OPT_msoft_float))
1033 FloatABI = "soft";
1034 else if (A->getOption().matches(options::OPT_mhard_float))
1035 FloatABI = "hard";
1036 }
1037
1038 // If unspecified, choose the default based on the platform.
1039 if (FloatABI.empty()) {
1040 switch (getToolChain().getTriple().getOS()) {
1041 default:
1042 // Assume "soft", but warn the user we are guessing.
1043 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001044 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001045 break;
1046 }
1047 }
1048
1049 if (FloatABI == "soft") {
1050 // Floating point operations and argument passing are soft.
1051 //
1052 // FIXME: This changes CPP defines, we need -target-soft-float.
1053 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001054 CmdArgs.push_back("-target-feature");
1055 CmdArgs.push_back("+soft-float");
1056 } else {
1057 assert(FloatABI == "hard" && "Invalid float abi!");
1058 CmdArgs.push_back("-mhard-float");
1059 }
1060}
1061
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001062void Clang::AddX86TargetArgs(const ArgList &Args,
1063 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001064 if (!Args.hasFlag(options::OPT_mred_zone,
1065 options::OPT_mno_red_zone,
1066 true) ||
1067 Args.hasArg(options::OPT_mkernel) ||
1068 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001069 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001070
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001071 if (Args.hasFlag(options::OPT_msoft_float,
1072 options::OPT_mno_soft_float,
1073 false))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001074 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001075
Daniel Dunbare13ada62009-11-14 22:04:54 +00001076 const char *CPUName = 0;
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001077 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001078 if (StringRef(A->getValue(Args)) == "native") {
Daniel Dunbare13ada62009-11-14 22:04:54 +00001079 // FIXME: Reject attempts to use -march=native unless the target matches
1080 // the host.
1081 //
1082 // FIXME: We should also incorporate the detected target features for use
1083 // with -native.
1084 std::string CPU = llvm::sys::getHostCPUName();
Bob Wilsone78227b2012-05-09 17:53:10 +00001085 if (!CPU.empty() && CPU != "generic")
Daniel Dunbare13ada62009-11-14 22:04:54 +00001086 CPUName = Args.MakeArgString(CPU);
1087 } else
1088 CPUName = A->getValue(Args);
1089 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001090
Daniel Dunbare13ada62009-11-14 22:04:54 +00001091 // Select the default CPU if none was given (or detection failed).
1092 if (!CPUName) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001093 // FIXME: Need target hooks.
Bob Wilson6524dd32011-10-14 05:03:44 +00001094 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001095 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001096 CPUName = "core2";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001097 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001098 CPUName = "yonah";
Chris Lattnerb986aba2010-04-11 19:29:39 +00001099 } else if (getToolChain().getOS().startswith("haiku")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001100 if (getToolChain().getArch() == llvm::Triple::x86_64)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001101 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001102 else if (getToolChain().getArch() == llvm::Triple::x86)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001103 CPUName = "i586";
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001104 } else if (getToolChain().getOS().startswith("openbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001105 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001106 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001107 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001108 CPUName = "i486";
Eli Friedman9fa28852012-08-08 23:57:20 +00001109 } else if (getToolChain().getOS().startswith("bitrig")) {
1110 if (getToolChain().getArch() == llvm::Triple::x86_64)
1111 CPUName = "x86-64";
1112 else if (getToolChain().getArch() == llvm::Triple::x86)
1113 CPUName = "i686";
Roman Divacky432f10d2011-03-01 18:11:37 +00001114 } else if (getToolChain().getOS().startswith("freebsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001115 if (getToolChain().getArch() == llvm::Triple::x86_64)
Roman Divacky432f10d2011-03-01 18:11:37 +00001116 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001117 else if (getToolChain().getArch() == llvm::Triple::x86)
Roman Divacky432f10d2011-03-01 18:11:37 +00001118 CPUName = "i486";
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001119 } else if (getToolChain().getOS().startswith("netbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001120 if (getToolChain().getArch() == llvm::Triple::x86_64)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001121 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001122 else if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001123 CPUName = "i486";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001124 } else {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001125 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001126 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001127 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001128 CPUName = "pentium4";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001129 }
1130 }
1131
Daniel Dunbare13ada62009-11-14 22:04:54 +00001132 if (CPUName) {
Daniel Dunbara7d02312009-12-18 06:30:12 +00001133 CmdArgs.push_back("-target-cpu");
Daniel Dunbare13ada62009-11-14 22:04:54 +00001134 CmdArgs.push_back(CPUName);
1135 }
1136
Eli Friedmanad811f02011-07-02 00:34:19 +00001137 // The required algorithm here is slightly strange: the options are applied
1138 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1139 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1140 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1141 // former correctly, but not the latter; handle directly-overridden
1142 // attributes here.
1143 llvm::StringMap<unsigned> PrevFeature;
1144 std::vector<const char*> Features;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001145 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1146 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001147 StringRef Name = (*it)->getOption().getName();
Daniel Dunbara442fd52010-06-11 22:00:13 +00001148 (*it)->claim();
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001149
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001150 // Skip over "-m".
1151 assert(Name.startswith("-m") && "Invalid feature name.");
1152 Name = Name.substr(2);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001153
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001154 bool IsNegative = Name.startswith("no-");
1155 if (IsNegative)
1156 Name = Name.substr(3);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001157
Eli Friedmanad811f02011-07-02 00:34:19 +00001158 unsigned& Prev = PrevFeature[Name];
1159 if (Prev)
1160 Features[Prev - 1] = 0;
1161 Prev = Features.size() + 1;
1162 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1163 }
1164 for (unsigned i = 0; i < Features.size(); i++) {
1165 if (Features[i]) {
1166 CmdArgs.push_back("-target-feature");
1167 CmdArgs.push_back(Features[i]);
1168 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001169 }
1170}
1171
Tony Linthicum76329bf2011-12-12 21:14:55 +00001172static Arg* getLastHexagonArchArg (const ArgList &Args)
1173{
1174 Arg * A = NULL;
1175
Sebastian Pop86500282012-01-13 20:37:10 +00001176 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
1177 it != ie; ++it) {
1178 if ((*it)->getOption().matches(options::OPT_march_EQ) ||
Tony Linthicum76329bf2011-12-12 21:14:55 +00001179 (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
1180 A = *it;
1181 A->claim();
1182 }
Sebastian Pop86500282012-01-13 20:37:10 +00001183 else if ((*it)->getOption().matches(options::OPT_m_Joined)){
1184 StringRef Value = (*it)->getValue(Args,0);
1185 if (Value.startswith("v")) {
1186 A = *it;
1187 A->claim();
1188 }
1189 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001190 }
1191 return A;
1192}
1193
Sebastian Pop86500282012-01-13 20:37:10 +00001194static StringRef getHexagonTargetCPU(const ArgList &Args)
Tony Linthicum76329bf2011-12-12 21:14:55 +00001195{
1196 Arg *A;
1197 llvm::StringRef WhichHexagon;
1198
Sebastian Pop86500282012-01-13 20:37:10 +00001199 // Select the default CPU (v4) if none was given or detection failed.
Tony Linthicum76329bf2011-12-12 21:14:55 +00001200 if ((A = getLastHexagonArchArg (Args))) {
Sebastian Pop86500282012-01-13 20:37:10 +00001201 WhichHexagon = A->getValue(Args);
1202 if (WhichHexagon == "")
1203 return "v4";
1204 else
1205 return WhichHexagon;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001206 }
Sebastian Pop86500282012-01-13 20:37:10 +00001207 else
1208 return "v4";
Tony Linthicum76329bf2011-12-12 21:14:55 +00001209}
1210
1211void Clang::AddHexagonTargetArgs(const ArgList &Args,
1212 ArgStringList &CmdArgs) const {
1213 llvm::Triple Triple = getToolChain().getTriple();
1214
1215 CmdArgs.push_back("-target-cpu");
Sebastian Pop86500282012-01-13 20:37:10 +00001216 CmdArgs.push_back(Args.MakeArgString("hexagon" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001217 CmdArgs.push_back("-fno-signed-char");
1218 CmdArgs.push_back("-nobuiltininc");
1219
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001220 if (Args.hasArg(options::OPT_mqdsp6_compat))
Tony Linthicum76329bf2011-12-12 21:14:55 +00001221 CmdArgs.push_back("-mqdsp6-compat");
1222
1223 if (Arg *A = Args.getLastArg(options::OPT_G,
1224 options::OPT_msmall_data_threshold_EQ)) {
1225 std::string SmallDataThreshold="-small-data-threshold=";
1226 SmallDataThreshold += A->getValue(Args);
1227 CmdArgs.push_back ("-mllvm");
1228 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
1229 A->claim();
1230 }
1231
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001232 if (!Args.hasArg(options::OPT_fno_short_enums))
1233 CmdArgs.push_back("-fshort-enums");
1234 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1235 CmdArgs.push_back ("-mllvm");
1236 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1237 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001238 CmdArgs.push_back ("-mllvm");
1239 CmdArgs.push_back ("-machine-sink-split=0");
1240}
1241
Eric Christopher84fbdb42011-08-19 00:30:14 +00001242static bool
John McCall5fb5df92012-06-20 06:18:46 +00001243shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001244 const llvm::Triple &Triple) {
1245 // We use the zero-cost exception tables for Objective-C if the non-fragile
1246 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1247 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001248 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001249 return true;
1250
Bob Wilson6524dd32011-10-14 05:03:44 +00001251 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001252 return false;
1253
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001254 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001255 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001256 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001257}
1258
Anders Carlssone96ab552011-02-28 02:27:16 +00001259/// addExceptionArgs - Adds exception related arguments to the driver command
1260/// arguments. There's a master flag, -fexceptions and also language specific
1261/// flags to enable/disable C++ and Objective-C exceptions.
1262/// This makes it possible to for example disable C++ exceptions but enable
1263/// Objective-C exceptions.
1264static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1265 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001266 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001267 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001268 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001269 if (KernelOrKext) {
1270 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1271 // arguments now to avoid warnings about unused arguments.
1272 Args.ClaimAllArgs(options::OPT_fexceptions);
1273 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1274 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1275 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1276 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1277 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001278 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001279 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001280
1281 // Exceptions are enabled by default.
1282 bool ExceptionsEnabled = true;
1283
1284 // This keeps track of whether exceptions were explicitly turned on or off.
1285 bool DidHaveExplicitExceptionFlag = false;
1286
Rafael Espindola00a66572009-10-01 13:33:33 +00001287 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1288 options::OPT_fno_exceptions)) {
1289 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001290 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001291 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001292 ExceptionsEnabled = false;
1293
1294 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001295 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001296
Anders Carlssone96ab552011-02-28 02:27:16 +00001297 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001298
Anders Carlssone96ab552011-02-28 02:27:16 +00001299 // Exception tables and cleanups can be enabled with -fexceptions even if the
1300 // language itself doesn't support exceptions.
1301 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1302 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001303
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001304 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1305 // is not necessarily sensible, but follows GCC.
1306 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001307 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001308 options::OPT_fno_objc_exceptions,
1309 true)) {
1310 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001311
Eric Christopher84fbdb42011-08-19 00:30:14 +00001312 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001313 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001314 }
1315
1316 if (types::isCXX(InputType)) {
1317 bool CXXExceptionsEnabled = ExceptionsEnabled;
1318
Eric Christopher84fbdb42011-08-19 00:30:14 +00001319 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1320 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001321 options::OPT_fexceptions,
1322 options::OPT_fno_exceptions)) {
1323 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1324 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001325 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001326 CXXExceptionsEnabled = false;
1327 }
1328
1329 if (CXXExceptionsEnabled) {
1330 CmdArgs.push_back("-fcxx-exceptions");
1331
1332 ShouldUseExceptionTables = true;
1333 }
1334 }
1335
1336 if (ShouldUseExceptionTables)
1337 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001338}
1339
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001340static bool ShouldDisableCFI(const ArgList &Args,
1341 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001342 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001343 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001344 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001345 // we disable them if we think the .s file will be passed to it.
Rafael Espindolac41db922012-03-08 14:39:55 +00001346 Default = Args.hasFlag(options::OPT_integrated_as,
1347 options::OPT_no_integrated_as,
1348 TC.IsIntegratedAssemblerDefault());
Rafael Espindolaf934f982011-05-17 16:26:17 +00001349 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001350 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
1351 options::OPT_fno_dwarf2_cfi_asm,
1352 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001353}
1354
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001355static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1356 const ToolChain &TC) {
1357 bool IsIADefault = TC.IsIntegratedAssemblerDefault();
1358 bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
1359 options::OPT_no_integrated_as,
1360 IsIADefault);
1361 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1362 options::OPT_fno_dwarf_directory_asm,
1363 UseIntegratedAs);
1364 return !UseDwarfDirectory;
1365}
1366
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001367/// \brief Check whether the given input tree contains any compilation actions.
1368static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001369 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001370 return true;
1371
1372 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1373 if (ContainsCompileAction(*it))
1374 return true;
1375
1376 return false;
1377}
1378
1379/// \brief Check if -relax-all should be passed to the internal assembler.
1380/// This is done by default when compiling non-assembler source with -O0.
1381static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1382 bool RelaxDefault = true;
1383
1384 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1385 RelaxDefault = A->getOption().matches(options::OPT_O0);
1386
1387 if (RelaxDefault) {
1388 RelaxDefault = false;
1389 for (ActionList::const_iterator it = C.getActions().begin(),
1390 ie = C.getActions().end(); it != ie; ++it) {
1391 if (ContainsCompileAction(*it)) {
1392 RelaxDefault = true;
1393 break;
1394 }
1395 }
1396 }
1397
1398 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1399 RelaxDefault);
1400}
1401
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001402/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1403/// This needs to be called before we add the C run-time (malloc, etc).
1404static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001405 ArgStringList &CmdArgs) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001406 if (!Args.hasFlag(options::OPT_faddress_sanitizer,
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001407 options::OPT_fno_address_sanitizer, false))
1408 return;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001409 if(TC.getTriple().getEnvironment() == llvm::Triple::ANDROIDEABI) {
1410 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanovea155f02012-06-04 11:15:05 +00001411 if (!Args.hasArg(options::OPT_pie))
1412 TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001413 // For an executable, we add a .preinit_array stub.
1414 CmdArgs.push_back("-u");
1415 CmdArgs.push_back("__asan_preinit");
1416 CmdArgs.push_back("-lasan");
1417 }
Daniel Dunbar3ca41d42011-12-07 23:22:17 +00001418
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001419 CmdArgs.push_back("-lasan_preload");
1420 CmdArgs.push_back("-ldl");
1421 } else {
1422 if (!Args.hasArg(options::OPT_shared)) {
1423 // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
1424 // resource directory.
1425 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1426 llvm::sys::path::append(LibAsan, "lib", "linux",
1427 (Twine("libclang_rt.asan-") +
1428 TC.getArchName() + ".a"));
1429 CmdArgs.push_back(Args.MakeArgString(LibAsan));
1430 CmdArgs.push_back("-lpthread");
1431 CmdArgs.push_back("-ldl");
1432 CmdArgs.push_back("-export-dynamic");
1433 }
1434 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001435}
1436
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001437/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1438/// This needs to be called before we add the C run-time (malloc, etc).
1439static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1440 ArgStringList &CmdArgs) {
1441 if (!Args.hasFlag(options::OPT_fthread_sanitizer,
1442 options::OPT_fno_thread_sanitizer, false))
1443 return;
1444 if (!Args.hasArg(options::OPT_shared)) {
1445 // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library
1446 // resource directory.
1447 SmallString<128> LibTsan(TC.getDriver().ResourceDir);
1448 llvm::sys::path::append(LibTsan, "lib", "linux",
1449 (Twine("libclang_rt.tsan-") +
1450 TC.getArchName() + ".a"));
1451 CmdArgs.push_back(Args.MakeArgString(LibTsan));
1452 CmdArgs.push_back("-lpthread");
1453 CmdArgs.push_back("-ldl");
1454 CmdArgs.push_back("-export-dynamic");
1455 }
1456}
1457
Rafael Espindola224dd632011-12-14 21:02:23 +00001458static bool shouldUseFramePointer(const ArgList &Args,
1459 const llvm::Triple &Triple) {
1460 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1461 options::OPT_fomit_frame_pointer))
1462 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1463
Rafael Espindola00b29182011-12-14 21:50:24 +00001464 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001465 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1466 Triple.getArch() == llvm::Triple::x86) &&
1467 Triple.getOS() == llvm::Triple::Linux) {
1468 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1469 if (!A->getOption().matches(options::OPT_O0))
1470 return false;
1471 }
1472
1473 return true;
1474}
1475
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001476void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001477 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001478 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001479 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001480 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001481 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1482 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001483 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001484 ArgStringList CmdArgs;
1485
Daniel Dunbare521a892009-03-31 20:53:55 +00001486 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1487
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001488 // Invoke ourselves in -cc1 mode.
1489 //
1490 // FIXME: Implement custom jobs for internal actions.
1491 CmdArgs.push_back("-cc1");
1492
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001493 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001494 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001495 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001496 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001497
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001498 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001499 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001500
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001501 if (isa<AnalyzeJobAction>(JA)) {
1502 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1503 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001504 } else if (isa<MigrateJobAction>(JA)) {
1505 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001506 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001507 if (Output.getType() == types::TY_Dependencies)
1508 CmdArgs.push_back("-Eonly");
1509 else
1510 CmdArgs.push_back("-E");
Daniel Dunbarc4343942010-02-03 03:07:56 +00001511 } else if (isa<AssembleJobAction>(JA)) {
1512 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001513
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001514 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001515 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001516
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001517 // When using an integrated assembler, translate -Wa, and -Xassembler
1518 // options.
1519 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1520 options::OPT_Xassembler),
1521 ie = Args.filtered_end(); it != ie; ++it) {
1522 const Arg *A = *it;
1523 A->claim();
1524
1525 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001526 StringRef Value = A->getValue(Args, i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001527
1528 if (Value == "-force_cpusubtype_ALL") {
1529 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001530 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001531 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001532 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001533 CmdArgs.push_back("-mllvm");
1534 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001535 } else if (Value == "--noexecstack") {
1536 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001537 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001538 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001539 << A->getOption().getName() << Value;
1540 }
1541 }
1542 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001543
1544 // Also ignore explicit -force_cpusubtype_ALL option.
1545 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001546 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001547 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001548 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001549
Aaron Ballman1f10cc52012-07-31 01:21:00 +00001550 if (JA.getType() == types::TY_Nothing)
1551 CmdArgs.push_back("-fsyntax-only");
1552 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001553 CmdArgs.push_back("-emit-pch");
1554 else
1555 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001556 } else {
1557 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001558
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001559 if (JA.getType() == types::TY_Nothing) {
1560 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001561 } else if (JA.getType() == types::TY_LLVM_IR ||
1562 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001563 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001564 } else if (JA.getType() == types::TY_LLVM_BC ||
1565 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001566 CmdArgs.push_back("-emit-llvm-bc");
1567 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00001568 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00001569 } else if (JA.getType() == types::TY_AST) {
1570 CmdArgs.push_back("-emit-pch");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001571 } else if (JA.getType() == types::TY_RewrittenObjC) {
1572 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001573 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00001574 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1575 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001576 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001577 } else {
1578 assert(JA.getType() == types::TY_PP_Asm &&
1579 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001580 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00001581 }
1582
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001583 // The make clang go fast button.
1584 CmdArgs.push_back("-disable-free");
1585
John McCallbb79b5f2010-02-13 03:50:24 +00001586 // Disable the verification pass in -asserts builds.
1587#ifdef NDEBUG
1588 CmdArgs.push_back("-disable-llvm-verifier");
1589#endif
1590
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001591 // Set the main file name, so that debug info works even with
1592 // -save-temps.
1593 CmdArgs.push_back("-main-file-name");
1594 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1595
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001596 // Some flags which affect the language (via preprocessor
1597 // defines). See darwin::CC1::AddCPPArgs.
1598 if (Args.hasArg(options::OPT_static))
1599 CmdArgs.push_back("-static-define");
1600
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001601 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00001602 // Enable region store model by default.
1603 CmdArgs.push_back("-analyzer-store=region");
1604
Ted Kremenek7bea9a12009-12-07 22:26:14 +00001605 // Treat blocks as analysis entry points.
1606 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1607
Ted Kremenek49c79792011-03-24 00:28:47 +00001608 CmdArgs.push_back("-analyzer-eagerly-assume");
1609
Anna Zaks0af3e062012-03-08 23:16:35 +00001610 CmdArgs.push_back("-analyzer-ipa=inlining");
Anna Zaksd5c30272012-03-01 22:37:46 +00001611
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001612 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001613 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001614 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00001615
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001616 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1617 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00001618
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001619 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00001620 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00001621
1622 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00001623
1624 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00001625 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1626 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1627 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1628 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1629 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1630 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001631 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001632
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001633 // Set the output format. The default is plist, for (lame) historical
1634 // reasons.
1635 CmdArgs.push_back("-analyzer-output");
1636 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
1637 CmdArgs.push_back(A->getValue(Args));
1638 else
1639 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001640
Ted Kremenekfe449a22010-03-22 22:32:05 +00001641 // Disable the presentation of standard compiler warnings when
1642 // using --analyze. We only want to show static analyzer diagnostics
1643 // or frontend errors.
1644 CmdArgs.push_back("-w");
1645
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001646 // Add -Xanalyzer arguments when running as analyzer.
1647 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00001648 }
1649
Daniel Dunbar4eadb602009-09-10 01:21:12 +00001650 CheckCodeGenerationOptions(D, Args);
1651
Daniel Dunbar44e71222009-04-29 18:32:25 +00001652 // Perform argument translation for LLVM backend. This
1653 // takes some care in reconciling with llvm-gcc. The
1654 // issue is that llvm-gcc translates these options based on
1655 // the values in cc1, whereas we are processing based on
1656 // the driver arguments.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001657
Daniel Dunbar44e71222009-04-29 18:32:25 +00001658 // This comes from the default translation the driver + cc1
1659 // would do to enable flag_pic.
Simon Atanasyana16b7fd2012-05-29 18:50:33 +00001660
1661 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1662 options::OPT_fpic, options::OPT_fno_pic,
1663 options::OPT_fPIE, options::OPT_fno_PIE,
1664 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruthc0c04552012-04-08 16:40:35 +00001665 bool PICDisabled = false;
1666 bool PICEnabled = false;
1667 bool PICForPIE = false;
1668 if (LastPICArg) {
1669 PICForPIE = (LastPICArg->getOption().matches(options::OPT_fPIE) ||
1670 LastPICArg->getOption().matches(options::OPT_fpie));
1671 PICEnabled = (PICForPIE ||
1672 LastPICArg->getOption().matches(options::OPT_fPIC) ||
1673 LastPICArg->getOption().matches(options::OPT_fpic));
1674 PICDisabled = !PICEnabled;
1675 }
1676 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1677 // PIC or PIE options above, if these show up, PIC is disabled.
1678 if (Args.hasArg(options::OPT_mkernel))
1679 PICDisabled = true;
1680 if (Args.hasArg(options::OPT_static))
1681 PICDisabled = true;
1682 bool DynamicNoPIC = Args.hasArg(options::OPT_mdynamic_no_pic);
1683
1684 // Select the relocation model.
Daniel Dunbar44e71222009-04-29 18:32:25 +00001685 const char *Model = getToolChain().GetForcedPicModel();
1686 if (!Model) {
Chandler Carruthc0c04552012-04-08 16:40:35 +00001687 if (DynamicNoPIC)
Daniel Dunbar44e71222009-04-29 18:32:25 +00001688 Model = "dynamic-no-pic";
1689 else if (PICDisabled)
1690 Model = "static";
1691 else if (PICEnabled)
1692 Model = "pic";
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001693 else
Daniel Dunbar44e71222009-04-29 18:32:25 +00001694 Model = getToolChain().GetDefaultRelocationModel();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001695 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001696 StringRef ModelStr = Model ? Model : "";
1697 if (Model && ModelStr != "pic") {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001698 CmdArgs.push_back("-mrelocation-model");
1699 CmdArgs.push_back(Model);
1700 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001701
Chandler Carruthc0c04552012-04-08 16:40:35 +00001702 // Infer the __PIC__ and __PIE__ values.
1703 if (ModelStr == "pic" && PICForPIE) {
1704 CmdArgs.push_back("-pie-level");
1705 CmdArgs.push_back((LastPICArg &&
1706 LastPICArg->getOption().matches(options::OPT_fPIE)) ?
1707 "2" : "1");
1708 } else if (ModelStr == "pic" || ModelStr == "dynamic-no-pic") {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00001709 CmdArgs.push_back("-pic-level");
Chandler Carruthc0c04552012-04-08 16:40:35 +00001710 CmdArgs.push_back(((ModelStr != "dynamic-no-pic" && LastPICArg &&
1711 LastPICArg->getOption().matches(options::OPT_fPIC)) ||
1712 getToolChain().getTriple().isOSDarwin()) ? "2" : "1");
Daniel Dunbar44e71222009-04-29 18:32:25 +00001713 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001714
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00001715 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1716 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00001717 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00001718
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001719 // LLVM Code Generator Options.
1720
Daniel Dunbar0bb03312011-02-09 17:54:19 +00001721 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
1722 CmdArgs.push_back("-mregparm");
1723 CmdArgs.push_back(A->getValue(Args));
1724 }
1725
Roman Divacky65b88cd2011-03-01 17:40:53 +00001726 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1727 CmdArgs.push_back("-mrtd");
1728
Rafael Espindola224dd632011-12-14 21:02:23 +00001729 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001730 CmdArgs.push_back("-mdisable-fp-elim");
1731 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1732 options::OPT_fno_zero_initialized_in_bss))
1733 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00001734 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1735 options::OPT_fno_strict_aliasing,
1736 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00001737 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00001738 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
1739 false))
1740 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00001741 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
1742 options::OPT_fno_optimize_sibling_calls))
1743 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001744
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001745 // Handle various floating point optimization flags, mapping them to the
1746 // appropriate LLVM code generation flags. The pattern for all of these is to
1747 // default off the codegen optimizations, and if any flag enables them and no
1748 // flag disables them after the flag enabling them, enable the codegen
1749 // optimization. This is complicated by several "umbrella" flags.
1750 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1751 options::OPT_ffinite_math_only,
1752 options::OPT_fno_finite_math_only,
1753 options::OPT_fhonor_infinities,
1754 options::OPT_fno_honor_infinities))
1755 if (A->getOption().getID() != options::OPT_fno_finite_math_only &&
1756 A->getOption().getID() != options::OPT_fhonor_infinities)
1757 CmdArgs.push_back("-menable-no-infs");
1758 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1759 options::OPT_ffinite_math_only,
1760 options::OPT_fno_finite_math_only,
1761 options::OPT_fhonor_nans,
1762 options::OPT_fno_honor_nans))
1763 if (A->getOption().getID() != options::OPT_fno_finite_math_only &&
1764 A->getOption().getID() != options::OPT_fhonor_nans)
1765 CmdArgs.push_back("-menable-no-nans");
1766
Benjamin Kramerc242ef22012-05-02 14:55:48 +00001767 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
1768 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001769 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1770 options::OPT_fmath_errno,
Chandler Carruth3634c662012-04-26 02:10:51 +00001771 options::OPT_fno_math_errno))
1772 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
1773 if (MathErrno)
1774 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001775
1776 // There are several flags which require disabling very specific
1777 // optimizations. Any of these being disabled forces us to turn off the
1778 // entire set of LLVM optimizations, so collect them through all the flag
1779 // madness.
1780 bool AssociativeMath = false;
1781 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1782 options::OPT_funsafe_math_optimizations,
1783 options::OPT_fno_unsafe_math_optimizations,
1784 options::OPT_fassociative_math,
1785 options::OPT_fno_associative_math))
1786 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1787 A->getOption().getID() != options::OPT_fno_associative_math)
1788 AssociativeMath = true;
1789 bool ReciprocalMath = false;
1790 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1791 options::OPT_funsafe_math_optimizations,
1792 options::OPT_fno_unsafe_math_optimizations,
1793 options::OPT_freciprocal_math,
1794 options::OPT_fno_reciprocal_math))
1795 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1796 A->getOption().getID() != options::OPT_fno_reciprocal_math)
1797 ReciprocalMath = true;
1798 bool SignedZeros = true;
1799 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1800 options::OPT_funsafe_math_optimizations,
1801 options::OPT_fno_unsafe_math_optimizations,
1802 options::OPT_fsigned_zeros,
1803 options::OPT_fno_signed_zeros))
1804 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1805 A->getOption().getID() != options::OPT_fsigned_zeros)
1806 SignedZeros = false;
1807 bool TrappingMath = true;
1808 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1809 options::OPT_funsafe_math_optimizations,
1810 options::OPT_fno_unsafe_math_optimizations,
1811 options::OPT_ftrapping_math,
1812 options::OPT_fno_trapping_math))
1813 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1814 A->getOption().getID() != options::OPT_ftrapping_math)
1815 TrappingMath = false;
1816 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
1817 !TrappingMath)
1818 CmdArgs.push_back("-menable-unsafe-fp-math");
1819
Lang Hamesaa53b932012-07-06 00:59:19 +00001820
1821 // Validate and pass through -fp-contract option.
1822 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1823 options::OPT_ffp_contract)) {
1824 if (A->getOption().getID() == options::OPT_ffp_contract) {
1825 StringRef Val = A->getValue(Args);
1826 if (Val == "fast" || Val == "on" || Val == "off") {
1827 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
1828 } else {
1829 D.Diag(diag::err_drv_unsupported_option_argument)
1830 << A->getOption().getName() << Val;
1831 }
1832 } else { // A is OPT_ffast_math
1833 // If fast-math is set then set the fp-contract mode to fast.
1834 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
1835 }
1836 }
1837
Bob Wilson6a039162012-07-19 03:52:53 +00001838 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
1839 // and if we find them, tell the frontend to provide the appropriate
1840 // preprocessor macros. This is distinct from enabling any optimizations as
1841 // these options induce language changes which must survive serialization
1842 // and deserialization, etc.
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001843 if (Args.hasArg(options::OPT_ffast_math))
1844 CmdArgs.push_back("-ffast-math");
Bob Wilson6a039162012-07-19 03:52:53 +00001845 if (Args.hasArg(options::OPT_ffinite_math_only))
1846 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001847
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001848 // Decide whether to use verbose asm. Verbose assembly is the default on
1849 // toolchains which have the integrated assembler on by default.
1850 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
1851 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001852 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001853 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001854 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001855
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001856 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
1857 CmdArgs.push_back("-mdebug-pass");
1858 CmdArgs.push_back("Structure");
1859 }
1860 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
1861 CmdArgs.push_back("-mdebug-pass");
1862 CmdArgs.push_back("Arguments");
1863 }
1864
John McCall8517abc2010-02-19 02:45:38 +00001865 // Enable -mconstructor-aliases except on darwin, where we have to
1866 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00001867 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00001868 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00001869
John McCall7ef5cb32011-03-18 02:56:14 +00001870 // Darwin's kernel doesn't support guard variables; just die if we
1871 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00001872 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00001873 CmdArgs.push_back("-fforbid-guard-variables");
1874
Douglas Gregordbe39272011-02-01 15:15:22 +00001875 if (Args.hasArg(options::OPT_mms_bitfields)) {
1876 CmdArgs.push_back("-mms-bitfields");
1877 }
John McCall8517abc2010-02-19 02:45:38 +00001878
Daniel Dunbar306945d2009-09-16 06:17:29 +00001879 // This is a coarse approximation of what llvm-gcc actually does, both
1880 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
1881 // complicated ways.
1882 bool AsynchronousUnwindTables =
1883 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
1884 options::OPT_fno_asynchronous_unwind_tables,
1885 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001886 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00001887 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
1888 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001889 CmdArgs.push_back("-munwind-tables");
1890
Rafael Espindola66aa0452012-06-19 01:26:10 +00001891 getToolChain().addClangTargetOptions(CmdArgs);
1892
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001893 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
1894 CmdArgs.push_back("-mlimit-float-precision");
1895 CmdArgs.push_back(A->getValue(Args));
1896 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001897
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001898 // FIXME: Handle -mtune=.
1899 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00001900
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001901 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001902 CmdArgs.push_back("-mcode-model");
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001903 CmdArgs.push_back(A->getValue(Args));
1904 }
1905
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001906 // Add target specific cpu and features flags.
1907 switch(getToolChain().getTriple().getArch()) {
1908 default:
1909 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001910
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001911 case llvm::Triple::arm:
1912 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00001913 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001914 break;
1915
Eric Christopher0b26a612010-03-02 02:41:08 +00001916 case llvm::Triple::mips:
1917 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00001918 case llvm::Triple::mips64:
1919 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00001920 AddMIPSTargetArgs(Args, CmdArgs);
1921 break;
1922
Hal Finkel8eb59282012-06-11 22:35:19 +00001923 case llvm::Triple::ppc:
1924 case llvm::Triple::ppc64:
1925 AddPPCTargetArgs(Args, CmdArgs);
1926 break;
1927
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001928 case llvm::Triple::sparc:
1929 AddSparcTargetArgs(Args, CmdArgs);
1930 break;
1931
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001932 case llvm::Triple::x86:
1933 case llvm::Triple::x86_64:
1934 AddX86TargetArgs(Args, CmdArgs);
1935 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001936
1937 case llvm::Triple::hexagon:
1938 AddHexagonTargetArgs(Args, CmdArgs);
1939 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00001940 }
1941
Tony Linthicum76329bf2011-12-12 21:14:55 +00001942
1943
Daniel Dunbar976a2f52010-08-11 23:07:47 +00001944 // Pass the linker version in use.
1945 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1946 CmdArgs.push_back("-target-linker-version");
1947 CmdArgs.push_back(A->getValue(Args));
1948 }
1949
Nick Lewycky75033772011-02-02 06:43:03 +00001950 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00001951 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewycky75033772011-02-02 06:43:03 +00001952 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson6524dd32011-10-14 05:03:44 +00001953 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00001954 CmdArgs.push_back("-momit-leaf-frame-pointer");
1955
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00001956 // Explicitly error on some things we know we don't support and can't just
1957 // ignore.
1958 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001959 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
1960 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001961 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00001962 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001963 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00001964 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
1965 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001966 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001967 << Unsupported->getOption().getName();
1968 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00001969 }
1970
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001971 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00001972 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00001973 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00001974 CmdArgs.push_back("-header-include-file");
1975 CmdArgs.push_back(D.CCPrintHeadersFilename ?
1976 D.CCPrintHeadersFilename : "-");
1977 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001978 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00001979 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001980
Chad Rosierbe10f982011-08-02 17:58:04 +00001981 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00001982 CmdArgs.push_back("-diagnostic-log-file");
1983 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
1984 D.CCLogDiagnosticsFilename : "-");
1985 }
1986
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00001987 // Use the last option from "-g" group. "-gline-tables-only" is
1988 // preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00001989 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00001990 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
1991 if (A->getOption().matches(options::OPT_gline_tables_only)) {
1992 CmdArgs.push_back("-gline-tables-only");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00001993 } else if (!A->getOption().matches(options::OPT_g0) &&
1994 !A->getOption().matches(options::OPT_ggdb0)) {
Chad Rosier8fe3b112011-11-07 19:52:29 +00001995 CmdArgs.push_back("-g");
Chad Rosierc2bf3382011-11-04 19:28:44 +00001996 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00001997 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001998
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00001999 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2000 Args.ClaimAllArgs(options::OPT_g_flags_Group);
2001
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002002 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2003 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2004
Chris Lattner3c77a352010-06-22 00:03:40 +00002005 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2006
Nick Lewycky207bce32011-04-21 23:44:07 +00002007 if (Args.hasArg(options::OPT_ftest_coverage) ||
2008 Args.hasArg(options::OPT_coverage))
2009 CmdArgs.push_back("-femit-coverage-notes");
2010 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2011 Args.hasArg(options::OPT_coverage))
2012 CmdArgs.push_back("-femit-coverage-data");
2013
Nick Lewycky480cb992011-05-04 20:46:58 +00002014 if (C.getArgs().hasArg(options::OPT_c) ||
2015 C.getArgs().hasArg(options::OPT_S)) {
2016 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002017 CmdArgs.push_back("-coverage-file");
Bill Wendling8c0b4bc2012-08-30 00:43:41 +00002018 SmallString<128> absFilename(Output.getFilename());
2019 llvm::sys::fs::make_absolute(absFilename);
2020 CmdArgs.push_back(Args.MakeArgString(absFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002021 }
2022 }
2023
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002024 // Pass options for controlling the default header search paths.
2025 if (Args.hasArg(options::OPT_nostdinc)) {
2026 CmdArgs.push_back("-nostdsysteminc");
2027 CmdArgs.push_back("-nobuiltininc");
2028 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002029 if (Args.hasArg(options::OPT_nostdlibinc))
2030 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002031 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2032 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2033 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002034
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002035 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002036 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002037 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002038
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002039 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2040
Ted Kremenekf7639e12012-03-06 20:06:33 +00002041 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002042 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002043 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002044 options::OPT_ccc_arcmt_modify,
2045 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002046 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002047 switch (A->getOption().getID()) {
2048 default:
2049 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002050 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002051 CmdArgs.push_back("-arcmt-check");
2052 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002053 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002054 CmdArgs.push_back("-arcmt-modify");
2055 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002056 case options::OPT_ccc_arcmt_migrate:
2057 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002058 CmdArgs.push_back("-mt-migrate-directory");
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002059 CmdArgs.push_back(A->getValue(Args));
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002060
2061 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2062 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002063 break;
John McCalld70fb982011-06-15 23:25:17 +00002064 }
2065 }
2066 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002067
Ted Kremenekf7639e12012-03-06 20:06:33 +00002068 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2069 if (ARCMTEnabled) {
2070 D.Diag(diag::err_drv_argument_not_allowed_with)
2071 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2072 }
2073 CmdArgs.push_back("-mt-migrate-directory");
2074 CmdArgs.push_back(A->getValue(Args));
2075
2076 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2077 options::OPT_objcmt_migrate_subscripting)) {
2078 // None specified, means enable them all.
2079 CmdArgs.push_back("-objcmt-migrate-literals");
2080 CmdArgs.push_back("-objcmt-migrate-subscripting");
2081 } else {
2082 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2083 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2084 }
2085 }
2086
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002087 // Add preprocessing options like -I, -D, etc. if we are using the
2088 // preprocessor.
2089 //
2090 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002091 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Peter Collingbourne9b515cb2011-11-06 00:40:05 +00002092 AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002093
Rafael Espindolaa7431922011-07-21 23:40:37 +00002094 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2095 // that "The compiler can only warn and ignore the option if not recognized".
2096 // When building with ccache, it will pass -D options to clang even on
2097 // preprocessed inputs and configure concludes that -fPIC is not supported.
2098 Args.ClaimAllArgs(options::OPT_D);
2099
Daniel Dunbar58f78332009-09-17 06:53:36 +00002100 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002101 // others.
2102 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002103 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002104 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002105 else if (A->getOption().matches(options::OPT_O) &&
2106 A->getValue(Args)[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002107 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002108 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002109 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002110 }
2111
Daniel Dunbar945577c2009-10-29 02:24:45 +00002112 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002113 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2114 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002115 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002116 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002117
2118 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2119 // (-ansi is equivalent to -std=c89).
2120 //
2121 // If a std is supplied, only add -trigraphs if it follows the
2122 // option.
2123 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2124 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002125 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002126 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002127 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002128 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002129 else
2130 Std->render(Args, CmdArgs);
2131
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002132 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2133 options::OPT_trigraphs))
2134 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002135 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002136 } else {
2137 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002138 //
2139 // FIXME: Clang doesn't correctly handle -std= when the input language
2140 // doesn't match. For the time being just ignore this for C++ inputs;
2141 // eventually we want to do all the standard defaulting here instead of
2142 // splitting it between the driver and clang -cc1.
2143 if (!types::isCXX(InputType))
NAKAMURA Takumie5494ff2012-07-12 03:14:56 +00002144 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2145 "-std=", /*Joined=*/true);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002146 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002147 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002148
Chandler Carruthb009b142011-04-23 06:30:43 +00002149 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2150 // '-fconst-strings'; this better indicates its actual behavior.
2151 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2152 false)) {
2153 // For perfect compatibility with GCC, we do this even in the presence of
2154 // '-w'. This flag names something other than a warning for GCC.
2155 CmdArgs.push_back("-fconst-strings");
2156 }
2157
Chandler Carruth61fbf622011-04-23 09:27:53 +00002158 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002159 // during C++ compilation, which it is by default. GCC keeps this define even
2160 // in the presence of '-w', match this behavior bug-for-bug.
2161 if (types::isCXX(InputType) &&
2162 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2163 true)) {
2164 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002165 }
2166
Chandler Carruthe0391482010-05-22 02:21:53 +00002167 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2168 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2169 if (Asm->getOption().matches(options::OPT_fasm))
2170 CmdArgs.push_back("-fgnu-keywords");
2171 else
2172 CmdArgs.push_back("-fno-gnu-keywords");
2173 }
2174
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002175 if (ShouldDisableCFI(Args, getToolChain()))
2176 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002177
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002178 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2179 CmdArgs.push_back("-fno-dwarf-directory-asm");
2180
Nick Lewyckyba743b72011-10-21 02:32:14 +00002181 if (const char *pwd = ::getenv("PWD")) {
2182 // GCC also verifies that stat(pwd) and stat(".") have the same inode
2183 // number. Not doing those because stats are slow, but we could.
NAKAMURA Takumib5e6fa22011-10-22 10:25:25 +00002184 if (llvm::sys::path::is_absolute(pwd)) {
Nick Lewyckyba743b72011-10-21 02:32:14 +00002185 std::string CompDir = pwd;
2186 CmdArgs.push_back("-fdebug-compilation-dir");
2187 CmdArgs.push_back(Args.MakeArgString(CompDir));
2188 }
2189 }
2190
Richard Smith9a568822011-11-21 19:36:32 +00002191 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2192 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002193 CmdArgs.push_back("-ftemplate-depth");
2194 CmdArgs.push_back(A->getValue(Args));
2195 }
2196
Richard Smith9a568822011-11-21 19:36:32 +00002197 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2198 CmdArgs.push_back("-fconstexpr-depth");
2199 CmdArgs.push_back(A->getValue(Args));
2200 }
2201
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002202 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2203 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002204 if (A->getNumValues()) {
2205 StringRef bytes = A->getValue(Args);
2206 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2207 } else
2208 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002209 }
2210
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002211 if (Arg *A = Args.getLastArg(options::OPT_fbounds_checking,
2212 options::OPT_fbounds_checking_EQ)) {
2213 if (A->getNumValues()) {
2214 StringRef val = A->getValue(Args);
2215 CmdArgs.push_back(Args.MakeArgString("-fbounds-checking=" + val));
2216 } else
2217 CmdArgs.push_back("-fbounds-checking=1");
2218 }
2219
Daniel Dunbarfffd1812009-11-19 04:00:53 +00002220 if (Args.hasArg(options::OPT__relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002221 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002222
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002223 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2224 CmdArgs.push_back("-fconstant-string-class");
2225 CmdArgs.push_back(A->getValue(Args));
2226 }
David Chisnall5778fce2009-08-31 16:41:57 +00002227
Chris Lattnere23003d2010-01-09 21:54:33 +00002228 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2229 CmdArgs.push_back("-ftabstop");
2230 CmdArgs.push_back(A->getValue(Args));
2231 }
2232
Chris Lattnerb35583d2010-04-07 20:49:23 +00002233 CmdArgs.push_back("-ferror-limit");
2234 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
2235 CmdArgs.push_back(A->getValue(Args));
2236 else
2237 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002238
Chandler Carrutha77a7272010-05-06 04:55:18 +00002239 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2240 CmdArgs.push_back("-fmacro-backtrace-limit");
Douglas Gregorcd121fb2010-05-04 17:13:42 +00002241 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002242 }
2243
2244 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2245 CmdArgs.push_back("-ftemplate-backtrace-limit");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002246 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002247 }
2248
Richard Smithf6f003a2011-12-16 19:06:07 +00002249 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2250 CmdArgs.push_back("-fconstexpr-backtrace-limit");
2251 CmdArgs.push_back(A->getValue(Args));
2252 }
2253
Daniel Dunbar2c978472009-11-04 06:24:47 +00002254 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002255 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002256 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002257 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002258 } else {
2259 // If -fmessage-length=N was not specified, determine whether this is a
2260 // terminal and, if so, implicitly define -fmessage-length appropriately.
2261 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002262 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002263 }
2264
Daniel Dunbare357d562009-12-03 18:42:11 +00002265 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2266 CmdArgs.push_back("-fvisibility");
2267 CmdArgs.push_back(A->getValue(Args));
2268 }
2269
Douglas Gregor08329632010-06-15 17:05:35 +00002270 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002271
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002272 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2273
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002274 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002275 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2276 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002277 CmdArgs.push_back("-ffreestanding");
2278
Daniel Dunbare357d562009-12-03 18:42:11 +00002279 // Forward -f (flag) options which we can pass directly.
Mike Stumpd9546382009-12-12 01:27:46 +00002280 Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002281 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002282 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002283 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002284 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002285 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002286 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002287 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2288 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002289
2290 // Report and error for -faltivec on anything other then PowerPC.
2291 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2292 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2293 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2294 D.Diag(diag::err_drv_argument_only_allowed_with)
2295 << A->getAsString(Args) << "ppc/ppc64";
2296
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002297 if (getToolChain().SupportsProfiling())
2298 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002299
Kostya Serebryany8855ff62011-11-16 17:34:26 +00002300 if (Args.hasFlag(options::OPT_faddress_sanitizer,
2301 options::OPT_fno_address_sanitizer, false))
2302 CmdArgs.push_back("-faddress-sanitizer");
2303
Kostya Serebryany28a7a112012-03-01 22:27:08 +00002304 if (Args.hasFlag(options::OPT_fthread_sanitizer,
2305 options::OPT_fno_thread_sanitizer, false))
2306 CmdArgs.push_back("-fthread-sanitizer");
2307
Daniel Dunbar35621a92010-03-16 16:57:46 +00002308 // -flax-vector-conversions is default.
2309 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2310 options::OPT_fno_lax_vector_conversions))
2311 CmdArgs.push_back("-fno-lax-vector-conversions");
2312
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002313 if (Args.getLastArg(options::OPT_fapple_kext))
2314 CmdArgs.push_back("-fapple-kext");
2315
David Blaikie690f21e2012-06-14 18:55:27 +00002316 if (Args.hasFlag(options::OPT_frewrite_includes,
2317 options::OPT_fno_rewrite_includes, false))
2318 CmdArgs.push_back("-frewrite-includes");
2319
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002320 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002321 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002322 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002323 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2324 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002325
2326 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2327 CmdArgs.push_back("-ftrapv-handler");
2328 CmdArgs.push_back(A->getValue(Args));
2329 }
2330
Bob Wilson14adb362012-02-03 06:27:22 +00002331 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002332
Chandler Carruth6e501032011-03-27 00:04:55 +00002333 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2334 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2335 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2336 options::OPT_fno_wrapv)) {
2337 if (A->getOption().matches(options::OPT_fwrapv))
2338 CmdArgs.push_back("-fwrapv");
2339 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2340 options::OPT_fno_strict_overflow)) {
2341 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2342 CmdArgs.push_back("-fwrapv");
2343 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002344 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002345 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002346
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002347 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2348
Daniel Dunbar4930e332009-11-17 08:07:36 +00002349 // -stack-protector=0 is default.
2350 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002351 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2352 options::OPT_fstack_protector_all,
2353 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002354 if (A->getOption().matches(options::OPT_fstack_protector))
2355 StackProtectorLevel = 1;
2356 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2357 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002358 } else {
2359 StackProtectorLevel =
2360 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2361 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002362 if (StackProtectorLevel) {
2363 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002364 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002365
2366 // --param ssp-buffer-size=
2367 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2368 ie = Args.filtered_end(); it != ie; ++it) {
2369 StringRef Str((*it)->getValue(Args));
2370 if (Str.startswith("ssp-buffer-size=")) {
2371 CmdArgs.push_back("-stack-protector-buffer-size");
2372 // FIXME: Verify the argument is a valid integer.
2373 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
2374 (*it)->claim();
2375 }
2376 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002377 }
2378
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002379 // Translate -mstackrealign
2380 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2381 false)) {
2382 CmdArgs.push_back("-backend-option");
2383 CmdArgs.push_back("-force-align-stack");
2384 }
2385 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2386 false)) {
2387 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2388 }
2389
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002390 if (Args.hasArg(options::OPT_mstack_alignment)) {
2391 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2392 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002393 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002394
Daniel Dunbard18049a2009-04-07 21:16:11 +00002395 // Forward -f options with positive and negative forms; we translate
2396 // these by hand.
2397
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002398 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002399 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002400 CmdArgs.push_back("-fapple-kext");
2401 if (!Args.hasArg(options::OPT_fbuiltin))
2402 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002403 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002404 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002405 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002406 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002407 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002408
Nuno Lopes13c88c72009-12-16 16:59:22 +00002409 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2410 options::OPT_fno_assume_sane_operator_new))
2411 CmdArgs.push_back("-fno-assume-sane-operator-new");
2412
Daniel Dunbar4930e332009-11-17 08:07:36 +00002413 // -fblocks=0 is default.
2414 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002415 getToolChain().IsBlocksDefault()) ||
2416 (Args.hasArg(options::OPT_fgnu_runtime) &&
2417 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2418 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002419 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002420
2421 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2422 !getToolChain().hasBlocksRuntime())
2423 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002424 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002425
Douglas Gregor226173a2012-01-18 15:19:58 +00002426 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2427 // users must also pass -fcxx-modules. The latter flag will disappear once the
2428 // modules implementation is solid for C++/Objective-C++ programs as well.
2429 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2430 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2431 options::OPT_fno_cxx_modules,
2432 false);
2433 if (AllowedInCXX || !types::isCXX(InputType))
2434 CmdArgs.push_back("-fmodules");
2435 }
Douglas Gregor787869b2012-01-03 17:13:05 +00002436
John McCalldfea9982010-04-09 19:12:06 +00002437 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002438 if (Args.hasFlag(options::OPT_fno_access_control,
2439 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002440 false))
John McCall3155f572010-04-09 19:03:51 +00002441 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00002442
Anders Carlssond470fef2010-11-21 00:09:52 +00002443 // -felide-constructors is the default.
2444 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2445 options::OPT_felide_constructors,
2446 false))
2447 CmdArgs.push_back("-fno-elide-constructors");
2448
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002449 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002450 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
2451 KernelOrKext)
Daniel Dunbar484afa22009-11-19 04:55:23 +00002452 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00002453
Tony Linthicum76329bf2011-12-12 21:14:55 +00002454 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002455 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00002456 options::OPT_fno_short_enums,
2457 getToolChain().getTriple().getArch() ==
2458 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002459 CmdArgs.push_back("-fshort-enums");
2460
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002461 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002462 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002463 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00002464 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00002465
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002466 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002467 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002468 options::OPT_fno_threadsafe_statics))
2469 CmdArgs.push_back("-fno-threadsafe-statics");
2470
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002471 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002472 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2473 options::OPT_fno_use_cxa_atexit,
2474 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00002475 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00002476 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2477 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002478 CmdArgs.push_back("-fno-use-cxa-atexit");
2479
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002480 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002481 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002482 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2483 CmdArgs.push_back("-fms-extensions");
2484
Chad Rosiered943242012-07-20 21:20:33 +00002485 // -fms-inline-asm.
Chad Rosierd3957e52012-07-20 23:12:26 +00002486 if (Args.hasArg(options::OPT_fenable_experimental_ms_inline_asm))
2487 CmdArgs.push_back("-fenable-experimental-ms-inline-asm");
Chad Rosiered943242012-07-20 21:20:33 +00002488
Francois Pichet1b4f1632011-09-17 04:32:15 +00002489 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00002490 if (Args.hasFlag(options::OPT_fms_compatibility,
2491 options::OPT_fno_ms_compatibility,
2492 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2493 Args.hasFlag(options::OPT_fms_extensions,
2494 options::OPT_fno_ms_extensions,
2495 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00002496 CmdArgs.push_back("-fms-compatibility");
2497
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002498 // -fmsc-version=1300 is default.
2499 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2500 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2501 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002502 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002503 if (msc_ver.empty())
2504 CmdArgs.push_back("-fmsc-version=1300");
2505 else
2506 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2507 }
2508
2509
Dawn Perchik68bb1b42010-09-02 23:59:25 +00002510 // -fborland-extensions=0 is default.
2511 if (Args.hasFlag(options::OPT_fborland_extensions,
2512 options::OPT_fno_borland_extensions, false))
2513 CmdArgs.push_back("-fborland-extensions");
2514
Francois Pichet02744872011-09-01 16:38:08 +00002515 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2516 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00002517 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2518 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00002519 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00002520 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00002521
Chandler Carruthe03aa552010-04-17 20:17:31 +00002522 // -fgnu-keywords default varies depending on language; only pass if
2523 // specified.
2524 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00002525 options::OPT_fno_gnu_keywords))
2526 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00002527
Rafael Espindola922a6242011-06-02 17:30:53 +00002528 if (Args.hasFlag(options::OPT_fgnu89_inline,
2529 options::OPT_fno_gnu89_inline,
2530 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00002531 CmdArgs.push_back("-fgnu89-inline");
2532
Chad Rosier9c76d242012-03-15 22:31:42 +00002533 if (Args.hasArg(options::OPT_fno_inline))
2534 CmdArgs.push_back("-fno-inline");
2535
Chad Rosier64d6be92012-03-06 21:17:19 +00002536 if (Args.hasArg(options::OPT_fno_inline_functions))
2537 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00002538
John McCall5fb5df92012-06-20 06:18:46 +00002539 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00002540
John McCall5fb5df92012-06-20 06:18:46 +00002541 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2542 // legacy is the default.
2543 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00002544 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2545 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00002546 objcRuntime.isLegacyDispatchDefaultForArch(
2547 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00002548 if (getToolChain().UseObjCMixedDispatch())
2549 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2550 else
2551 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2552 }
2553 }
2554
Nico Weber97bd94b2012-03-09 21:19:44 +00002555 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2556 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00002557 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00002558 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2559 }
2560
John McCall24fc0de2011-07-06 00:26:06 +00002561 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2562 // NOTE: This logic is duplicated in ToolChains.cpp.
2563 bool ARC = isObjCAutoRefCount(Args);
2564 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00002565 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00002566
John McCall24fc0de2011-07-06 00:26:06 +00002567 CmdArgs.push_back("-fobjc-arc");
2568
Chandler Carruth491db322011-11-04 07:34:47 +00002569 // FIXME: It seems like this entire block, and several around it should be
2570 // wrapped in isObjC, but for now we just use it here as this is where it
2571 // was being used previously.
2572 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2573 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2574 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2575 else
2576 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2577 }
2578
John McCall24fc0de2011-07-06 00:26:06 +00002579 // Allow the user to enable full exceptions code emission.
2580 // We define off for Objective-CC, on for Objective-C++.
2581 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2582 options::OPT_fno_objc_arc_exceptions,
2583 /*default*/ types::isCXX(InputType)))
2584 CmdArgs.push_back("-fobjc-arc-exceptions");
2585 }
2586
2587 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2588 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00002589 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00002590 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002591
John McCall24fc0de2011-07-06 00:26:06 +00002592 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2593 // takes precedence.
2594 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2595 if (!GCArg)
2596 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2597 if (GCArg) {
2598 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002599 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00002600 << GCArg->getAsString(Args);
2601 } else if (getToolChain().SupportsObjCGC()) {
2602 GCArg->render(Args, CmdArgs);
2603 } else {
2604 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002605 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00002606 << GCArg->getAsString(Args);
2607 }
2608 }
2609
John McCallb5f652e2011-06-22 00:53:57 +00002610 // Add exception args.
2611 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00002612 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00002613
2614 if (getToolChain().UseSjLjExceptions())
2615 CmdArgs.push_back("-fsjlj-exceptions");
2616
2617 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00002618 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2619 options::OPT_fno_assume_sane_operator_new))
2620 CmdArgs.push_back("-fno-assume-sane-operator-new");
2621
Daniel Dunbar34d7a992010-04-27 15:34:57 +00002622 // -fconstant-cfstrings is default, and may be subject to argument translation
2623 // on Darwin.
2624 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2625 options::OPT_fno_constant_cfstrings) ||
2626 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2627 options::OPT_mno_constant_cfstrings))
2628 CmdArgs.push_back("-fno-constant-cfstrings");
2629
John Thompsoned4e2952009-11-05 20:14:16 +00002630 // -fshort-wchar default varies depending on platform; only
2631 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00002632 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2633 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00002634
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00002635 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2636 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00002637 //
2638 // FIXME: This is gross; that translation should be pulled from the
2639 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002640 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00002641 options::OPT_fno_pascal_strings,
2642 false) ||
2643 Args.hasFlag(options::OPT_mpascal_strings,
2644 options::OPT_mno_pascal_strings,
2645 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002646 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002647
Daniel Dunbar096ed292011-10-05 21:04:55 +00002648 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2649 // -fno-pack-struct doesn't apply to -fpack-struct=.
2650 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00002651 std::string PackStructStr = "-fpack-struct=";
2652 PackStructStr += A->getValue(Args);
2653 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00002654 } else if (Args.hasFlag(options::OPT_fpack_struct,
2655 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00002656 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00002657 }
2658
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002659 if (Args.hasArg(options::OPT_mkernel) ||
2660 Args.hasArg(options::OPT_fapple_kext)) {
2661 if (!Args.hasArg(options::OPT_fcommon))
2662 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00002663 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002664 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00002665
Daniel Dunbard18049a2009-04-07 21:16:11 +00002666 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002667 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002668 CmdArgs.push_back("-fno-common");
2669
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002670 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00002671 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00002672 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002673 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002674 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002675 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2676
Daniel Dunbar6358d682010-10-15 22:30:42 +00002677 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2678 if (!Args.hasFlag(options::OPT_ffor_scope,
2679 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002680 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00002681 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2682
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00002683 // -fcaret-diagnostics is default.
2684 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2685 options::OPT_fno_caret_diagnostics, true))
2686 CmdArgs.push_back("-fno-caret-diagnostics");
2687
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002688 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00002689 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002690 options::OPT_fno_diagnostics_fixit_info))
2691 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002692
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002693 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00002694 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002695 options::OPT_fno_diagnostics_show_option))
2696 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002697
Chris Lattnerbf6fac82010-05-04 21:55:25 +00002698 if (const Arg *A =
2699 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
2700 CmdArgs.push_back("-fdiagnostics-show-category");
2701 CmdArgs.push_back(A->getValue(Args));
2702 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002703
Douglas Gregor643c9222011-05-21 17:07:29 +00002704 if (const Arg *A =
2705 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
2706 CmdArgs.push_back("-fdiagnostics-format");
2707 CmdArgs.push_back(A->getValue(Args));
2708 }
2709
Chandler Carruthb6766f02011-03-27 01:50:55 +00002710 if (Arg *A = Args.getLastArg(
2711 options::OPT_fdiagnostics_show_note_include_stack,
2712 options::OPT_fno_diagnostics_show_note_include_stack)) {
2713 if (A->getOption().matches(
2714 options::OPT_fdiagnostics_show_note_include_stack))
2715 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
2716 else
2717 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
2718 }
2719
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002720 // Color diagnostics are the default, unless the terminal doesn't support
2721 // them.
2722 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidis4f920162010-09-23 12:56:06 +00002723 options::OPT_fno_color_diagnostics,
2724 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002725 CmdArgs.push_back("-fcolor-diagnostics");
2726
Daniel Dunbardb097022009-06-08 21:13:54 +00002727 if (!Args.hasFlag(options::OPT_fshow_source_location,
2728 options::OPT_fno_show_source_location))
2729 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002730
Douglas Gregor643c9222011-05-21 17:07:29 +00002731 if (!Args.hasFlag(options::OPT_fshow_column,
2732 options::OPT_fno_show_column,
2733 true))
2734 CmdArgs.push_back("-fno-show-column");
2735
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00002736 if (!Args.hasFlag(options::OPT_fspell_checking,
2737 options::OPT_fno_spell_checking))
2738 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002739
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002740
Daniel Dunbar3ada2b72010-11-02 19:42:04 +00002741 // Silently ignore -fasm-blocks for now.
2742 (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
2743 false);
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002744
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00002745 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
2746 A->render(Args, CmdArgs);
2747
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002748 // -fdollars-in-identifiers default varies depending on platform and
2749 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00002750 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002751 options::OPT_fno_dollars_in_identifiers)) {
2752 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002753 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002754 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002755 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002756 }
2757
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002758 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
2759 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00002760 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002761 options::OPT_fno_unit_at_a_time)) {
2762 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002763 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002764 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002765
Eli Friedman055c9702011-11-02 01:53:16 +00002766 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
2767 options::OPT_fno_apple_pragma_pack, false))
2768 CmdArgs.push_back("-fapple-pragma-pack");
2769
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002770 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002771 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002772 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002773#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00002774 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002775 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
2776 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
2777 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
2778 CmdArgs.push_back("-fno-builtin-strcat");
2779 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
2780 CmdArgs.push_back("-fno-builtin-strcpy");
2781 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002782#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002783
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002784 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00002785 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002786 options::OPT_traditional_cpp)) {
2787 if (isa<PreprocessJobAction>(JA))
2788 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002789 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002790 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002791 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002792
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002793 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00002794 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00002795
2796 // Handle serialized diagnostics.
2797 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
2798 CmdArgs.push_back("-serialize-diagnostic-file");
2799 CmdArgs.push_back(Args.MakeArgString(A->getValue(Args)));
2800 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002801
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002802 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
2803 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002804 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002805 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
2806 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00002807 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00002808
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002809 // We translate this by hand to the -cc1 argument, since nightly test uses
2810 // it and developers have been trained to spell it with -mllvm.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002811 if (StringRef((*it)->getValue(Args, 0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002812 CmdArgs.push_back("-disable-llvm-optzns");
2813 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00002814 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002815 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002816
Daniel Dunbard67a3222009-03-30 06:36:42 +00002817 if (Output.getType() == types::TY_Dependencies) {
2818 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002819 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00002820 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002821 CmdArgs.push_back(Output.getFilename());
2822 } else {
2823 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002824 }
2825
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002826 for (InputInfoList::const_iterator
2827 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2828 const InputInfo &II = *it;
2829 CmdArgs.push_back("-x");
2830 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00002831 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002832 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002833 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002834 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002835 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002836
Chris Lattnere9d7d782009-11-03 19:50:27 +00002837 Args.AddAllArgs(CmdArgs, options::OPT_undef);
2838
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00002839 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002840
2841 // Optionally embed the -cc1 level arguments into the debug info, for build
2842 // analysis.
2843 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002844 ArgStringList OriginalArgs;
2845 for (ArgList::const_iterator it = Args.begin(),
2846 ie = Args.end(); it != ie; ++it)
2847 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002848
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00002849 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002850 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002851 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002852 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002853 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002854 }
2855 CmdArgs.push_back("-dwarf-debug-flags");
2856 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
2857 }
2858
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00002859 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00002860
Roman Divacky178e01602011-02-10 16:52:03 +00002861 if (Arg *A = Args.getLastArg(options::OPT_pg))
2862 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002863 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00002864 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002865
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002866 // Claim some arguments which clang supports automatically.
2867
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00002868 // -fpch-preprocess is used with gcc to add a special marker in the output to
2869 // include the PCH file. Clang's PTH solution is completely transparent, so we
2870 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002871 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002872
Daniel Dunbar17731772009-03-23 19:03:36 +00002873 // Claim some arguments which clang doesn't support, but we don't
2874 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00002875 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
2876 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00002877
Rafael Espindolad95a8122011-03-01 05:25:27 +00002878 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00002879 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00002880 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002881}
2882
Jim Grosbach576452b2012-02-10 20:37:10 +00002883void ClangAs::AddARMTargetArgs(const ArgList &Args,
2884 ArgStringList &CmdArgs) const {
2885 const Driver &D = getToolChain().getDriver();
2886 llvm::Triple Triple = getToolChain().getTriple();
2887
2888 // Set the CPU based on -march= and -mcpu=.
2889 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00002890 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00002891
2892 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00002893 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00002894 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00002895
2896 // Honor -mfpmath=.
2897 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00002898 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00002899}
2900
John McCall5fb5df92012-06-20 06:18:46 +00002901/// Add options related to the Objective-C runtime/ABI.
2902///
2903/// Returns true if the runtime is non-fragile.
2904ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
2905 ArgStringList &cmdArgs,
2906 RewriteKind rewriteKind) const {
2907 // Look for the controlling runtime option.
2908 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
2909 options::OPT_fgnu_runtime,
2910 options::OPT_fobjc_runtime_EQ);
2911
2912 // Just forward -fobjc-runtime= to the frontend. This supercedes
2913 // options about fragility.
2914 if (runtimeArg &&
2915 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
2916 ObjCRuntime runtime;
2917 StringRef value = runtimeArg->getValue(args);
2918 if (runtime.tryParse(value)) {
2919 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
2920 << value;
2921 }
2922
2923 runtimeArg->render(args, cmdArgs);
2924 return runtime;
2925 }
2926
2927 // Otherwise, we'll need the ABI "version". Version numbers are
2928 // slightly confusing for historical reasons:
2929 // 1 - Traditional "fragile" ABI
2930 // 2 - Non-fragile ABI, version 1
2931 // 3 - Non-fragile ABI, version 2
2932 unsigned objcABIVersion = 1;
2933 // If -fobjc-abi-version= is present, use that to set the version.
2934 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
2935 StringRef value = abiArg->getValue(args);
2936 if (value == "1")
2937 objcABIVersion = 1;
2938 else if (value == "2")
2939 objcABIVersion = 2;
2940 else if (value == "3")
2941 objcABIVersion = 3;
2942 else
2943 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2944 << value;
2945 } else {
2946 // Otherwise, determine if we are using the non-fragile ABI.
2947 bool nonFragileABIIsDefault =
2948 (rewriteKind == RK_NonFragile ||
2949 (rewriteKind == RK_None &&
2950 getToolChain().IsObjCNonFragileABIDefault()));
2951 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
2952 options::OPT_fno_objc_nonfragile_abi,
2953 nonFragileABIIsDefault)) {
2954 // Determine the non-fragile ABI version to use.
2955#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
2956 unsigned nonFragileABIVersion = 1;
2957#else
2958 unsigned nonFragileABIVersion = 2;
2959#endif
2960
2961 if (Arg *abiArg = args.getLastArg(
2962 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
2963 StringRef value = abiArg->getValue(args);
2964 if (value == "1")
2965 nonFragileABIVersion = 1;
2966 else if (value == "2")
2967 nonFragileABIVersion = 2;
2968 else
2969 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2970 << value;
2971 }
2972
2973 objcABIVersion = 1 + nonFragileABIVersion;
2974 } else {
2975 objcABIVersion = 1;
2976 }
2977 }
2978
2979 // We don't actually care about the ABI version other than whether
2980 // it's non-fragile.
2981 bool isNonFragile = objcABIVersion != 1;
2982
2983 // If we have no runtime argument, ask the toolchain for its default runtime.
2984 // However, the rewriter only really supports the Mac runtime, so assume that.
2985 ObjCRuntime runtime;
2986 if (!runtimeArg) {
2987 switch (rewriteKind) {
2988 case RK_None:
2989 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
2990 break;
2991 case RK_Fragile:
2992 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
2993 break;
2994 case RK_NonFragile:
2995 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
2996 break;
2997 }
2998
2999 // -fnext-runtime
3000 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3001 // On Darwin, make this use the default behavior for the toolchain.
3002 if (getToolChain().getTriple().isOSDarwin()) {
3003 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3004
3005 // Otherwise, build for a generic macosx port.
3006 } else {
3007 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3008 }
3009
3010 // -fgnu-runtime
3011 } else {
3012 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003013 // Legacy behaviour is to target the gnustep runtime if we are i
3014 // non-fragile mode or the GCC runtime in fragile mode.
3015 if (isNonFragile)
3016 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple());
3017 else
3018 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003019 }
3020
3021 cmdArgs.push_back(args.MakeArgString(
3022 "-fobjc-runtime=" + runtime.getAsString()));
3023 return runtime;
3024}
3025
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003026void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003027 const InputInfo &Output,
3028 const InputInfoList &Inputs,
3029 const ArgList &Args,
3030 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003031 ArgStringList CmdArgs;
3032
3033 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3034 const InputInfo &Input = Inputs[0];
3035
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003036 // Don't warn about "clang -w -c foo.s"
3037 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003038 // and "clang -emit-llvm -c foo.s"
3039 Args.ClaimAllArgs(options::OPT_emit_llvm);
3040 // and "clang -use-gold-plugin -c foo.s"
3041 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003042
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003043 // Invoke ourselves in -cc1as mode.
3044 //
3045 // FIXME: Implement custom jobs for internal actions.
3046 CmdArgs.push_back("-cc1as");
3047
3048 // Add the "effective" target triple.
3049 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003050 std::string TripleStr =
3051 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003052 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3053
3054 // Set the output mode, we currently only expect to be used as a real
3055 // assembler.
3056 CmdArgs.push_back("-filetype");
3057 CmdArgs.push_back("obj");
3058
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003059 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003060 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003061
Jim Grosbach576452b2012-02-10 20:37:10 +00003062 // Add target specific cpu and features flags.
3063 switch(getToolChain().getTriple().getArch()) {
3064 default:
3065 break;
3066
3067 case llvm::Triple::arm:
3068 case llvm::Triple::thumb:
3069 AddARMTargetArgs(Args, CmdArgs);
3070 break;
3071 }
3072
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003073 // Ignore explicit -force_cpusubtype_ALL option.
3074 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003075
Eric Christopherfc3ee562012-01-10 00:38:01 +00003076 // Determine the original source input.
3077 const Action *SourceAction = &JA;
3078 while (SourceAction->getKind() != Action::InputClass) {
3079 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3080 SourceAction = SourceAction->getInputs()[0];
3081 }
3082
3083 // Forward -g, assuming we are dealing with an actual assembly file.
3084 if (SourceAction->getType() == types::TY_Asm ||
3085 SourceAction->getType() == types::TY_PP_Asm) {
3086 Args.ClaimAllArgs(options::OPT_g_Group);
3087 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3088 if (!A->getOption().matches(options::OPT_g0))
3089 CmdArgs.push_back("-g");
3090 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003091
3092 // Optionally embed the -cc1as level arguments into the debug info, for build
3093 // analysis.
3094 if (getToolChain().UseDwarfDebugFlags()) {
3095 ArgStringList OriginalArgs;
3096 for (ArgList::const_iterator it = Args.begin(),
3097 ie = Args.end(); it != ie; ++it)
3098 (*it)->render(Args, OriginalArgs);
3099
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003100 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003101 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3102 Flags += Exec;
3103 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3104 Flags += " ";
3105 Flags += OriginalArgs[i];
3106 }
3107 CmdArgs.push_back("-dwarf-debug-flags");
3108 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3109 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003110
3111 // FIXME: Add -static support, once we have it.
3112
3113 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3114 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003115 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003116
3117 assert(Output.isFilename() && "Unexpected lipo output.");
3118 CmdArgs.push_back("-o");
3119 CmdArgs.push_back(Output.getFilename());
3120
Daniel Dunbarb440f562010-08-02 02:38:21 +00003121 assert(Input.isFilename() && "Invalid input.");
3122 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003123
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003124 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003125 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003126}
3127
Daniel Dunbara3246a02009-03-18 08:07:30 +00003128void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003129 const InputInfo &Output,
3130 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003131 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003132 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003133 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003134 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003135
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003136 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003137 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003138 Arg *A = *it;
Daniel Dunbar2da02722009-03-19 07:55:12 +00003139 if (A->getOption().hasForwardToGCC()) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003140 // Don't forward any -g arguments to assembly steps.
3141 if (isa<AssembleJobAction>(JA) &&
3142 A->getOption().matches(options::OPT_g_Group))
3143 continue;
3144
Daniel Dunbar2da02722009-03-19 07:55:12 +00003145 // It is unfortunate that we have to claim here, as this means
3146 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003147 // platforms using a generic gcc, even if we are just using gcc
3148 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003149 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003150 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003151 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003152 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003153
Daniel Dunbar4e295052010-01-25 22:35:08 +00003154 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003155
3156 // If using a driver driver, force the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003157 const std::string &Arch = getToolChain().getArchName();
Bob Wilson6524dd32011-10-14 05:03:44 +00003158 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003159 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003160
3161 // FIXME: Remove these special cases.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003162 if (Arch == "powerpc")
3163 CmdArgs.push_back("ppc");
3164 else if (Arch == "powerpc64")
3165 CmdArgs.push_back("ppc64");
3166 else
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003167 CmdArgs.push_back(Args.MakeArgString(Arch));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003168 }
3169
Daniel Dunbar5716d872009-05-02 21:41:52 +00003170 // Try to force gcc to match the tool chain we want, if we recognize
3171 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003172 //
3173 // FIXME: The triple class should directly provide the information we want
3174 // here.
3175 if (Arch == "i386" || Arch == "powerpc")
Daniel Dunbar5716d872009-05-02 21:41:52 +00003176 CmdArgs.push_back("-m32");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003177 else if (Arch == "x86_64" || Arch == "powerpc64")
Daniel Dunbar5716d872009-05-02 21:41:52 +00003178 CmdArgs.push_back("-m64");
3179
Daniel Dunbarb440f562010-08-02 02:38:21 +00003180 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003181 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003182 CmdArgs.push_back(Output.getFilename());
3183 } else {
3184 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003185 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003186 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003187
Tony Linthicum76329bf2011-12-12 21:14:55 +00003188 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3189 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003190
3191 // Only pass -x if gcc will understand it; otherwise hope gcc
3192 // understands the suffix correctly. The main use case this would go
3193 // wrong in is for linker inputs if they happened to have an odd
3194 // suffix; really the only way to get this to happen is a command
3195 // like '-x foobar a.c' which will treat a.c like a linker input.
3196 //
3197 // FIXME: For the linker case specifically, can we safely convert
3198 // inputs into '-Wl,' options?
3199 for (InputInfoList::const_iterator
3200 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3201 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003202
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003203 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003204 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3205 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003206 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003207 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003208 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003209 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003210 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003211
Daniel Dunbara3246a02009-03-18 08:07:30 +00003212 if (types::canTypeBeUserSpecified(II.getType())) {
3213 CmdArgs.push_back("-x");
3214 CmdArgs.push_back(types::getTypeName(II.getType()));
3215 }
3216
Daniel Dunbarb440f562010-08-02 02:38:21 +00003217 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003218 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003219 else {
3220 const Arg &A = II.getInputArg();
3221
3222 // Reverse translate some rewritten options.
3223 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3224 CmdArgs.push_back("-lstdc++");
3225 continue;
3226 }
3227
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003228 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003229 A.render(Args, CmdArgs);
3230 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003231 }
3232
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003233 const std::string customGCCName = D.getCCCGenericGCCName();
3234 const char *GCCName;
3235 if (!customGCCName.empty())
3236 GCCName = customGCCName.c_str();
3237 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003238 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003239 } else
3240 GCCName = "gcc";
3241
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003242 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003243 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003244 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003245}
3246
Daniel Dunbar4e295052010-01-25 22:35:08 +00003247void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3248 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003249 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003250}
3251
Daniel Dunbar4e295052010-01-25 22:35:08 +00003252void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3253 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003254 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003255}
3256
Daniel Dunbar4e295052010-01-25 22:35:08 +00003257void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3258 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003259 const Driver &D = getToolChain().getDriver();
3260
Daniel Dunbar4e295052010-01-25 22:35:08 +00003261 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003262 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3263 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003264 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003265 else {
3266 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003267 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003268 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003269
Daniel Dunbar4e295052010-01-25 22:35:08 +00003270 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003271 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003272}
3273
Daniel Dunbar4e295052010-01-25 22:35:08 +00003274void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3275 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003276 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003277}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003278
Daniel Dunbar4e295052010-01-25 22:35:08 +00003279void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3280 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003281 // The types are (hopefully) good enough.
3282}
3283
Tony Linthicum76329bf2011-12-12 21:14:55 +00003284// Hexagon tools start.
3285void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3286 ArgStringList &CmdArgs) const {
3287
3288}
3289void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3290 const InputInfo &Output,
3291 const InputInfoList &Inputs,
3292 const ArgList &Args,
3293 const char *LinkingOutput) const {
3294
3295 const Driver &D = getToolChain().getDriver();
3296 ArgStringList CmdArgs;
3297
3298 std::string MarchString = "-march=";
3299 MarchString += getHexagonTargetCPU(Args);
3300 CmdArgs.push_back(Args.MakeArgString(MarchString));
3301
3302 RenderExtraToolArgs(JA, CmdArgs);
3303
3304 if (Output.isFilename()) {
3305 CmdArgs.push_back("-o");
3306 CmdArgs.push_back(Output.getFilename());
3307 } else {
3308 assert(Output.isNothing() && "Unexpected output");
3309 CmdArgs.push_back("-fsyntax-only");
3310 }
3311
3312
3313 // Only pass -x if gcc will understand it; otherwise hope gcc
3314 // understands the suffix correctly. The main use case this would go
3315 // wrong in is for linker inputs if they happened to have an odd
3316 // suffix; really the only way to get this to happen is a command
3317 // like '-x foobar a.c' which will treat a.c like a linker input.
3318 //
3319 // FIXME: For the linker case specifically, can we safely convert
3320 // inputs into '-Wl,' options?
3321 for (InputInfoList::const_iterator
3322 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3323 const InputInfo &II = *it;
3324
3325 // Don't try to pass LLVM or AST inputs to a generic gcc.
3326 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3327 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3328 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3329 << getToolChain().getTripleString();
3330 else if (II.getType() == types::TY_AST)
3331 D.Diag(clang::diag::err_drv_no_ast_support)
3332 << getToolChain().getTripleString();
3333
3334 if (II.isFilename())
3335 CmdArgs.push_back(II.getFilename());
3336 else
3337 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3338 II.getInputArg().render(Args, CmdArgs);
3339 }
3340
3341 const char *GCCName = "hexagon-as";
3342 const char *Exec =
3343 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3344 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3345
3346}
3347void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3348 ArgStringList &CmdArgs) const {
3349 // The types are (hopefully) good enough.
3350}
3351
3352void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3353 const InputInfo &Output,
3354 const InputInfoList &Inputs,
3355 const ArgList &Args,
3356 const char *LinkingOutput) const {
3357
3358 const Driver &D = getToolChain().getDriver();
3359 ArgStringList CmdArgs;
3360
3361 for (ArgList::const_iterator
3362 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3363 Arg *A = *it;
3364 if (A->getOption().hasForwardToGCC()) {
3365 // Don't forward any -g arguments to assembly steps.
3366 if (isa<AssembleJobAction>(JA) &&
3367 A->getOption().matches(options::OPT_g_Group))
3368 continue;
3369
3370 // It is unfortunate that we have to claim here, as this means
3371 // we will basically never report anything interesting for
3372 // platforms using a generic gcc, even if we are just using gcc
3373 // to get to the assembler.
3374 A->claim();
3375 A->render(Args, CmdArgs);
3376 }
3377 }
3378
3379 RenderExtraToolArgs(JA, CmdArgs);
3380
3381 // Add Arch Information
3382 Arg *A;
Sebastian Pop86500282012-01-13 20:37:10 +00003383 if ((A = getLastHexagonArchArg(Args))) {
3384 if (A->getOption().matches(options::OPT_m_Joined))
3385 A->render(Args, CmdArgs);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003386 else
Sebastian Pop86500282012-01-13 20:37:10 +00003387 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003388 }
Sebastian Pop86500282012-01-13 20:37:10 +00003389 else {
3390 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
3391 }
3392
Tony Linthicum76329bf2011-12-12 21:14:55 +00003393 CmdArgs.push_back("-mqdsp6-compat");
3394
3395 const char *GCCName;
3396 if (C.getDriver().CCCIsCXX)
3397 GCCName = "hexagon-g++";
3398 else
3399 GCCName = "hexagon-gcc";
3400 const char *Exec =
3401 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3402
3403 if (Output.isFilename()) {
3404 CmdArgs.push_back("-o");
3405 CmdArgs.push_back(Output.getFilename());
3406 }
3407
3408 for (InputInfoList::const_iterator
3409 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3410 const InputInfo &II = *it;
3411
3412 // Don't try to pass LLVM or AST inputs to a generic gcc.
3413 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3414 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3415 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3416 << getToolChain().getTripleString();
3417 else if (II.getType() == types::TY_AST)
3418 D.Diag(clang::diag::err_drv_no_ast_support)
3419 << getToolChain().getTripleString();
3420
3421 if (II.isFilename())
3422 CmdArgs.push_back(II.getFilename());
3423 else
3424 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3425 II.getInputArg().render(Args, CmdArgs);
3426 }
3427 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3428
3429}
3430// Hexagon tools end.
3431
3432
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003433const char *darwin::CC1::getCC1Name(types::ID Type) const {
3434 switch (Type) {
3435 default:
David Blaikie83d382b2011-09-23 05:06:16 +00003436 llvm_unreachable("Unexpected type for Darwin CC1 tool.");
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003437 case types::TY_Asm:
3438 case types::TY_C: case types::TY_CHeader:
3439 case types::TY_PP_C: case types::TY_PP_CHeader:
3440 return "cc1";
3441 case types::TY_ObjC: case types::TY_ObjCHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003442 case types::TY_PP_ObjC: case types::TY_PP_ObjC_Alias:
3443 case types::TY_PP_ObjCHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003444 return "cc1obj";
3445 case types::TY_CXX: case types::TY_CXXHeader:
3446 case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
3447 return "cc1plus";
3448 case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003449 case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXX_Alias:
3450 case types::TY_PP_ObjCXXHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003451 return "cc1objplus";
3452 }
3453}
3454
David Blaikie68e081d2011-12-20 02:48:34 +00003455void darwin::CC1::anchor() {}
3456
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003457const char *darwin::CC1::getBaseInputName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003458 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00003459 return Args.MakeArgString(
3460 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003461}
3462
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003463const char *darwin::CC1::getBaseInputStem(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003464 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003465 const char *Str = getBaseInputName(Args, Inputs);
3466
Chris Lattner906bb902011-01-16 08:14:11 +00003467 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003468 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003469
3470 return Str;
3471}
3472
3473const char *
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003474darwin::CC1::getDependencyFileName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003475 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003476 // FIXME: Think about this more.
3477 std::string Res;
3478
3479 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3480 std::string Str(OutputOpt->getValue(Args));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003481 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003482 } else {
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003483 Res = darwin::CC1::getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003484 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003485 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003486}
3487
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003488void darwin::CC1::RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const {
Eric Christopher84fbdb42011-08-19 00:30:14 +00003489 for (ArgStringList::iterator it = CmdArgs.begin(), ie = CmdArgs.end();
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003490 it != ie;) {
Chad Rosier2f818792011-08-18 17:56:32 +00003491
3492 StringRef Option = *it;
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003493 bool RemoveOption = false;
Chad Rosier30453862011-08-18 01:18:28 +00003494
Bob Wilson7ecbd322012-02-07 01:17:55 +00003495 // Erase both -fmodule-cache-path and its argument.
3496 if (Option.equals("-fmodule-cache-path") && it+2 != ie) {
3497 it = CmdArgs.erase(it, it+2);
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003498 ie = CmdArgs.end();
Chad Rosier30453862011-08-18 01:18:28 +00003499 continue;
3500 }
3501
Bob Wilson7ecbd322012-02-07 01:17:55 +00003502 // Remove unsupported -f options.
3503 if (Option.startswith("-f")) {
3504 // Remove -f/-fno- to reduce the number of cases.
3505 if (Option.startswith("-fno-"))
3506 Option = Option.substr(5);
3507 else
3508 Option = Option.substr(2);
3509 RemoveOption = llvm::StringSwitch<bool>(Option)
3510 .Case("altivec", true)
3511 .Case("modules", true)
3512 .Case("diagnostics-show-note-include-stack", true)
3513 .Default(false);
3514 }
3515
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003516 // Handle machine specific options.
3517 if (Option.startswith("-m")) {
3518 RemoveOption = llvm::StringSwitch<bool>(Option)
3519 .Case("-mthumb", true)
3520 .Case("-mno-thumb", true)
3521 .Case("-mno-fused-madd", true)
3522 .Case("-mlong-branch", true)
3523 .Case("-mlongcall", true)
3524 .Case("-mcpu=G4", true)
3525 .Case("-mcpu=G5", true)
3526 .Default(false);
3527 }
3528
3529 // Handle warning options.
3530 if (Option.startswith("-W")) {
3531 // Remove -W/-Wno- to reduce the number of cases.
3532 if (Option.startswith("-Wno-"))
3533 Option = Option.substr(5);
3534 else
3535 Option = Option.substr(2);
3536
3537 RemoveOption = llvm::StringSwitch<bool>(Option)
3538 .Case("address-of-temporary", true)
3539 .Case("ambiguous-member-template", true)
3540 .Case("analyzer-incompatible-plugin", true)
3541 .Case("array-bounds", true)
3542 .Case("array-bounds-pointer-arithmetic", true)
3543 .Case("bind-to-temporary-copy", true)
3544 .Case("bitwise-op-parentheses", true)
3545 .Case("bool-conversions", true)
3546 .Case("builtin-macro-redefined", true)
3547 .Case("c++-hex-floats", true)
3548 .Case("c++0x-compat", true)
3549 .Case("c++0x-extensions", true)
3550 .Case("c++0x-narrowing", true)
Richard Smith31ce7932011-10-13 23:32:09 +00003551 .Case("c++11-compat", true)
3552 .Case("c++11-extensions", true)
3553 .Case("c++11-narrowing", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003554 .Case("conditional-uninitialized", true)
3555 .Case("constant-conversion", true)
David Blaikieebcbe4b2012-03-15 04:50:32 +00003556 .Case("conversion-null", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003557 .Case("CFString-literal", true)
3558 .Case("constant-logical-operand", true)
3559 .Case("custom-atomic-properties", true)
3560 .Case("default-arg-special-member", true)
3561 .Case("delegating-ctor-cycles", true)
3562 .Case("delete-non-virtual-dtor", true)
3563 .Case("deprecated-implementations", true)
3564 .Case("deprecated-writable-strings", true)
3565 .Case("distributed-object-modifiers", true)
3566 .Case("duplicate-method-arg", true)
3567 .Case("dynamic-class-memaccess", true)
3568 .Case("enum-compare", true)
3569 .Case("exit-time-destructors", true)
3570 .Case("gnu", true)
3571 .Case("gnu-designator", true)
3572 .Case("header-hygiene", true)
3573 .Case("idiomatic-parentheses", true)
3574 .Case("ignored-qualifiers", true)
3575 .Case("implicit-atomic-properties", true)
3576 .Case("incompatible-pointer-types", true)
3577 .Case("incomplete-implementation", true)
3578 .Case("initializer-overrides", true)
3579 .Case("invalid-noreturn", true)
3580 .Case("invalid-token-paste", true)
Ivan Krasin31f74112011-10-06 02:46:34 +00003581 .Case("language-extension-token", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003582 .Case("literal-conversion", true)
3583 .Case("literal-range", true)
3584 .Case("local-type-template-args", true)
3585 .Case("logical-op-parentheses", true)
3586 .Case("method-signatures", true)
3587 .Case("microsoft", true)
3588 .Case("mismatched-tags", true)
3589 .Case("missing-method-return-type", true)
3590 .Case("non-pod-varargs", true)
3591 .Case("nonfragile-abi2", true)
3592 .Case("null-arithmetic", true)
3593 .Case("null-dereference", true)
3594 .Case("out-of-line-declaration", true)
3595 .Case("overriding-method-mismatch", true)
3596 .Case("readonly-setter-attrs", true)
3597 .Case("return-stack-address", true)
3598 .Case("self-assign", true)
3599 .Case("semicolon-before-method-body", true)
3600 .Case("sentinel", true)
3601 .Case("shift-overflow", true)
3602 .Case("shift-sign-overflow", true)
3603 .Case("sign-conversion", true)
3604 .Case("sizeof-array-argument", true)
3605 .Case("sizeof-pointer-memaccess", true)
3606 .Case("string-compare", true)
3607 .Case("super-class-method-mismatch", true)
3608 .Case("tautological-compare", true)
3609 .Case("typedef-redefinition", true)
3610 .Case("typename-missing", true)
3611 .Case("undefined-reinterpret-cast", true)
3612 .Case("unknown-warning-option", true)
3613 .Case("unnamed-type-template-args", true)
3614 .Case("unneeded-internal-declaration", true)
3615 .Case("unneeded-member-function", true)
3616 .Case("unused-comparison", true)
3617 .Case("unused-exception-parameter", true)
3618 .Case("unused-member-function", true)
3619 .Case("unused-result", true)
3620 .Case("vector-conversions", true)
3621 .Case("vla", true)
3622 .Case("used-but-marked-unused", true)
3623 .Case("weak-vtables", true)
3624 .Default(false);
3625 } // if (Option.startswith("-W"))
Chad Rosier30453862011-08-18 01:18:28 +00003626 if (RemoveOption) {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003627 it = CmdArgs.erase(it);
Chad Rosier23594f62011-08-17 18:51:56 +00003628 ie = CmdArgs.end();
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003629 } else {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003630 ++it;
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003631 }
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003632 }
3633}
3634
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003635void darwin::CC1::AddCC1Args(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003636 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003637 const Driver &D = getToolChain().getDriver();
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003638
3639 CheckCodeGenerationOptions(D, Args);
3640
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003641 // Derived from cc1 spec.
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003642 if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) &&
3643 !Args.hasArg(options::OPT_mdynamic_no_pic))
3644 CmdArgs.push_back("-fPIC");
3645
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003646 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3647 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3648 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3649 CmdArgs.push_back("-fno-builtin-strcat");
3650 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3651 CmdArgs.push_back("-fno-builtin-strcpy");
3652 }
3653
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003654 if (Args.hasArg(options::OPT_g_Flag) &&
3655 !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
3656 CmdArgs.push_back("-feliminate-unused-debug-symbols");
3657}
3658
3659void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3660 const InputInfoList &Inputs,
3661 const ArgStringList &OutputArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003662 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003663
3664 // Derived from cc1_options spec.
3665 if (Args.hasArg(options::OPT_fast) ||
3666 Args.hasArg(options::OPT_fastf) ||
3667 Args.hasArg(options::OPT_fastcp))
3668 CmdArgs.push_back("-O3");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003669
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003670 if (Arg *A = Args.getLastArg(options::OPT_pg))
3671 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003672 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003673 << A->getAsString(Args) << "-fomit-frame-pointer";
3674
3675 AddCC1Args(Args, CmdArgs);
3676
3677 if (!Args.hasArg(options::OPT_Q))
3678 CmdArgs.push_back("-quiet");
3679
3680 CmdArgs.push_back("-dumpbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003681 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003682
3683 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3684
3685 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
3686 Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
3687
3688 // FIXME: The goal is to use the user provided -o if that is our
3689 // final output, otherwise to drive from the original input
3690 // name. Find a clean way to go about this.
3691 if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
3692 Args.hasArg(options::OPT_o)) {
3693 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
3694 CmdArgs.push_back("-auxbase-strip");
3695 CmdArgs.push_back(OutputOpt->getValue(Args));
3696 } else {
3697 CmdArgs.push_back("-auxbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003698 CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003699 }
3700
3701 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3702
3703 Args.AddAllArgs(CmdArgs, options::OPT_O);
3704 // FIXME: -Wall is getting some special treatment. Investigate.
3705 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3706 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003707 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003708 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003709 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3710 // Honor -std-default.
3711 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3712 "-std=", /*Joined=*/true);
3713 }
3714
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003715 if (Args.hasArg(options::OPT_v))
3716 CmdArgs.push_back("-version");
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003717 if (Args.hasArg(options::OPT_pg) &&
3718 getToolChain().SupportsProfiling())
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003719 CmdArgs.push_back("-p");
3720 Args.AddLastArg(CmdArgs, options::OPT_p);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003721
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003722 // The driver treats -fsyntax-only specially.
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003723 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3724 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3725 // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
3726 // used to inhibit the default -fno-builtin-str{cat,cpy}.
3727 //
3728 // FIXME: Should we grow a better way to deal with "removing" args?
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003729 for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
3730 options::OPT_fsyntax_only),
3731 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003732 if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
3733 !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
3734 (*it)->claim();
3735 (*it)->render(Args, CmdArgs);
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003736 }
3737 }
3738 } else
3739 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003740
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003741 // Claim Clang only -f options, they aren't worth warning about.
3742 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3743
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003744 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3745 if (Args.hasArg(options::OPT_Qn))
3746 CmdArgs.push_back("-fno-ident");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003747
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003748 // FIXME: This isn't correct.
3749 //Args.AddLastArg(CmdArgs, options::OPT__help)
3750 //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
3751
3752 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3753
3754 // FIXME: Still don't get what is happening here. Investigate.
3755 Args.AddAllArgs(CmdArgs, options::OPT__param);
3756
3757 if (Args.hasArg(options::OPT_fmudflap) ||
3758 Args.hasArg(options::OPT_fmudflapth)) {
3759 CmdArgs.push_back("-fno-builtin");
3760 CmdArgs.push_back("-fno-merge-constants");
3761 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003762
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003763 if (Args.hasArg(options::OPT_coverage)) {
3764 CmdArgs.push_back("-fprofile-arcs");
3765 CmdArgs.push_back("-ftest-coverage");
3766 }
3767
3768 if (types::isCXX(Inputs[0].getType()))
3769 CmdArgs.push_back("-D__private_extern__=extern");
3770}
3771
3772void darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3773 const InputInfoList &Inputs,
3774 const ArgStringList &OutputArgs) const {
3775 // Derived from cpp_options
3776 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003777
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003778 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3779
3780 AddCC1Args(Args, CmdArgs);
3781
3782 // NOTE: The code below has some commonality with cpp_options, but
3783 // in classic gcc style ends up sending things in different
3784 // orders. This may be a good merge candidate once we drop pedantic
3785 // compatibility.
3786
3787 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003788 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003789 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003790 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3791 // Honor -std-default.
3792 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3793 "-std=", /*Joined=*/true);
3794 }
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003795 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3796 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003797
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003798 // The driver treats -fsyntax-only specially.
3799 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
3800
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003801 // Claim Clang only -f options, they aren't worth warning about.
3802 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3803
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003804 if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
3805 !Args.hasArg(options::OPT_fno_working_directory))
3806 CmdArgs.push_back("-fworking-directory");
3807
3808 Args.AddAllArgs(CmdArgs, options::OPT_O);
3809 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3810 if (Args.hasArg(options::OPT_save_temps))
3811 CmdArgs.push_back("-fpch-preprocess");
3812}
3813
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003814void darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003815 ArgStringList &CmdArgs,
Mike Stump11289f42009-09-09 15:08:12 +00003816 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003817 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003818
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003819 CheckPreprocessingOptions(D, Args);
3820
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003821 // Derived from cpp_unique_options.
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003822 // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
3823 Args.AddLastArg(CmdArgs, options::OPT_C);
3824 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003825 if (!Args.hasArg(options::OPT_Q))
3826 CmdArgs.push_back("-quiet");
3827 Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
Douglas Gregor64b046f2010-03-24 20:13:48 +00003828 Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003829 Args.AddLastArg(CmdArgs, options::OPT_v);
3830 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
3831 Args.AddLastArg(CmdArgs, options::OPT_P);
3832
3833 // FIXME: Handle %I properly.
3834 if (getToolChain().getArchName() == "x86_64") {
3835 CmdArgs.push_back("-imultilib");
3836 CmdArgs.push_back("x86_64");
3837 }
3838
3839 if (Args.hasArg(options::OPT_MD)) {
3840 CmdArgs.push_back("-MD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003841 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003842 }
3843
3844 if (Args.hasArg(options::OPT_MMD)) {
3845 CmdArgs.push_back("-MMD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003846 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003847 }
3848
3849 Args.AddLastArg(CmdArgs, options::OPT_M);
3850 Args.AddLastArg(CmdArgs, options::OPT_MM);
3851 Args.AddAllArgs(CmdArgs, options::OPT_MF);
3852 Args.AddLastArg(CmdArgs, options::OPT_MG);
3853 Args.AddLastArg(CmdArgs, options::OPT_MP);
3854 Args.AddAllArgs(CmdArgs, options::OPT_MQ);
3855 Args.AddAllArgs(CmdArgs, options::OPT_MT);
3856 if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
3857 (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
3858 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3859 CmdArgs.push_back("-MQ");
3860 CmdArgs.push_back(OutputOpt->getValue(Args));
3861 }
3862 }
3863
3864 Args.AddLastArg(CmdArgs, options::OPT_remap);
3865 if (Args.hasArg(options::OPT_g3))
3866 CmdArgs.push_back("-dD");
3867 Args.AddLastArg(CmdArgs, options::OPT_H);
3868
3869 AddCPPArgs(Args, CmdArgs);
3870
3871 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
3872 Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
3873
3874 for (InputInfoList::const_iterator
3875 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3876 const InputInfo &II = *it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003877
Daniel Dunbarb440f562010-08-02 02:38:21 +00003878 CmdArgs.push_back(II.getFilename());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003879 }
3880
3881 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
3882 options::OPT_Xpreprocessor);
3883
3884 if (Args.hasArg(options::OPT_fmudflap)) {
3885 CmdArgs.push_back("-D_MUDFLAP");
3886 CmdArgs.push_back("-include");
3887 CmdArgs.push_back("mf-runtime.h");
3888 }
3889
3890 if (Args.hasArg(options::OPT_fmudflapth)) {
3891 CmdArgs.push_back("-D_MUDFLAP");
3892 CmdArgs.push_back("-D_MUDFLAPTH");
3893 CmdArgs.push_back("-include");
3894 CmdArgs.push_back("mf-runtime.h");
3895 }
3896}
3897
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003898void darwin::CC1::AddCPPArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003899 ArgStringList &CmdArgs) const {
3900 // Derived from cpp spec.
3901
3902 if (Args.hasArg(options::OPT_static)) {
3903 // The gcc spec is broken here, it refers to dynamic but
3904 // that has been translated. Start by being bug compatible.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003905
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003906 // if (!Args.hasArg(arglist.parser.dynamicOption))
3907 CmdArgs.push_back("-D__STATIC__");
3908 } else
3909 CmdArgs.push_back("-D__DYNAMIC__");
3910
3911 if (Args.hasArg(options::OPT_pthread))
3912 CmdArgs.push_back("-D_REENTRANT");
3913}
3914
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003915void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003916 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003917 const InputInfoList &Inputs,
3918 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003919 const char *LinkingOutput) const {
3920 ArgStringList CmdArgs;
3921
3922 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3923
3924 CmdArgs.push_back("-E");
3925
3926 if (Args.hasArg(options::OPT_traditional) ||
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003927 Args.hasArg(options::OPT_traditional_cpp))
3928 CmdArgs.push_back("-traditional-cpp");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003929
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003930 ArgStringList OutputArgs;
Daniel Dunbarb440f562010-08-02 02:38:21 +00003931 assert(Output.isFilename() && "Unexpected CC1 output.");
3932 OutputArgs.push_back("-o");
3933 OutputArgs.push_back(Output.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003934
Joerg Sonnenbergerb86f5f42011-03-06 23:31:01 +00003935 if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
Daniel Dunbarf64f5302009-03-29 22:27:40 +00003936 AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3937 } else {
3938 AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
3939 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3940 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003941
Daniel Dunbar6a8803a2009-04-03 01:27:06 +00003942 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3943
Chad Rosierc31e48d2011-09-08 00:38:00 +00003944 RemoveCC1UnsupportedArgs(CmdArgs);
3945
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003946 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003947 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003948 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003949 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003950}
3951
3952void darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003953 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003954 const InputInfoList &Inputs,
3955 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003956 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003957 const Driver &D = getToolChain().getDriver();
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003958 ArgStringList CmdArgs;
3959
3960 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3961
Bob Wilson0090df22012-04-01 23:03:29 +00003962 // Silence warning about unused --serialize-diagnostics
3963 Args.ClaimAllArgs(options::OPT__serialize_diags);
3964
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003965 types::ID InputType = Inputs[0].getType();
David Blaikie747ff7e2012-04-04 20:43:14 +00003966 if (const Arg *A = Args.getLastArg(options::OPT_traditional))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003967 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003968 << A->getAsString(Args) << "-E";
3969
Daniel Dunbar24e52992010-06-07 23:28:45 +00003970 if (JA.getType() == types::TY_LLVM_IR ||
3971 JA.getType() == types::TY_LTO_IR)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003972 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003973 else if (JA.getType() == types::TY_LLVM_BC ||
3974 JA.getType() == types::TY_LTO_BC)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003975 CmdArgs.push_back("-emit-llvm-bc");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003976 else if (Output.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003977 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003978 << getToolChain().getTripleString();
Daniel Dunbarbcd554f2010-02-11 17:33:45 +00003979 else if (JA.getType() != types::TY_PP_Asm &&
3980 JA.getType() != types::TY_PCH)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003981 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003982 << getTypeName(JA.getType());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003983
3984 ArgStringList OutputArgs;
3985 if (Output.getType() != types::TY_PCH) {
3986 OutputArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00003987 if (Output.isNothing())
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003988 OutputArgs.push_back("/dev/null");
3989 else
3990 OutputArgs.push_back(Output.getFilename());
3991 }
3992
3993 // There is no need for this level of compatibility, but it makes
3994 // diffing easier.
3995 bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
3996 Args.hasArg(options::OPT_S));
3997
3998 if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003999 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004000 if (OutputArgsEarly) {
4001 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4002 } else {
4003 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4004 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4005 }
4006 } else {
4007 CmdArgs.push_back("-fpreprocessed");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004008
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004009 for (InputInfoList::const_iterator
4010 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4011 const InputInfo &II = *it;
4012
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004013 // Reject AST inputs.
4014 if (II.getType() == types::TY_AST) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004015 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004016 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004017 return;
4018 }
4019
Daniel Dunbarb440f562010-08-02 02:38:21 +00004020 CmdArgs.push_back(II.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004021 }
4022
4023 if (OutputArgsEarly) {
4024 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4025 } else {
4026 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4027 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4028 }
4029 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004030
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004031 if (Output.getType() == types::TY_PCH) {
4032 assert(Output.isFilename() && "Invalid PCH output.");
4033
4034 CmdArgs.push_back("-o");
4035 // NOTE: gcc uses a temp .s file for this, but there doesn't seem
4036 // to be a good reason.
Chad Rosier96d690c2011-08-01 19:58:48 +00004037 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004038 D.GetTemporaryPath("cc", "s"));
Chad Rosier96d690c2011-08-01 19:58:48 +00004039 C.addTempFile(TmpPath);
4040 CmdArgs.push_back(TmpPath);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004041
Eric Christopher84fbdb42011-08-19 00:30:14 +00004042 // If we're emitting a pch file with the last 4 characters of ".pth"
4043 // and falling back to llvm-gcc we want to use ".gch" instead.
4044 std::string OutputFile(Output.getFilename());
4045 size_t loc = OutputFile.rfind(".pth");
4046 if (loc != std::string::npos)
4047 OutputFile.replace(loc, 4, ".gch");
4048 const char *Tmp = C.getArgs().MakeArgString("--output-pch="+OutputFile);
4049 CmdArgs.push_back(Tmp);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004050 }
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004051
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00004052 RemoveCC1UnsupportedArgs(CmdArgs);
4053
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004054 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004055 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004056 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004057 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004058}
4059
Daniel Dunbarbe220842009-03-20 16:06:39 +00004060void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004061 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004062 const InputInfoList &Inputs,
4063 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004064 const char *LinkingOutput) const {
4065 ArgStringList CmdArgs;
4066
4067 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4068 const InputInfo &Input = Inputs[0];
4069
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004070 // Determine the original source input.
4071 const Action *SourceAction = &JA;
4072 while (SourceAction->getKind() != Action::InputClass) {
4073 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4074 SourceAction = SourceAction->getInputs()[0];
4075 }
4076
4077 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004078 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004079 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004080 if (Args.hasArg(options::OPT_gstabs))
4081 CmdArgs.push_back("--gstabs");
4082 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004083 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004084 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004085
Daniel Dunbarbe220842009-03-20 16:06:39 +00004086 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004087 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004088
Daniel Dunbar6d484762010-07-22 01:47:22 +00004089 // Use -force_cpusubtype_ALL on x86 by default.
4090 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4091 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004092 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4093 CmdArgs.push_back("-force_cpusubtype_ALL");
4094
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004095 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
4096 (Args.hasArg(options::OPT_mkernel) ||
Daniel Dunbarbe220842009-03-20 16:06:39 +00004097 Args.hasArg(options::OPT_static) ||
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004098 Args.hasArg(options::OPT_fapple_kext)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004099 CmdArgs.push_back("-static");
4100
Daniel Dunbarbe220842009-03-20 16:06:39 +00004101 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4102 options::OPT_Xassembler);
4103
4104 assert(Output.isFilename() && "Unexpected lipo output.");
4105 CmdArgs.push_back("-o");
4106 CmdArgs.push_back(Output.getFilename());
4107
Daniel Dunbarb440f562010-08-02 02:38:21 +00004108 assert(Input.isFilename() && "Invalid input.");
4109 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004110
4111 // asm_final spec is empty.
4112
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004113 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004114 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004115 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004116}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004117
David Blaikie68e081d2011-12-20 02:48:34 +00004118void darwin::DarwinTool::anchor() {}
4119
Daniel Dunbare9ded432009-09-09 18:36:20 +00004120void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4121 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004122 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004123
Daniel Dunbarc1964212009-03-26 16:23:12 +00004124 // Derived from darwin_arch spec.
4125 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004126 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004127
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004128 // FIXME: Is this needed anymore?
4129 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004130 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004131}
4132
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004133void darwin::Link::AddLinkArgs(Compilation &C,
4134 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004135 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004136 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004137 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004138
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004139 unsigned Version[3] = { 0, 0, 0 };
4140 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4141 bool HadExtra;
4142 if (!Driver::GetReleaseVersion(A->getValue(Args), Version[0],
4143 Version[1], Version[2], HadExtra) ||
4144 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004145 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004146 << A->getAsString(Args);
4147 }
4148
4149 // Newer linkers support -demangle, pass it if supported and not disabled by
4150 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004151 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004152 // Don't pass -demangle to ld_classic.
4153 //
4154 // FIXME: This is a temporary workaround, ld should be handling this.
4155 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4156 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004157 if (getToolChain().getArch() == llvm::Triple::x86) {
4158 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4159 options::OPT_Wl_COMMA),
4160 ie = Args.filtered_end(); it != ie; ++it) {
4161 const Arg *A = *it;
4162 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004163 if (StringRef(A->getValue(Args, i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004164 UsesLdClassic = true;
4165 }
4166 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004167 if (!UsesLdClassic)
4168 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004169 }
4170
Daniel Dunbaref889c72011-06-21 20:55:11 +00004171 // If we are using LTO, then automatically create a temporary file path for
4172 // the linker to use, so that it's lifetime will extend past a possible
4173 // dsymutil step.
Daniel Dunbar3d125d32011-06-21 21:18:32 +00004174 if (Version[0] >= 116 && D.IsUsingLTO(Args)) {
Daniel Dunbaref889c72011-06-21 20:55:11 +00004175 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004176 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Daniel Dunbaref889c72011-06-21 20:55:11 +00004177 C.addTempFile(TmpPath);
4178 CmdArgs.push_back("-object_path_lto");
4179 CmdArgs.push_back(TmpPath);
4180 }
4181
Daniel Dunbarc1964212009-03-26 16:23:12 +00004182 // Derived from the "link" spec.
4183 Args.AddAllArgs(CmdArgs, options::OPT_static);
4184 if (!Args.hasArg(options::OPT_static))
4185 CmdArgs.push_back("-dynamic");
4186 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4187 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4188 // here. How do we wish to handle such things?
4189 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004190
Daniel Dunbarc1964212009-03-26 16:23:12 +00004191 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004192 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004193 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004194 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004195
4196 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4197 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4198 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4199
4200 Arg *A;
4201 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4202 (A = Args.getLastArg(options::OPT_current__version)) ||
4203 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004204 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004205 << A->getAsString(Args) << "-dynamiclib";
4206
4207 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4208 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4209 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4210 } else {
4211 CmdArgs.push_back("-dylib");
4212
4213 Arg *A;
4214 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4215 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4216 (A = Args.getLastArg(options::OPT_client__name)) ||
4217 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4218 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4219 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004220 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004221 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004222
Daniel Dunbarc1964212009-03-26 16:23:12 +00004223 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4224 "-dylib_compatibility_version");
4225 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4226 "-dylib_current_version");
4227
Daniel Dunbara48823f2010-01-22 02:04:52 +00004228 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004229
4230 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4231 "-dylib_install_name");
4232 }
4233
4234 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4235 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4236 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004237 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004238 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004239 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4240 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4241 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4242 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4243 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4244 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004245 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004246 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4247 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4248 Args.AddAllArgs(CmdArgs, options::OPT_init);
4249
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004250 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004251 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004252
4253 // If we had an explicit -mios-simulator-version-min argument, honor that,
4254 // otherwise use the traditional deployment targets. We can't just check the
4255 // is-sim attribute because existing code follows this path, and the linker
4256 // may not handle the argument.
4257 //
4258 // FIXME: We may be able to remove this, once we can verify no one depends on
4259 // it.
4260 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4261 CmdArgs.push_back("-ios_simulator_version_min");
4262 else if (DarwinTC.isTargetIPhoneOS())
4263 CmdArgs.push_back("-iphoneos_version_min");
4264 else
4265 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004266 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004267
Daniel Dunbarc1964212009-03-26 16:23:12 +00004268 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4269 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4270 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4271 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4272 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004273
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004274 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4275 options::OPT_fno_pie,
4276 options::OPT_fno_PIE)) {
4277 if (A->getOption().matches(options::OPT_fpie) ||
4278 A->getOption().matches(options::OPT_fPIE))
4279 CmdArgs.push_back("-pie");
4280 else
4281 CmdArgs.push_back("-no_pie");
4282 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004283
4284 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4285 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4286 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4287 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4288 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4289 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4290 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4291 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4292 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4293 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4294 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4295 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4296 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4297 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4298 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4299 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004300
Daniel Dunbar84384642011-05-02 21:03:47 +00004301 // Give --sysroot= preference, over the Apple specific behavior to also use
4302 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004303 StringRef sysroot = C.getSysRoot();
4304 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004305 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004306 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004307 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4308 CmdArgs.push_back("-syslibroot");
4309 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004310 }
4311
Daniel Dunbarc1964212009-03-26 16:23:12 +00004312 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4313 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4314 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4315 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4316 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004317 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004318 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4319 Args.AddAllArgs(CmdArgs, options::OPT_y);
4320 Args.AddLastArg(CmdArgs, options::OPT_w);
4321 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4322 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4323 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4324 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4325 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4326 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4327 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4328 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4329 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4330 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4331 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4332 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4333}
4334
4335void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004336 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004337 const InputInfoList &Inputs,
4338 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004339 const char *LinkingOutput) const {
4340 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004341
Daniel Dunbarc1964212009-03-26 16:23:12 +00004342 // The logic here is derived from gcc's behavior; most of which
4343 // comes from specs (starting with link_command). Consult gcc for
4344 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004345 ArgStringList CmdArgs;
4346
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004347 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4348 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4349 options::OPT_ccc_arcmt_migrate)) {
4350 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4351 (*I)->claim();
4352 const char *Exec =
4353 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4354 CmdArgs.push_back(Output.getFilename());
4355 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4356 return;
4357 }
4358
Daniel Dunbarc1964212009-03-26 16:23:12 +00004359 // I'm not sure why this particular decomposition exists in gcc, but
4360 // we follow suite for ease of comparison.
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004361 AddLinkArgs(C, Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004362
Daniel Dunbarc1964212009-03-26 16:23:12 +00004363 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4364 Args.AddAllArgs(CmdArgs, options::OPT_s);
4365 Args.AddAllArgs(CmdArgs, options::OPT_t);
4366 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4367 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004368 Args.AddLastArg(CmdArgs, options::OPT_e);
4369 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4370 Args.AddAllArgs(CmdArgs, options::OPT_r);
4371
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004372 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4373 // members of static archive libraries which implement Objective-C classes or
4374 // categories.
4375 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4376 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004377
Daniel Dunbarc1964212009-03-26 16:23:12 +00004378 CmdArgs.push_back("-o");
4379 CmdArgs.push_back(Output.getFilename());
4380
Chad Rosier06fd3c62012-05-16 23:45:12 +00004381 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004382 !Args.hasArg(options::OPT_nostartfiles)) {
4383 // Derived from startfile spec.
4384 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004385 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004386 if (getDarwinToolChain().isTargetIOSSimulator()) {
4387 // The simulator doesn't have a versioned crt1 file.
4388 CmdArgs.push_back("-ldylib1.o");
4389 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004390 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4391 CmdArgs.push_back("-ldylib1.o");
4392 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004393 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004394 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004395 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004396 CmdArgs.push_back("-ldylib1.10.5.o");
4397 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004398 } else {
4399 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004400 if (!Args.hasArg(options::OPT_static)) {
4401 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004402 if (getDarwinToolChain().isTargetIOSSimulator()) {
4403 // The simulator doesn't have a versioned crt1 file.
4404 CmdArgs.push_back("-lbundle1.o");
4405 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004406 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4407 CmdArgs.push_back("-lbundle1.o");
4408 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004409 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004410 CmdArgs.push_back("-lbundle1.o");
4411 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004412 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004413 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004414 if (Args.hasArg(options::OPT_pg) &&
4415 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004416 if (Args.hasArg(options::OPT_static) ||
4417 Args.hasArg(options::OPT_object) ||
4418 Args.hasArg(options::OPT_preload)) {
4419 CmdArgs.push_back("-lgcrt0.o");
4420 } else {
4421 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004422
Daniel Dunbarc1964212009-03-26 16:23:12 +00004423 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004424 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004425 // By default on OS X 10.8 and later, we don't link with a crt1.o
4426 // file and the linker knows to use _main as the entry point. But,
4427 // when compiling with -pg, we need to link with the gcrt1.o file,
4428 // so pass the -no_new_main option to tell the linker to use the
4429 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004430 if (getDarwinToolChain().isTargetMacOS() &&
4431 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4432 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004433 } else {
4434 if (Args.hasArg(options::OPT_static) ||
4435 Args.hasArg(options::OPT_object) ||
4436 Args.hasArg(options::OPT_preload)) {
4437 CmdArgs.push_back("-lcrt0.o");
4438 } else {
4439 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004440 if (getDarwinToolChain().isTargetIOSSimulator()) {
4441 // The simulator doesn't have a versioned crt1 file.
4442 CmdArgs.push_back("-lcrt1.o");
4443 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004444 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4445 CmdArgs.push_back("-lcrt1.o");
4446 else
4447 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004448 } else {
4449 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4450 CmdArgs.push_back("-lcrt1.o");
4451 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4452 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004453 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004454 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004455
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004456 // darwin_crt2 spec is empty.
4457 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004458 }
4459 }
4460 }
4461 }
4462
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004463 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4464 Args.hasArg(options::OPT_shared_libgcc) &&
4465 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004466 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004467 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004468 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004469 }
4470 }
4471
4472 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004473
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004474 // If we're building a dynamic lib with -faddress-sanitizer, unresolved
4475 // symbols may appear. Mark all of them as dynamic_lookup.
4476 // Linking executables is handled in lib/Driver/ToolChains.cpp.
4477 if (Args.hasFlag(options::OPT_faddress_sanitizer,
4478 options::OPT_fno_address_sanitizer, false)) {
4479 if (Args.hasArg(options::OPT_dynamiclib) ||
4480 Args.hasArg(options::OPT_bundle)) {
4481 CmdArgs.push_back("-undefined");
4482 CmdArgs.push_back("dynamic_lookup");
4483 }
4484 }
4485
Daniel Dunbarc1964212009-03-26 16:23:12 +00004486 if (Args.hasArg(options::OPT_fopenmp))
4487 // This is more complicated in gcc...
4488 CmdArgs.push_back("-lgomp");
4489
Douglas Gregor9295df02012-05-15 21:00:27 +00004490 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4491
Bob Wilson16d93952012-05-15 18:57:39 +00004492 if (isObjCRuntimeLinked(Args) &&
4493 !Args.hasArg(options::OPT_nostdlib) &&
4494 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004495 // Avoid linking compatibility stubs on i386 mac.
4496 if (!getDarwinToolChain().isTargetMacOS() ||
4497 getDarwinToolChain().getArchName() != "i386") {
4498 // If we don't have ARC or subscripting runtime support, link in the
4499 // runtime stubs. We have to do this *before* adding any of the normal
4500 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004501 ObjCRuntime runtime =
4502 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004503 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004504 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004505 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004506 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004507 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004508 CmdArgs.push_back("-framework");
4509 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004510 // Link libobj.
4511 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004512 }
John McCall31168b02011-06-15 23:02:42 +00004513
Daniel Dunbarc1964212009-03-26 16:23:12 +00004514 if (LinkingOutput) {
4515 CmdArgs.push_back("-arch_multiple");
4516 CmdArgs.push_back("-final_output");
4517 CmdArgs.push_back(LinkingOutput);
4518 }
4519
Daniel Dunbarc1964212009-03-26 16:23:12 +00004520 if (Args.hasArg(options::OPT_fnested_functions))
4521 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004522
Daniel Dunbarc1964212009-03-26 16:23:12 +00004523 if (!Args.hasArg(options::OPT_nostdlib) &&
4524 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004525 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004526 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004527
Daniel Dunbarc1964212009-03-26 16:23:12 +00004528 // link_ssp spec is empty.
4529
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004530 // Let the tool chain choose which runtime library to link.
4531 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004532 }
4533
Chad Rosier06fd3c62012-05-16 23:45:12 +00004534 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004535 !Args.hasArg(options::OPT_nostartfiles)) {
4536 // endfile_spec is empty.
4537 }
4538
4539 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4540 Args.AddAllArgs(CmdArgs, options::OPT_F);
4541
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004542 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004543 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004544 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004545}
4546
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004547void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004548 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004549 const InputInfoList &Inputs,
4550 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004551 const char *LinkingOutput) const {
4552 ArgStringList CmdArgs;
4553
4554 CmdArgs.push_back("-create");
4555 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004556
4557 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004558 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004559
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004560 for (InputInfoList::const_iterator
4561 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4562 const InputInfo &II = *it;
4563 assert(II.isFilename() && "Unexpected lipo input.");
4564 CmdArgs.push_back(II.getFilename());
4565 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004566 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004567 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004568 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004569}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004570
Daniel Dunbar88299622010-06-04 18:28:36 +00004571void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004572 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004573 const InputInfoList &Inputs,
4574 const ArgList &Args,
4575 const char *LinkingOutput) const {
4576 ArgStringList CmdArgs;
4577
Daniel Dunbareb86b042011-05-09 17:23:16 +00004578 CmdArgs.push_back("-o");
4579 CmdArgs.push_back(Output.getFilename());
4580
Daniel Dunbar88299622010-06-04 18:28:36 +00004581 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4582 const InputInfo &Input = Inputs[0];
4583 assert(Input.isFilename() && "Unexpected dsymutil input.");
4584 CmdArgs.push_back(Input.getFilename());
4585
Daniel Dunbar88299622010-06-04 18:28:36 +00004586 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004587 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004588 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004589}
4590
Eric Christopher551ef452011-08-23 17:56:55 +00004591void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4592 const InputInfo &Output,
4593 const InputInfoList &Inputs,
4594 const ArgList &Args,
4595 const char *LinkingOutput) const {
4596 ArgStringList CmdArgs;
4597 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004598 CmdArgs.push_back("--debug-info");
4599 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004600 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004601
4602 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4603 const InputInfo &Input = Inputs[0];
4604 assert(Input.isFilename() && "Unexpected verify input");
4605
4606 // Grabbing the output of the earlier dsymutil run.
4607 CmdArgs.push_back(Input.getFilename());
4608
4609 const char *Exec =
4610 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4611 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4612}
4613
David Chisnallf571cde2012-02-15 13:39:01 +00004614void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4615 const InputInfo &Output,
4616 const InputInfoList &Inputs,
4617 const ArgList &Args,
4618 const char *LinkingOutput) const {
4619 ArgStringList CmdArgs;
4620
4621 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4622 options::OPT_Xassembler);
4623
4624 CmdArgs.push_back("-o");
4625 CmdArgs.push_back(Output.getFilename());
4626
4627 for (InputInfoList::const_iterator
4628 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4629 const InputInfo &II = *it;
4630 CmdArgs.push_back(II.getFilename());
4631 }
4632
4633 const char *Exec =
4634 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4635 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4636}
4637
4638
4639void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4640 const InputInfo &Output,
4641 const InputInfoList &Inputs,
4642 const ArgList &Args,
4643 const char *LinkingOutput) const {
4644 // FIXME: Find a real GCC, don't hard-code versions here
4645 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4646 const llvm::Triple &T = getToolChain().getTriple();
4647 std::string LibPath = "/usr/lib/";
4648 llvm::Triple::ArchType Arch = T.getArch();
4649 switch (Arch) {
4650 case llvm::Triple::x86:
4651 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4652 T.getOSName()).str() + "/4.5.2/";
4653 break;
4654 case llvm::Triple::x86_64:
4655 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4656 T.getOSName()).str();
4657 GCCLibPath += "/4.5.2/amd64/";
4658 LibPath += "amd64/";
4659 break;
4660 default:
4661 assert(0 && "Unsupported architecture");
4662 }
4663
4664 ArgStringList CmdArgs;
4665
David Chisnall272a0712012-02-29 15:06:12 +00004666 // Demangle C++ names in errors
4667 CmdArgs.push_back("-C");
4668
David Chisnallf571cde2012-02-15 13:39:01 +00004669 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4670 (!Args.hasArg(options::OPT_shared))) {
4671 CmdArgs.push_back("-e");
4672 CmdArgs.push_back("_start");
4673 }
4674
4675 if (Args.hasArg(options::OPT_static)) {
4676 CmdArgs.push_back("-Bstatic");
4677 CmdArgs.push_back("-dn");
4678 } else {
4679 CmdArgs.push_back("-Bdynamic");
4680 if (Args.hasArg(options::OPT_shared)) {
4681 CmdArgs.push_back("-shared");
4682 } else {
4683 CmdArgs.push_back("--dynamic-linker");
4684 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4685 }
4686 }
4687
4688 if (Output.isFilename()) {
4689 CmdArgs.push_back("-o");
4690 CmdArgs.push_back(Output.getFilename());
4691 } else {
4692 assert(Output.isNothing() && "Invalid output.");
4693 }
4694
4695 if (!Args.hasArg(options::OPT_nostdlib) &&
4696 !Args.hasArg(options::OPT_nostartfiles)) {
4697 if (!Args.hasArg(options::OPT_shared)) {
4698 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4699 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004700 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004701 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4702 } else {
4703 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004704 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4705 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004706 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004707 if (getToolChain().getDriver().CCCIsCXX)
4708 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004709 }
4710
4711 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4712
4713 Args.AddAllArgs(CmdArgs, options::OPT_L);
4714 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4715 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004716 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00004717
4718 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4719
4720 if (!Args.hasArg(options::OPT_nostdlib) &&
4721 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00004722 if (getToolChain().getDriver().CCCIsCXX)
4723 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00004724 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004725 if (!Args.hasArg(options::OPT_shared)) {
4726 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00004727 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00004728 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004729 }
David Chisnallf571cde2012-02-15 13:39:01 +00004730 }
4731
4732 if (!Args.hasArg(options::OPT_nostdlib) &&
4733 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00004734 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004735 }
David Chisnall96de9932012-02-16 16:00:47 +00004736 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004737
4738 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4739
4740 const char *Exec =
4741 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4742 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4743}
4744
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004745void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004746 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004747 const InputInfoList &Inputs,
4748 const ArgList &Args,
4749 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004750 ArgStringList CmdArgs;
4751
4752 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4753 options::OPT_Xassembler);
4754
4755 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004756 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004757
4758 for (InputInfoList::const_iterator
4759 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4760 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004761 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004762 }
4763
4764 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004765 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004766 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004767}
4768
4769void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004770 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004771 const InputInfoList &Inputs,
4772 const ArgList &Args,
4773 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004774 ArgStringList CmdArgs;
4775
4776 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004777 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004778 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004779 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004780 }
4781
4782 if (Args.hasArg(options::OPT_static)) {
4783 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004784 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004785 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004786// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004787 CmdArgs.push_back("-Bdynamic");
4788 if (Args.hasArg(options::OPT_shared)) {
4789 CmdArgs.push_back("-shared");
4790 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00004791 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004792 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4793 }
4794 }
4795
Daniel Dunbarb440f562010-08-02 02:38:21 +00004796 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004797 CmdArgs.push_back("-o");
4798 CmdArgs.push_back(Output.getFilename());
4799 } else {
4800 assert(Output.isNothing() && "Invalid output.");
4801 }
4802
4803 if (!Args.hasArg(options::OPT_nostdlib) &&
4804 !Args.hasArg(options::OPT_nostartfiles)) {
4805 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004806 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004807 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004808 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004809 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004810 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004811 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004812 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004813 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004814 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004815 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00004816 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004817 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004818 }
4819
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004820 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4821 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004822 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004823
4824 Args.AddAllArgs(CmdArgs, options::OPT_L);
4825 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4826 Args.AddAllArgs(CmdArgs, options::OPT_e);
4827
Daniel Dunbar54423b22010-09-17 00:24:54 +00004828 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004829
4830 if (!Args.hasArg(options::OPT_nostdlib) &&
4831 !Args.hasArg(options::OPT_nodefaultlibs)) {
4832 // FIXME: For some reason GCC passes -lgcc before adding
4833 // the default system libraries. Just mimic this for now.
4834 CmdArgs.push_back("-lgcc");
4835
4836 if (Args.hasArg(options::OPT_pthread))
4837 CmdArgs.push_back("-pthread");
4838 if (!Args.hasArg(options::OPT_shared))
4839 CmdArgs.push_back("-lc");
4840 CmdArgs.push_back("-lgcc");
4841 }
4842
4843 if (!Args.hasArg(options::OPT_nostdlib) &&
4844 !Args.hasArg(options::OPT_nostartfiles)) {
4845 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004846 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004847 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004848 }
4849
Bill Wendling08760582011-06-27 19:15:03 +00004850 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00004851
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004852 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004853 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004854 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004855}
4856
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004857void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004858 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004859 const InputInfoList &Inputs,
4860 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00004861 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004862 ArgStringList CmdArgs;
4863
4864 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4865 options::OPT_Xassembler);
4866
4867 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004868 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004869
4870 for (InputInfoList::const_iterator
4871 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4872 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004873 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004874 }
4875
4876 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004877 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004878 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004879}
4880
4881void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004882 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004883 const InputInfoList &Inputs,
4884 const ArgList &Args,
4885 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004886 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004887 ArgStringList CmdArgs;
4888
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004889 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004890 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004891 CmdArgs.push_back("-e");
4892 CmdArgs.push_back("__start");
4893 }
4894
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004895 if (Args.hasArg(options::OPT_static)) {
4896 CmdArgs.push_back("-Bstatic");
4897 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00004898 if (Args.hasArg(options::OPT_rdynamic))
4899 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004900 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004901 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004902 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004903 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004904 } else {
4905 CmdArgs.push_back("-dynamic-linker");
4906 CmdArgs.push_back("/usr/libexec/ld.so");
4907 }
4908 }
4909
Daniel Dunbarb440f562010-08-02 02:38:21 +00004910 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004911 CmdArgs.push_back("-o");
4912 CmdArgs.push_back(Output.getFilename());
4913 } else {
4914 assert(Output.isNothing() && "Invalid output.");
4915 }
4916
4917 if (!Args.hasArg(options::OPT_nostdlib) &&
4918 !Args.hasArg(options::OPT_nostartfiles)) {
4919 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00004920 if (Args.hasArg(options::OPT_pg))
4921 CmdArgs.push_back(Args.MakeArgString(
4922 getToolChain().GetFilePath("gcrt0.o")));
4923 else
4924 CmdArgs.push_back(Args.MakeArgString(
4925 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004926 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004927 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004928 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004929 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004930 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004931 }
4932 }
4933
Edward O'Callaghan5c521462009-10-28 15:13:08 +00004934 std::string Triple = getToolChain().getTripleString();
4935 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004936 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004937 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004938 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004939
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004940 Args.AddAllArgs(CmdArgs, options::OPT_L);
4941 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4942 Args.AddAllArgs(CmdArgs, options::OPT_e);
4943
Daniel Dunbar54423b22010-09-17 00:24:54 +00004944 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004945
4946 if (!Args.hasArg(options::OPT_nostdlib) &&
4947 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004948 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004949 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00004950 if (Args.hasArg(options::OPT_pg))
4951 CmdArgs.push_back("-lm_p");
4952 else
4953 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004954 }
4955
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004956 // FIXME: For some reason GCC passes -lgcc before adding
4957 // the default system libraries. Just mimic this for now.
4958 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004959
4960 if (Args.hasArg(options::OPT_pthread))
Chris Lattnerd0257f72011-02-21 18:36:51 +00004961 CmdArgs.push_back("-lpthread");
Chandler Carruth45661652011-12-17 22:32:42 +00004962 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00004963 if (Args.hasArg(options::OPT_pg))
4964 CmdArgs.push_back("-lc_p");
4965 else
4966 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00004967 }
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004968 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004969 }
4970
4971 if (!Args.hasArg(options::OPT_nostdlib) &&
4972 !Args.hasArg(options::OPT_nostartfiles)) {
4973 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004974 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004975 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004976 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00004977 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004978 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004979 }
4980
4981 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004982 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004983 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004984}
Ed Schoutene33194b2009-04-02 19:13:12 +00004985
Eli Friedman9fa28852012-08-08 23:57:20 +00004986void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4987 const InputInfo &Output,
4988 const InputInfoList &Inputs,
4989 const ArgList &Args,
4990 const char *LinkingOutput) const {
4991 ArgStringList CmdArgs;
4992
4993 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4994 options::OPT_Xassembler);
4995
4996 CmdArgs.push_back("-o");
4997 CmdArgs.push_back(Output.getFilename());
4998
4999 for (InputInfoList::const_iterator
5000 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5001 const InputInfo &II = *it;
5002 CmdArgs.push_back(II.getFilename());
5003 }
5004
5005 const char *Exec =
5006 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5007 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5008}
5009
5010void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5011 const InputInfo &Output,
5012 const InputInfoList &Inputs,
5013 const ArgList &Args,
5014 const char *LinkingOutput) const {
5015 const Driver &D = getToolChain().getDriver();
5016 ArgStringList CmdArgs;
5017
5018 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5019 (!Args.hasArg(options::OPT_shared))) {
5020 CmdArgs.push_back("-e");
5021 CmdArgs.push_back("__start");
5022 }
5023
5024 if (Args.hasArg(options::OPT_static)) {
5025 CmdArgs.push_back("-Bstatic");
5026 } else {
5027 if (Args.hasArg(options::OPT_rdynamic))
5028 CmdArgs.push_back("-export-dynamic");
5029 CmdArgs.push_back("--eh-frame-hdr");
5030 CmdArgs.push_back("-Bdynamic");
5031 if (Args.hasArg(options::OPT_shared)) {
5032 CmdArgs.push_back("-shared");
5033 } else {
5034 CmdArgs.push_back("-dynamic-linker");
5035 CmdArgs.push_back("/usr/libexec/ld.so");
5036 }
5037 }
5038
5039 if (Output.isFilename()) {
5040 CmdArgs.push_back("-o");
5041 CmdArgs.push_back(Output.getFilename());
5042 } else {
5043 assert(Output.isNothing() && "Invalid output.");
5044 }
5045
5046 if (!Args.hasArg(options::OPT_nostdlib) &&
5047 !Args.hasArg(options::OPT_nostartfiles)) {
5048 if (!Args.hasArg(options::OPT_shared)) {
5049 if (Args.hasArg(options::OPT_pg))
5050 CmdArgs.push_back(Args.MakeArgString(
5051 getToolChain().GetFilePath("gcrt0.o")));
5052 else
5053 CmdArgs.push_back(Args.MakeArgString(
5054 getToolChain().GetFilePath("crt0.o")));
5055 CmdArgs.push_back(Args.MakeArgString(
5056 getToolChain().GetFilePath("crtbegin.o")));
5057 } else {
5058 CmdArgs.push_back(Args.MakeArgString(
5059 getToolChain().GetFilePath("crtbeginS.o")));
5060 }
5061 }
5062
5063 Args.AddAllArgs(CmdArgs, options::OPT_L);
5064 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5065 Args.AddAllArgs(CmdArgs, options::OPT_e);
5066
5067 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5068
5069 if (!Args.hasArg(options::OPT_nostdlib) &&
5070 !Args.hasArg(options::OPT_nodefaultlibs)) {
5071 if (D.CCCIsCXX) {
5072 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5073 if (Args.hasArg(options::OPT_pg))
5074 CmdArgs.push_back("-lm_p");
5075 else
5076 CmdArgs.push_back("-lm");
5077 }
5078
5079 if (Args.hasArg(options::OPT_pthread))
5080 CmdArgs.push_back("-lpthread");
5081 if (!Args.hasArg(options::OPT_shared)) {
5082 if (Args.hasArg(options::OPT_pg))
5083 CmdArgs.push_back("-lc_p");
5084 else
5085 CmdArgs.push_back("-lc");
5086 }
5087
5088 std::string myarch = "-lclang_rt.";
5089 const llvm::Triple &T = getToolChain().getTriple();
5090 llvm::Triple::ArchType Arch = T.getArch();
5091 switch (Arch) {
5092 case llvm::Triple::arm:
5093 myarch += ("arm");
5094 break;
5095 case llvm::Triple::x86:
5096 myarch += ("i386");
5097 break;
5098 case llvm::Triple::x86_64:
5099 myarch += ("amd64");
5100 break;
5101 default:
5102 assert(0 && "Unsupported architecture");
5103 }
5104 CmdArgs.push_back(Args.MakeArgString(myarch));
5105 }
5106
5107 if (!Args.hasArg(options::OPT_nostdlib) &&
5108 !Args.hasArg(options::OPT_nostartfiles)) {
5109 if (!Args.hasArg(options::OPT_shared))
5110 CmdArgs.push_back(Args.MakeArgString(
5111 getToolChain().GetFilePath("crtend.o")));
5112 else
5113 CmdArgs.push_back(Args.MakeArgString(
5114 getToolChain().GetFilePath("crtendS.o")));
5115 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005116
5117 const char *Exec =
5118 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5119 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005120}
5121
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005122void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005123 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005124 const InputInfoList &Inputs,
5125 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005126 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005127 ArgStringList CmdArgs;
5128
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005129 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5130 // instruct as in the base system to assemble 32-bit code.
5131 if (getToolChain().getArchName() == "i386")
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005132 CmdArgs.push_back("--32");
5133
Roman Divacky00859c22011-06-04 07:37:31 +00005134 if (getToolChain().getArchName() == "powerpc")
5135 CmdArgs.push_back("-a32");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005136
Eric Christopher0b26a612010-03-02 02:41:08 +00005137 // Set byte order explicitly
5138 if (getToolChain().getArchName() == "mips")
5139 CmdArgs.push_back("-EB");
5140 else if (getToolChain().getArchName() == "mipsel")
5141 CmdArgs.push_back("-EL");
5142
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005143 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5144 options::OPT_Xassembler);
5145
5146 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005147 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005148
5149 for (InputInfoList::const_iterator
5150 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5151 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005152 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005153 }
5154
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005155 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005156 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005157 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005158}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005159
5160void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005161 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005162 const InputInfoList &Inputs,
5163 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005164 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005165 const toolchains::FreeBSD& ToolChain =
5166 static_cast<const toolchains::FreeBSD&>(getToolChain());
5167 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005168 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005169
5170 // Silence warning for "clang -g foo.o -o foo"
5171 Args.ClaimAllArgs(options::OPT_g_Group);
5172 // and "clang -emit-llvm foo.o -o foo"
5173 Args.ClaimAllArgs(options::OPT_emit_llvm);
5174 // and for "clang -w foo.o -o foo". Other warning options are already
5175 // handled somewhere else.
5176 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005177
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005178 if (!D.SysRoot.empty())
5179 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5180
Roman Divackyafe2f232012-08-28 15:09:03 +00005181 if (Args.hasArg(options::OPT_pie))
5182 CmdArgs.push_back("-pie");
5183
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005184 if (Args.hasArg(options::OPT_static)) {
5185 CmdArgs.push_back("-Bstatic");
5186 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005187 if (Args.hasArg(options::OPT_rdynamic))
5188 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005189 CmdArgs.push_back("--eh-frame-hdr");
5190 if (Args.hasArg(options::OPT_shared)) {
5191 CmdArgs.push_back("-Bshareable");
5192 } else {
5193 CmdArgs.push_back("-dynamic-linker");
5194 CmdArgs.push_back("/libexec/ld-elf.so.1");
5195 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005196 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5197 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005198 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5199 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5200 CmdArgs.push_back("--hash-style=both");
5201 }
5202 }
5203 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005204 }
5205
5206 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5207 // instruct ld in the base system to link 32-bit code.
Roman Divackyafe2f232012-08-28 15:09:03 +00005208 if (ToolChain.getArchName() == "i386") {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005209 CmdArgs.push_back("-m");
5210 CmdArgs.push_back("elf_i386_fbsd");
5211 }
5212
Roman Divackyafe2f232012-08-28 15:09:03 +00005213 if (ToolChain.getArchName() == "powerpc") {
Roman Divacky5e300b82011-06-04 07:40:24 +00005214 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005215 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005216 }
5217
Daniel Dunbarb440f562010-08-02 02:38:21 +00005218 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005219 CmdArgs.push_back("-o");
5220 CmdArgs.push_back(Output.getFilename());
5221 } else {
5222 assert(Output.isNothing() && "Invalid output.");
5223 }
5224
5225 if (!Args.hasArg(options::OPT_nostdlib) &&
5226 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005227 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005228 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005229 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005230 crt1 = "gcrt1.o";
5231 else if (Args.hasArg(options::OPT_pie))
5232 crt1 = "Scrt1.o";
5233 else
5234 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005235 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005236 if (crt1)
5237 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5238
5239 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5240
5241 const char *crtbegin = NULL;
5242 if (Args.hasArg(options::OPT_static))
5243 crtbegin = "crtbeginT.o";
5244 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5245 crtbegin = "crtbeginS.o";
5246 else
5247 crtbegin = "crtbegin.o";
5248
5249 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005250 }
5251
5252 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005253 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005254 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5255 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005256 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005257 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5258 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005259 Args.AddAllArgs(CmdArgs, options::OPT_s);
5260 Args.AddAllArgs(CmdArgs, options::OPT_t);
5261 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5262 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005263
Roman Divackyafe2f232012-08-28 15:09:03 +00005264 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005265
5266 if (!Args.hasArg(options::OPT_nostdlib) &&
5267 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005268 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005269 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005270 if (Args.hasArg(options::OPT_pg))
5271 CmdArgs.push_back("-lm_p");
5272 else
5273 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005274 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005275 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5276 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005277 if (Args.hasArg(options::OPT_pg))
5278 CmdArgs.push_back("-lgcc_p");
5279 else
5280 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005281 if (Args.hasArg(options::OPT_static)) {
5282 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005283 } else if (Args.hasArg(options::OPT_pg)) {
5284 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005285 } else {
5286 CmdArgs.push_back("--as-needed");
5287 CmdArgs.push_back("-lgcc_s");
5288 CmdArgs.push_back("--no-as-needed");
5289 }
5290
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005291 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005292 if (Args.hasArg(options::OPT_pg))
5293 CmdArgs.push_back("-lpthread_p");
5294 else
5295 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005296 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005297
Roman Divacky66f22762011-02-10 16:59:40 +00005298 if (Args.hasArg(options::OPT_pg)) {
5299 if (Args.hasArg(options::OPT_shared))
5300 CmdArgs.push_back("-lc");
5301 else
5302 CmdArgs.push_back("-lc_p");
5303 CmdArgs.push_back("-lgcc_p");
5304 } else {
5305 CmdArgs.push_back("-lc");
5306 CmdArgs.push_back("-lgcc");
5307 }
5308
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005309 if (Args.hasArg(options::OPT_static)) {
5310 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005311 } else if (Args.hasArg(options::OPT_pg)) {
5312 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005313 } else {
5314 CmdArgs.push_back("--as-needed");
5315 CmdArgs.push_back("-lgcc_s");
5316 CmdArgs.push_back("--no-as-needed");
5317 }
5318 }
5319
5320 if (!Args.hasArg(options::OPT_nostdlib) &&
5321 !Args.hasArg(options::OPT_nostartfiles)) {
5322 if (!Args.hasArg(options::OPT_shared))
Roman Divackyafe2f232012-08-28 15:09:03 +00005323 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005324 else
Roman Divackyafe2f232012-08-28 15:09:03 +00005325 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
5326 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005327 }
5328
Roman Divackyafe2f232012-08-28 15:09:03 +00005329 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005330
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005331 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005332 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005333 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005334}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005335
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005336void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5337 const InputInfo &Output,
5338 const InputInfoList &Inputs,
5339 const ArgList &Args,
5340 const char *LinkingOutput) const {
5341 ArgStringList CmdArgs;
5342
5343 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5344 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005345 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005346 CmdArgs.push_back("--32");
5347
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005348 // Set byte order explicitly
5349 if (getToolChain().getArchName() == "mips")
5350 CmdArgs.push_back("-EB");
5351 else if (getToolChain().getArchName() == "mipsel")
5352 CmdArgs.push_back("-EL");
5353
5354 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5355 options::OPT_Xassembler);
5356
5357 CmdArgs.push_back("-o");
5358 CmdArgs.push_back(Output.getFilename());
5359
5360 for (InputInfoList::const_iterator
5361 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5362 const InputInfo &II = *it;
5363 CmdArgs.push_back(II.getFilename());
5364 }
5365
David Chisnallddbd68f2011-09-27 22:03:18 +00005366 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005367 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5368}
5369
5370void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5371 const InputInfo &Output,
5372 const InputInfoList &Inputs,
5373 const ArgList &Args,
5374 const char *LinkingOutput) const {
5375 const Driver &D = getToolChain().getDriver();
5376 ArgStringList CmdArgs;
5377
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005378 if (!D.SysRoot.empty())
5379 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5380
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005381 if (Args.hasArg(options::OPT_static)) {
5382 CmdArgs.push_back("-Bstatic");
5383 } else {
5384 if (Args.hasArg(options::OPT_rdynamic))
5385 CmdArgs.push_back("-export-dynamic");
5386 CmdArgs.push_back("--eh-frame-hdr");
5387 if (Args.hasArg(options::OPT_shared)) {
5388 CmdArgs.push_back("-Bshareable");
5389 } else {
5390 CmdArgs.push_back("-dynamic-linker");
5391 CmdArgs.push_back("/libexec/ld.elf_so");
5392 }
5393 }
5394
5395 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5396 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005397 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005398 CmdArgs.push_back("-m");
5399 CmdArgs.push_back("elf_i386");
5400 }
5401
5402 if (Output.isFilename()) {
5403 CmdArgs.push_back("-o");
5404 CmdArgs.push_back(Output.getFilename());
5405 } else {
5406 assert(Output.isNothing() && "Invalid output.");
5407 }
5408
5409 if (!Args.hasArg(options::OPT_nostdlib) &&
5410 !Args.hasArg(options::OPT_nostartfiles)) {
5411 if (!Args.hasArg(options::OPT_shared)) {
5412 CmdArgs.push_back(Args.MakeArgString(
5413 getToolChain().GetFilePath("crt0.o")));
5414 CmdArgs.push_back(Args.MakeArgString(
5415 getToolChain().GetFilePath("crti.o")));
5416 CmdArgs.push_back(Args.MakeArgString(
5417 getToolChain().GetFilePath("crtbegin.o")));
5418 } else {
5419 CmdArgs.push_back(Args.MakeArgString(
5420 getToolChain().GetFilePath("crti.o")));
5421 CmdArgs.push_back(Args.MakeArgString(
5422 getToolChain().GetFilePath("crtbeginS.o")));
5423 }
5424 }
5425
5426 Args.AddAllArgs(CmdArgs, options::OPT_L);
5427 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5428 Args.AddAllArgs(CmdArgs, options::OPT_e);
5429 Args.AddAllArgs(CmdArgs, options::OPT_s);
5430 Args.AddAllArgs(CmdArgs, options::OPT_t);
5431 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5432 Args.AddAllArgs(CmdArgs, options::OPT_r);
5433
5434 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5435
5436 if (!Args.hasArg(options::OPT_nostdlib) &&
5437 !Args.hasArg(options::OPT_nodefaultlibs)) {
5438 if (D.CCCIsCXX) {
5439 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5440 CmdArgs.push_back("-lm");
5441 }
5442 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5443 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005444 if (Args.hasArg(options::OPT_static)) {
5445 CmdArgs.push_back("-lgcc_eh");
5446 } else {
5447 CmdArgs.push_back("--as-needed");
5448 CmdArgs.push_back("-lgcc_s");
5449 CmdArgs.push_back("--no-as-needed");
5450 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005451 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005452
5453 if (Args.hasArg(options::OPT_pthread))
5454 CmdArgs.push_back("-lpthread");
5455 CmdArgs.push_back("-lc");
5456
5457 CmdArgs.push_back("-lgcc");
5458 if (Args.hasArg(options::OPT_static)) {
5459 CmdArgs.push_back("-lgcc_eh");
5460 } else {
5461 CmdArgs.push_back("--as-needed");
5462 CmdArgs.push_back("-lgcc_s");
5463 CmdArgs.push_back("--no-as-needed");
5464 }
5465 }
5466
5467 if (!Args.hasArg(options::OPT_nostdlib) &&
5468 !Args.hasArg(options::OPT_nostartfiles)) {
5469 if (!Args.hasArg(options::OPT_shared))
5470 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5471 "crtend.o")));
5472 else
5473 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5474 "crtendS.o")));
5475 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5476 "crtn.o")));
5477 }
5478
Bill Wendling08760582011-06-27 19:15:03 +00005479 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005480
David Chisnallddbd68f2011-09-27 22:03:18 +00005481 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005482 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5483}
5484
Rafael Espindola92b00932010-08-10 00:25:48 +00005485void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5486 const InputInfo &Output,
5487 const InputInfoList &Inputs,
5488 const ArgList &Args,
5489 const char *LinkingOutput) const {
5490 ArgStringList CmdArgs;
5491
5492 // Add --32/--64 to make sure we get the format we want.
5493 // This is incomplete
5494 if (getToolChain().getArch() == llvm::Triple::x86) {
5495 CmdArgs.push_back("--32");
5496 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5497 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005498 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5499 CmdArgs.push_back("-a32");
5500 CmdArgs.push_back("-mppc");
5501 CmdArgs.push_back("-many");
5502 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5503 CmdArgs.push_back("-a64");
5504 CmdArgs.push_back("-mppc64");
5505 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005506 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005507 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005508 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5509 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005510
5511 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5512 getToolChain().getTriple());
5513 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005514
5515 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5516 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5517 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005518 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5519 getToolChain().getArch() == llvm::Triple::mipsel ||
5520 getToolChain().getArch() == llvm::Triple::mips64 ||
5521 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005522 StringRef CPUName;
5523 StringRef ABIName;
5524 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005525
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005526 CmdArgs.push_back("-march");
5527 CmdArgs.push_back(CPUName.data());
5528
5529 // Convert ABI name to the GNU tools acceptable variant.
5530 if (ABIName == "o32")
5531 ABIName = "32";
5532 else if (ABIName == "n64")
5533 ABIName = "64";
5534
5535 CmdArgs.push_back("-mabi");
5536 CmdArgs.push_back(ABIName.data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005537
5538 if (getToolChain().getArch() == llvm::Triple::mips ||
5539 getToolChain().getArch() == llvm::Triple::mips64)
5540 CmdArgs.push_back("-EB");
5541 else
5542 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005543
5544 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5545 options::OPT_fpic, options::OPT_fno_pic,
5546 options::OPT_fPIE, options::OPT_fno_PIE,
5547 options::OPT_fpie, options::OPT_fno_pie);
5548 if (LastPICArg &&
5549 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5550 LastPICArg->getOption().matches(options::OPT_fpic) ||
5551 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5552 LastPICArg->getOption().matches(options::OPT_fpie))) {
5553 CmdArgs.push_back("-KPIC");
5554 }
Rafael Espindola92b00932010-08-10 00:25:48 +00005555 }
5556
5557 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5558 options::OPT_Xassembler);
5559
5560 CmdArgs.push_back("-o");
5561 CmdArgs.push_back(Output.getFilename());
5562
5563 for (InputInfoList::const_iterator
5564 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5565 const InputInfo &II = *it;
5566 CmdArgs.push_back(II.getFilename());
5567 }
5568
5569 const char *Exec =
5570 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5571 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5572}
5573
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005574static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5575 ArgStringList &CmdArgs, const ArgList &Args) {
5576 bool isAndroid = Triple.getEnvironment() == llvm::Triple::ANDROIDEABI;
5577 bool StaticLibgcc = isAndroid || Args.hasArg(options::OPT_static) ||
Rafael Espindolacc354322011-10-17 21:39:04 +00005578 Args.hasArg(options::OPT_static_libgcc);
5579 if (!D.CCCIsCXX)
5580 CmdArgs.push_back("-lgcc");
5581
5582 if (StaticLibgcc) {
5583 if (D.CCCIsCXX)
5584 CmdArgs.push_back("-lgcc");
5585 } else {
5586 if (!D.CCCIsCXX)
5587 CmdArgs.push_back("--as-needed");
5588 CmdArgs.push_back("-lgcc_s");
5589 if (!D.CCCIsCXX)
5590 CmdArgs.push_back("--no-as-needed");
5591 }
5592
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005593 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005594 CmdArgs.push_back("-lgcc_eh");
5595 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5596 CmdArgs.push_back("-lgcc");
5597}
5598
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005599void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5600 const InputInfo &Output,
5601 const InputInfoList &Inputs,
5602 const ArgList &Args,
5603 const char *LinkingOutput) const {
5604 const toolchains::Linux& ToolChain =
5605 static_cast<const toolchains::Linux&>(getToolChain());
5606 const Driver &D = ToolChain.getDriver();
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005607 const bool isAndroid = ToolChain.getTriple().getEnvironment() ==
5608 llvm::Triple::ANDROIDEABI;
5609
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005610 ArgStringList CmdArgs;
5611
Rafael Espindolad1002f62010-11-15 18:28:16 +00005612 // Silence warning for "clang -g foo.o -o foo"
5613 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005614 // and "clang -emit-llvm foo.o -o foo"
5615 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00005616 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005617 // handled somewhere else.
5618 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005619
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005620 if (!D.SysRoot.empty())
5621 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005622
Rafael Espindolad47ac232010-11-17 22:26:15 +00005623 if (Args.hasArg(options::OPT_pie))
5624 CmdArgs.push_back("-pie");
5625
Rafael Espindola1c76c592010-11-07 22:57:16 +00005626 if (Args.hasArg(options::OPT_rdynamic))
5627 CmdArgs.push_back("-export-dynamic");
5628
Rafael Espindola34d77dc2010-11-11 19:34:42 +00005629 if (Args.hasArg(options::OPT_s))
5630 CmdArgs.push_back("-s");
5631
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005632 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5633 e = ToolChain.ExtraOpts.end();
5634 i != e; ++i)
5635 CmdArgs.push_back(i->c_str());
5636
5637 if (!Args.hasArg(options::OPT_static)) {
5638 CmdArgs.push_back("--eh-frame-hdr");
5639 }
5640
5641 CmdArgs.push_back("-m");
5642 if (ToolChain.getArch() == llvm::Triple::x86)
5643 CmdArgs.push_back("elf_i386");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005644 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00005645 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005646 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005647 else if (ToolChain.getArch() == llvm::Triple::ppc)
5648 CmdArgs.push_back("elf32ppclinux");
5649 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5650 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005651 else if (ToolChain.getArch() == llvm::Triple::mips)
5652 CmdArgs.push_back("elf32btsmip");
5653 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5654 CmdArgs.push_back("elf32ltsmip");
5655 else if (ToolChain.getArch() == llvm::Triple::mips64)
5656 CmdArgs.push_back("elf64btsmip");
5657 else if (ToolChain.getArch() == llvm::Triple::mips64el)
5658 CmdArgs.push_back("elf64ltsmip");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005659 else
5660 CmdArgs.push_back("elf_x86_64");
5661
5662 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00005663 if (ToolChain.getArch() == llvm::Triple::arm
5664 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005665 CmdArgs.push_back("-Bstatic");
5666 else
5667 CmdArgs.push_back("-static");
5668 } else if (Args.hasArg(options::OPT_shared)) {
5669 CmdArgs.push_back("-shared");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005670 if ((ToolChain.getArch() == llvm::Triple::arm
5671 || ToolChain.getArch() == llvm::Triple::thumb) && isAndroid) {
5672 CmdArgs.push_back("-Bsymbolic");
5673 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005674 }
5675
5676 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00005677 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005678 (!Args.hasArg(options::OPT_static) &&
5679 !Args.hasArg(options::OPT_shared))) {
5680 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005681 if (isAndroid)
5682 CmdArgs.push_back("/system/bin/linker");
5683 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005684 CmdArgs.push_back("/lib/ld-linux.so.2");
Douglas Gregord9bb1522011-03-06 19:11:49 +00005685 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liueabbf922012-07-30 11:05:56 +00005686 ToolChain.getArch() == llvm::Triple::thumb) {
5687 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5688 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5689 else
5690 CmdArgs.push_back("/lib/ld-linux.so.3");
5691 }
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005692 else if (ToolChain.getArch() == llvm::Triple::mips ||
5693 ToolChain.getArch() == llvm::Triple::mipsel)
5694 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan1e1e2e22012-04-06 20:14:27 +00005695 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
5696 ToolChain.getArch() == llvm::Triple::mips64el)
5697 CmdArgs.push_back("/lib64/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005698 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner20b90d02011-04-11 21:15:37 +00005699 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005700 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner20b90d02011-04-11 21:15:37 +00005701 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005702 else
5703 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5704 }
5705
5706 CmdArgs.push_back("-o");
5707 CmdArgs.push_back(Output.getFilename());
5708
Rafael Espindola81937ec2010-12-01 01:52:43 +00005709 if (!Args.hasArg(options::OPT_nostdlib) &&
5710 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005711 if (!isAndroid) {
5712 const char *crt1 = NULL;
5713 if (!Args.hasArg(options::OPT_shared)){
5714 if (Args.hasArg(options::OPT_pie))
5715 crt1 = "Scrt1.o";
5716 else
5717 crt1 = "crt1.o";
5718 }
5719 if (crt1)
5720 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005721
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005722 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5723 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005724
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005725 const char *crtbegin;
5726 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005727 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Rafael Espindolad47ac232010-11-17 22:26:15 +00005728 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005729 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005730 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005731 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005732 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
5733 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005734
5735 Args.AddAllArgs(CmdArgs, options::OPT_L);
5736
5737 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5738
Roman Divackyee8188a2011-03-01 17:53:14 +00005739 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5740 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005741 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005742
Rafael Espindola9446d762012-04-09 23:53:34 +00005743 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5744 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5745 // forward.
5746 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5747 CmdArgs.push_back("-plugin");
5748 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5749 CmdArgs.push_back(Args.MakeArgString(Plugin));
5750 }
5751
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00005752 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5753 CmdArgs.push_back("--no-demangle");
5754
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005755 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5756
Chandler Carruth94a32012012-05-14 18:31:18 +00005757 if (D.CCCIsCXX &&
5758 !Args.hasArg(options::OPT_nostdlib) &&
5759 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00005760 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5761 !Args.hasArg(options::OPT_static);
5762 if (OnlyLibstdcxxStatic)
5763 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005764 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00005765 if (OnlyLibstdcxxStatic)
5766 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005767 CmdArgs.push_back("-lm");
5768 }
5769
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005770 // Call this before we add the C run-time.
5771 addAsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00005772 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005773
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005774 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00005775 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5776 if (Args.hasArg(options::OPT_static))
5777 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00005778
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005779 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005780
Chandler Carruth94a32012012-05-14 18:31:18 +00005781 if (Args.hasArg(options::OPT_pthread) ||
5782 Args.hasArg(options::OPT_pthreads))
5783 CmdArgs.push_back("-lpthread");
5784
5785 CmdArgs.push_back("-lc");
5786
5787 if (Args.hasArg(options::OPT_static))
5788 CmdArgs.push_back("--end-group");
5789 else
5790 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5791 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00005792
Rafael Espindola81937ec2010-12-01 01:52:43 +00005793 if (!Args.hasArg(options::OPT_nostartfiles)) {
5794 const char *crtend;
5795 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005796 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00005797 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005798 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005799
Rafael Espindola81937ec2010-12-01 01:52:43 +00005800 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005801 if (!isAndroid)
5802 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00005803 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005804 }
5805
Bill Wendling08760582011-06-27 19:15:03 +00005806 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005807
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005808 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5809}
Rafael Espindola92b00932010-08-10 00:25:48 +00005810
Chris Lattner3e2ee142010-07-07 16:01:42 +00005811void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005812 const InputInfo &Output,
5813 const InputInfoList &Inputs,
5814 const ArgList &Args,
5815 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005816 ArgStringList CmdArgs;
5817
5818 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5819 options::OPT_Xassembler);
5820
5821 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005822 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005823
5824 for (InputInfoList::const_iterator
5825 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5826 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005827 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005828 }
5829
5830 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00005831 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005832 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005833}
5834
5835void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005836 const InputInfo &Output,
5837 const InputInfoList &Inputs,
5838 const ArgList &Args,
5839 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005840 const Driver &D = getToolChain().getDriver();
5841 ArgStringList CmdArgs;
5842
Daniel Dunbarb440f562010-08-02 02:38:21 +00005843 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005844 CmdArgs.push_back("-o");
5845 CmdArgs.push_back(Output.getFilename());
5846 } else {
5847 assert(Output.isNothing() && "Invalid output.");
5848 }
5849
5850 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00005851 !Args.hasArg(options::OPT_nostartfiles)) {
5852 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
5853 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5854 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
5855 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
5856 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005857
5858 Args.AddAllArgs(CmdArgs, options::OPT_L);
5859 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5860 Args.AddAllArgs(CmdArgs, options::OPT_e);
5861
Daniel Dunbar54423b22010-09-17 00:24:54 +00005862 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005863
Eli Friedman83de5132011-12-08 23:54:21 +00005864 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5865
Chris Lattner3e2ee142010-07-07 16:01:42 +00005866 if (!Args.hasArg(options::OPT_nostdlib) &&
5867 !Args.hasArg(options::OPT_nodefaultlibs)) {
5868 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005869 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005870 CmdArgs.push_back("-lm");
5871 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005872 }
5873
5874 if (!Args.hasArg(options::OPT_nostdlib) &&
5875 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00005876 if (Args.hasArg(options::OPT_pthread))
5877 CmdArgs.push_back("-lpthread");
5878 CmdArgs.push_back("-lc");
5879 CmdArgs.push_back("-lCompilerRT-Generic");
5880 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
5881 CmdArgs.push_back(
5882 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005883 }
5884
Eli Friedman83de5132011-12-08 23:54:21 +00005885 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005886 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005887}
5888
Daniel Dunbarcc912342009-05-02 18:28:39 +00005889/// DragonFly Tools
5890
5891// For now, DragonFly Assemble does just about the same as for
5892// FreeBSD, but this may change soon.
5893void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005894 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005895 const InputInfoList &Inputs,
5896 const ArgList &Args,
5897 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005898 ArgStringList CmdArgs;
5899
5900 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5901 // instruct as in the base system to assemble 32-bit code.
5902 if (getToolChain().getArchName() == "i386")
5903 CmdArgs.push_back("--32");
5904
5905 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5906 options::OPT_Xassembler);
5907
5908 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005909 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005910
5911 for (InputInfoList::const_iterator
5912 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5913 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005914 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005915 }
5916
5917 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005918 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005919 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005920}
5921
5922void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005923 const InputInfo &Output,
5924 const InputInfoList &Inputs,
5925 const ArgList &Args,
5926 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005927 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00005928 ArgStringList CmdArgs;
5929
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005930 if (!D.SysRoot.empty())
5931 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5932
Daniel Dunbarcc912342009-05-02 18:28:39 +00005933 if (Args.hasArg(options::OPT_static)) {
5934 CmdArgs.push_back("-Bstatic");
5935 } else {
5936 if (Args.hasArg(options::OPT_shared))
5937 CmdArgs.push_back("-Bshareable");
5938 else {
5939 CmdArgs.push_back("-dynamic-linker");
5940 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
5941 }
5942 }
5943
5944 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5945 // instruct ld in the base system to link 32-bit code.
5946 if (getToolChain().getArchName() == "i386") {
5947 CmdArgs.push_back("-m");
5948 CmdArgs.push_back("elf_i386");
5949 }
5950
Daniel Dunbarb440f562010-08-02 02:38:21 +00005951 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005952 CmdArgs.push_back("-o");
5953 CmdArgs.push_back(Output.getFilename());
5954 } else {
5955 assert(Output.isNothing() && "Invalid output.");
5956 }
5957
5958 if (!Args.hasArg(options::OPT_nostdlib) &&
5959 !Args.hasArg(options::OPT_nostartfiles)) {
5960 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005961 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005962 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005963 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005964 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005965 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005966 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005967 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005968 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005969 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005970 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005971 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005972 }
5973 }
5974
5975 Args.AddAllArgs(CmdArgs, options::OPT_L);
5976 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5977 Args.AddAllArgs(CmdArgs, options::OPT_e);
5978
Daniel Dunbar54423b22010-09-17 00:24:54 +00005979 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00005980
5981 if (!Args.hasArg(options::OPT_nostdlib) &&
5982 !Args.hasArg(options::OPT_nodefaultlibs)) {
5983 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
5984 // rpaths
5985 CmdArgs.push_back("-L/usr/lib/gcc41");
5986
5987 if (!Args.hasArg(options::OPT_static)) {
5988 CmdArgs.push_back("-rpath");
5989 CmdArgs.push_back("/usr/lib/gcc41");
5990
5991 CmdArgs.push_back("-rpath-link");
5992 CmdArgs.push_back("/usr/lib/gcc41");
5993
5994 CmdArgs.push_back("-rpath");
5995 CmdArgs.push_back("/usr/lib");
5996
5997 CmdArgs.push_back("-rpath-link");
5998 CmdArgs.push_back("/usr/lib");
5999 }
6000
Rafael Espindola38360b32010-07-20 12:59:03 +00006001 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006002 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006003 CmdArgs.push_back("-lm");
6004 }
6005
Daniel Dunbarcc912342009-05-02 18:28:39 +00006006 if (Args.hasArg(options::OPT_shared)) {
6007 CmdArgs.push_back("-lgcc_pic");
6008 } else {
6009 CmdArgs.push_back("-lgcc");
6010 }
6011
6012
6013 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006014 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006015
6016 if (!Args.hasArg(options::OPT_nolibc)) {
6017 CmdArgs.push_back("-lc");
6018 }
6019
6020 if (Args.hasArg(options::OPT_shared)) {
6021 CmdArgs.push_back("-lgcc_pic");
6022 } else {
6023 CmdArgs.push_back("-lgcc");
6024 }
6025 }
6026
6027 if (!Args.hasArg(options::OPT_nostdlib) &&
6028 !Args.hasArg(options::OPT_nostartfiles)) {
6029 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006030 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006031 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006032 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006033 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006034 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006035 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006036 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006037 }
6038
Bill Wendling08760582011-06-27 19:15:03 +00006039 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006040
Daniel Dunbarcc912342009-05-02 18:28:39 +00006041 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006042 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006043 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006044}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006045
6046void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6047 const InputInfo &Output,
6048 const InputInfoList &Inputs,
6049 const ArgList &Args,
6050 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006051 ArgStringList CmdArgs;
6052
6053 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006054 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6055 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006056 } else {
6057 assert(Output.isNothing() && "Invalid output.");
6058 }
6059
6060 if (!Args.hasArg(options::OPT_nostdlib) &&
6061 !Args.hasArg(options::OPT_nostartfiles)) {
6062 CmdArgs.push_back("-defaultlib:libcmt");
6063 }
6064
6065 CmdArgs.push_back("-nologo");
6066
Michael J. Spencere2f49362012-06-18 16:56:04 +00006067 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6068
6069 // Add filenames immediately.
6070 for (InputInfoList::const_iterator
6071 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6072 if (it->isFilename())
6073 CmdArgs.push_back(it->getFilename());
6074 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006075
6076 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006077 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006078 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6079}