blob: f26ed159d1e15d6d6596110ff6845649830e0cae [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;
Logan Chienc6fd8202012-09-02 09:30:11 +0000646 case llvm::Triple::Android: {
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()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000683 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000684 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
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000780// Get CPU and ABI names. They are not independent
781// so we have to calculate them together.
782static void getMipsCPUAndABI(const ArgList &Args,
783 const ToolChain &TC,
784 StringRef &CPUName,
785 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000786 const char *DefMips32CPU = "mips32";
787 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000788
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000789 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
790 options::OPT_mcpu_EQ))
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000791 CPUName = A->getValue(Args);
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000792
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000793 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
Eric Christopher0b26a612010-03-02 02:41:08 +0000794 ABIName = A->getValue(Args);
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000795
796 // Setup default CPU and ABI names.
797 if (CPUName.empty() && ABIName.empty()) {
798 switch (TC.getTriple().getArch()) {
799 default:
800 llvm_unreachable("Unexpected triple arch name");
801 case llvm::Triple::mips:
802 case llvm::Triple::mipsel:
803 CPUName = DefMips32CPU;
804 break;
805 case llvm::Triple::mips64:
806 case llvm::Triple::mips64el:
807 CPUName = DefMips64CPU;
808 break;
809 }
810 }
811
812 if (!ABIName.empty()) {
813 // Deduce CPU name from ABI name.
814 CPUName = llvm::StringSwitch<const char *>(ABIName)
815 .Cases("o32", "eabi", DefMips32CPU)
816 .Cases("n32", "n64", DefMips64CPU)
817 .Default("");
818 }
819 else if (!CPUName.empty()) {
820 // Deduce ABI name from CPU name.
821 ABIName = llvm::StringSwitch<const char *>(CPUName)
822 .Cases("mips32", "mips32r2", "o32")
823 .Cases("mips64", "mips64r2", "n64")
824 .Default("");
825 }
826
827 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000828}
829
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000830// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
831// and -mfloat-abi=.
832static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000833 // Select the float ABI as determined by -msoft-float, -mhard-float,
834 // and -mfloat-abi=.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000835 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000836 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000837 options::OPT_mhard_float,
838 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000839 if (A->getOption().matches(options::OPT_msoft_float))
840 FloatABI = "soft";
841 else if (A->getOption().matches(options::OPT_mhard_float))
842 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000843 else {
844 FloatABI = A->getValue(Args);
845 if (FloatABI != "soft" && FloatABI != "single" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000846 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000847 FloatABI = "hard";
848 }
849 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000850 }
851
852 // If unspecified, choose the default based on the platform.
853 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000854 // Assume "hard", because it's a default value used by gcc.
855 // When we start to recognize specific target MIPS processors,
856 // we will be able to select the default more correctly.
857 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000858 }
859
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000860 return FloatABI;
861}
862
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000863static void AddTargetFeature(const ArgList &Args,
864 ArgStringList &CmdArgs,
865 OptSpecifier OnOpt,
866 OptSpecifier OffOpt,
867 StringRef FeatureName) {
868 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
869 CmdArgs.push_back("-target-feature");
870 if (A->getOption().matches(OnOpt))
871 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
872 else
873 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
874 }
875}
876
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000877void Clang::AddMIPSTargetArgs(const ArgList &Args,
878 ArgStringList &CmdArgs) const {
879 const Driver &D = getToolChain().getDriver();
880 StringRef CPUName;
881 StringRef ABIName;
882 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
883
884 CmdArgs.push_back("-target-cpu");
885 CmdArgs.push_back(CPUName.data());
886
887 CmdArgs.push_back("-target-abi");
888 CmdArgs.push_back(ABIName.data());
889
890 StringRef FloatABI = getMipsFloatABI(D, Args);
891
Eric Christopher0b26a612010-03-02 02:41:08 +0000892 if (FloatABI == "soft") {
893 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +0000894 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000895 CmdArgs.push_back("-mfloat-abi");
896 CmdArgs.push_back("soft");
897
898 // FIXME: Note, this is a hack. We need to pass the selected float
899 // mode to the MipsTargetInfoBase to define appropriate macros there.
900 // Now it is the only method.
901 CmdArgs.push_back("-target-feature");
902 CmdArgs.push_back("+soft-float");
903 }
904 else if (FloatABI == "single") {
905 // Restrict the use of hardware floating-point
906 // instructions to 32-bit operations.
907 CmdArgs.push_back("-target-feature");
908 CmdArgs.push_back("+single-float");
909 }
910 else {
911 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +0000912 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000913 CmdArgs.push_back("-mfloat-abi");
914 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +0000915 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +0000916
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000917 AddTargetFeature(Args, CmdArgs,
918 options::OPT_mips16, options::OPT_mno_mips16,
919 "mips16");
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +0000920 AddTargetFeature(Args, CmdArgs,
921 options::OPT_mdsp, options::OPT_mno_dsp,
922 "dsp");
923 AddTargetFeature(Args, CmdArgs,
924 options::OPT_mdspr2, options::OPT_mno_dspr2,
925 "dspr2");
Simon Atanasyanec4b1c12012-08-27 20:55:56 +0000926
927 if (Arg *A = Args.getLastArg(options::OPT_G)) {
928 StringRef v = A->getValue(Args);
929 CmdArgs.push_back("-mllvm");
930 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
931 A->claim();
932 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000933}
934
Hal Finkel8eb59282012-06-11 22:35:19 +0000935/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
936static std::string getPPCTargetCPU(const ArgList &Args) {
937 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
938 StringRef CPUName = A->getValue(Args);
939
940 if (CPUName == "native") {
941 std::string CPU = llvm::sys::getHostCPUName();
942 if (!CPU.empty() && CPU != "generic")
943 return CPU;
944 else
945 return "";
946 }
947
948 return llvm::StringSwitch<const char *>(CPUName)
949 .Case("common", "generic")
950 .Case("440", "440")
951 .Case("440fp", "440")
952 .Case("450", "450")
953 .Case("601", "601")
954 .Case("602", "602")
955 .Case("603", "603")
956 .Case("603e", "603e")
957 .Case("603ev", "603ev")
958 .Case("604", "604")
959 .Case("604e", "604e")
960 .Case("620", "620")
961 .Case("G3", "g3")
962 .Case("7400", "7400")
963 .Case("G4", "g4")
964 .Case("7450", "7450")
965 .Case("G4+", "g4+")
966 .Case("750", "750")
967 .Case("970", "970")
968 .Case("G5", "g5")
969 .Case("a2", "a2")
970 .Case("power6", "pwr6")
971 .Case("power7", "pwr7")
972 .Case("powerpc", "ppc")
973 .Case("powerpc64", "ppc64")
974 .Default("");
975 }
976
977 return "";
978}
979
980void Clang::AddPPCTargetArgs(const ArgList &Args,
981 ArgStringList &CmdArgs) const {
982 std::string TargetCPUName = getPPCTargetCPU(Args);
983
984 // LLVM may default to generating code for the native CPU,
985 // but, like gcc, we default to a more generic option for
986 // each architecture. (except on Darwin)
987 llvm::Triple Triple = getToolChain().getTriple();
988 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
989 if (Triple.getArch() == llvm::Triple::ppc64)
990 TargetCPUName = "ppc64";
991 else
992 TargetCPUName = "ppc";
993 }
994
995 if (!TargetCPUName.empty()) {
996 CmdArgs.push_back("-target-cpu");
997 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
998 }
999}
1000
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001001void Clang::AddSparcTargetArgs(const ArgList &Args,
1002 ArgStringList &CmdArgs) const {
1003 const Driver &D = getToolChain().getDriver();
1004
1005 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001006 CmdArgs.push_back("-target-cpu");
Benjamin Kramereed4f2a2011-12-26 14:18:37 +00001007 CmdArgs.push_back(A->getValue(Args));
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001008 }
1009
1010 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001011 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001012 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1013 options::OPT_mhard_float)) {
1014 if (A->getOption().matches(options::OPT_msoft_float))
1015 FloatABI = "soft";
1016 else if (A->getOption().matches(options::OPT_mhard_float))
1017 FloatABI = "hard";
1018 }
1019
1020 // If unspecified, choose the default based on the platform.
1021 if (FloatABI.empty()) {
1022 switch (getToolChain().getTriple().getOS()) {
1023 default:
1024 // Assume "soft", but warn the user we are guessing.
1025 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001026 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001027 break;
1028 }
1029 }
1030
1031 if (FloatABI == "soft") {
1032 // Floating point operations and argument passing are soft.
1033 //
1034 // FIXME: This changes CPP defines, we need -target-soft-float.
1035 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001036 CmdArgs.push_back("-target-feature");
1037 CmdArgs.push_back("+soft-float");
1038 } else {
1039 assert(FloatABI == "hard" && "Invalid float abi!");
1040 CmdArgs.push_back("-mhard-float");
1041 }
1042}
1043
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001044void Clang::AddX86TargetArgs(const ArgList &Args,
1045 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001046 if (!Args.hasFlag(options::OPT_mred_zone,
1047 options::OPT_mno_red_zone,
1048 true) ||
1049 Args.hasArg(options::OPT_mkernel) ||
1050 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001051 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001052
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001053 if (Args.hasFlag(options::OPT_msoft_float,
1054 options::OPT_mno_soft_float,
1055 false))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001056 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001057
Daniel Dunbare13ada62009-11-14 22:04:54 +00001058 const char *CPUName = 0;
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001059 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001060 if (StringRef(A->getValue(Args)) == "native") {
Daniel Dunbare13ada62009-11-14 22:04:54 +00001061 // FIXME: Reject attempts to use -march=native unless the target matches
1062 // the host.
1063 //
1064 // FIXME: We should also incorporate the detected target features for use
1065 // with -native.
1066 std::string CPU = llvm::sys::getHostCPUName();
Bob Wilsone78227b2012-05-09 17:53:10 +00001067 if (!CPU.empty() && CPU != "generic")
Daniel Dunbare13ada62009-11-14 22:04:54 +00001068 CPUName = Args.MakeArgString(CPU);
1069 } else
1070 CPUName = A->getValue(Args);
1071 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001072
Daniel Dunbare13ada62009-11-14 22:04:54 +00001073 // Select the default CPU if none was given (or detection failed).
1074 if (!CPUName) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001075 // FIXME: Need target hooks.
Bob Wilson6524dd32011-10-14 05:03:44 +00001076 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001077 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001078 CPUName = "core2";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001079 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001080 CPUName = "yonah";
Chris Lattnerb986aba2010-04-11 19:29:39 +00001081 } else if (getToolChain().getOS().startswith("haiku")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001082 if (getToolChain().getArch() == llvm::Triple::x86_64)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001083 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001084 else if (getToolChain().getArch() == llvm::Triple::x86)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001085 CPUName = "i586";
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001086 } else if (getToolChain().getOS().startswith("openbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001087 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001088 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001089 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001090 CPUName = "i486";
Eli Friedman9fa28852012-08-08 23:57:20 +00001091 } else if (getToolChain().getOS().startswith("bitrig")) {
1092 if (getToolChain().getArch() == llvm::Triple::x86_64)
1093 CPUName = "x86-64";
1094 else if (getToolChain().getArch() == llvm::Triple::x86)
1095 CPUName = "i686";
Roman Divacky432f10d2011-03-01 18:11:37 +00001096 } else if (getToolChain().getOS().startswith("freebsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001097 if (getToolChain().getArch() == llvm::Triple::x86_64)
Roman Divacky432f10d2011-03-01 18:11:37 +00001098 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001099 else if (getToolChain().getArch() == llvm::Triple::x86)
Roman Divacky432f10d2011-03-01 18:11:37 +00001100 CPUName = "i486";
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001101 } else if (getToolChain().getOS().startswith("netbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001102 if (getToolChain().getArch() == llvm::Triple::x86_64)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001103 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001104 else if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001105 CPUName = "i486";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001106 } else {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001107 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001108 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001109 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001110 CPUName = "pentium4";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001111 }
1112 }
1113
Daniel Dunbare13ada62009-11-14 22:04:54 +00001114 if (CPUName) {
Daniel Dunbara7d02312009-12-18 06:30:12 +00001115 CmdArgs.push_back("-target-cpu");
Daniel Dunbare13ada62009-11-14 22:04:54 +00001116 CmdArgs.push_back(CPUName);
1117 }
1118
Eli Friedmanad811f02011-07-02 00:34:19 +00001119 // The required algorithm here is slightly strange: the options are applied
1120 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1121 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1122 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1123 // former correctly, but not the latter; handle directly-overridden
1124 // attributes here.
1125 llvm::StringMap<unsigned> PrevFeature;
1126 std::vector<const char*> Features;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001127 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1128 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001129 StringRef Name = (*it)->getOption().getName();
Daniel Dunbara442fd52010-06-11 22:00:13 +00001130 (*it)->claim();
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001131
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001132 // Skip over "-m".
1133 assert(Name.startswith("-m") && "Invalid feature name.");
1134 Name = Name.substr(2);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001135
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001136 bool IsNegative = Name.startswith("no-");
1137 if (IsNegative)
1138 Name = Name.substr(3);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001139
Eli Friedmanad811f02011-07-02 00:34:19 +00001140 unsigned& Prev = PrevFeature[Name];
1141 if (Prev)
1142 Features[Prev - 1] = 0;
1143 Prev = Features.size() + 1;
1144 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1145 }
1146 for (unsigned i = 0; i < Features.size(); i++) {
1147 if (Features[i]) {
1148 CmdArgs.push_back("-target-feature");
1149 CmdArgs.push_back(Features[i]);
1150 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001151 }
1152}
1153
Tony Linthicum76329bf2011-12-12 21:14:55 +00001154static Arg* getLastHexagonArchArg (const ArgList &Args)
1155{
1156 Arg * A = NULL;
1157
Sebastian Pop86500282012-01-13 20:37:10 +00001158 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
1159 it != ie; ++it) {
1160 if ((*it)->getOption().matches(options::OPT_march_EQ) ||
Tony Linthicum76329bf2011-12-12 21:14:55 +00001161 (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
1162 A = *it;
1163 A->claim();
1164 }
Sebastian Pop86500282012-01-13 20:37:10 +00001165 else if ((*it)->getOption().matches(options::OPT_m_Joined)){
1166 StringRef Value = (*it)->getValue(Args,0);
1167 if (Value.startswith("v")) {
1168 A = *it;
1169 A->claim();
1170 }
1171 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001172 }
1173 return A;
1174}
1175
Sebastian Pop86500282012-01-13 20:37:10 +00001176static StringRef getHexagonTargetCPU(const ArgList &Args)
Tony Linthicum76329bf2011-12-12 21:14:55 +00001177{
1178 Arg *A;
1179 llvm::StringRef WhichHexagon;
1180
Sebastian Pop86500282012-01-13 20:37:10 +00001181 // Select the default CPU (v4) if none was given or detection failed.
Tony Linthicum76329bf2011-12-12 21:14:55 +00001182 if ((A = getLastHexagonArchArg (Args))) {
Sebastian Pop86500282012-01-13 20:37:10 +00001183 WhichHexagon = A->getValue(Args);
1184 if (WhichHexagon == "")
1185 return "v4";
1186 else
1187 return WhichHexagon;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001188 }
Sebastian Pop86500282012-01-13 20:37:10 +00001189 else
1190 return "v4";
Tony Linthicum76329bf2011-12-12 21:14:55 +00001191}
1192
1193void Clang::AddHexagonTargetArgs(const ArgList &Args,
1194 ArgStringList &CmdArgs) const {
1195 llvm::Triple Triple = getToolChain().getTriple();
1196
1197 CmdArgs.push_back("-target-cpu");
Sebastian Pop86500282012-01-13 20:37:10 +00001198 CmdArgs.push_back(Args.MakeArgString("hexagon" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001199 CmdArgs.push_back("-fno-signed-char");
1200 CmdArgs.push_back("-nobuiltininc");
1201
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001202 if (Args.hasArg(options::OPT_mqdsp6_compat))
Tony Linthicum76329bf2011-12-12 21:14:55 +00001203 CmdArgs.push_back("-mqdsp6-compat");
1204
1205 if (Arg *A = Args.getLastArg(options::OPT_G,
1206 options::OPT_msmall_data_threshold_EQ)) {
1207 std::string SmallDataThreshold="-small-data-threshold=";
1208 SmallDataThreshold += A->getValue(Args);
1209 CmdArgs.push_back ("-mllvm");
1210 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
1211 A->claim();
1212 }
1213
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001214 if (!Args.hasArg(options::OPT_fno_short_enums))
1215 CmdArgs.push_back("-fshort-enums");
1216 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1217 CmdArgs.push_back ("-mllvm");
1218 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1219 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001220 CmdArgs.push_back ("-mllvm");
1221 CmdArgs.push_back ("-machine-sink-split=0");
1222}
1223
Eric Christopher84fbdb42011-08-19 00:30:14 +00001224static bool
John McCall5fb5df92012-06-20 06:18:46 +00001225shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001226 const llvm::Triple &Triple) {
1227 // We use the zero-cost exception tables for Objective-C if the non-fragile
1228 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1229 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001230 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001231 return true;
1232
Bob Wilson6524dd32011-10-14 05:03:44 +00001233 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001234 return false;
1235
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001236 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001237 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001238 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001239}
1240
Anders Carlssone96ab552011-02-28 02:27:16 +00001241/// addExceptionArgs - Adds exception related arguments to the driver command
1242/// arguments. There's a master flag, -fexceptions and also language specific
1243/// flags to enable/disable C++ and Objective-C exceptions.
1244/// This makes it possible to for example disable C++ exceptions but enable
1245/// Objective-C exceptions.
1246static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1247 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001248 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001249 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001250 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001251 if (KernelOrKext) {
1252 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1253 // arguments now to avoid warnings about unused arguments.
1254 Args.ClaimAllArgs(options::OPT_fexceptions);
1255 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1256 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1257 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1258 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1259 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001260 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001261 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001262
1263 // Exceptions are enabled by default.
1264 bool ExceptionsEnabled = true;
1265
1266 // This keeps track of whether exceptions were explicitly turned on or off.
1267 bool DidHaveExplicitExceptionFlag = false;
1268
Rafael Espindola00a66572009-10-01 13:33:33 +00001269 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1270 options::OPT_fno_exceptions)) {
1271 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001272 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001273 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001274 ExceptionsEnabled = false;
1275
1276 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001277 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001278
Anders Carlssone96ab552011-02-28 02:27:16 +00001279 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001280
Anders Carlssone96ab552011-02-28 02:27:16 +00001281 // Exception tables and cleanups can be enabled with -fexceptions even if the
1282 // language itself doesn't support exceptions.
1283 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1284 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001285
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001286 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1287 // is not necessarily sensible, but follows GCC.
1288 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001289 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001290 options::OPT_fno_objc_exceptions,
1291 true)) {
1292 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001293
Eric Christopher84fbdb42011-08-19 00:30:14 +00001294 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001295 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001296 }
1297
1298 if (types::isCXX(InputType)) {
1299 bool CXXExceptionsEnabled = ExceptionsEnabled;
1300
Eric Christopher84fbdb42011-08-19 00:30:14 +00001301 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1302 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001303 options::OPT_fexceptions,
1304 options::OPT_fno_exceptions)) {
1305 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1306 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001307 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001308 CXXExceptionsEnabled = false;
1309 }
1310
1311 if (CXXExceptionsEnabled) {
1312 CmdArgs.push_back("-fcxx-exceptions");
1313
1314 ShouldUseExceptionTables = true;
1315 }
1316 }
1317
1318 if (ShouldUseExceptionTables)
1319 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001320}
1321
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001322static bool ShouldDisableCFI(const ArgList &Args,
1323 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001324 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001325 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001326 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001327 // we disable them if we think the .s file will be passed to it.
Rafael Espindolac41db922012-03-08 14:39:55 +00001328 Default = Args.hasFlag(options::OPT_integrated_as,
1329 options::OPT_no_integrated_as,
1330 TC.IsIntegratedAssemblerDefault());
Rafael Espindolaf934f982011-05-17 16:26:17 +00001331 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001332 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
1333 options::OPT_fno_dwarf2_cfi_asm,
1334 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001335}
1336
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001337static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1338 const ToolChain &TC) {
1339 bool IsIADefault = TC.IsIntegratedAssemblerDefault();
1340 bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
1341 options::OPT_no_integrated_as,
1342 IsIADefault);
1343 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1344 options::OPT_fno_dwarf_directory_asm,
1345 UseIntegratedAs);
1346 return !UseDwarfDirectory;
1347}
1348
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001349/// \brief Check whether the given input tree contains any compilation actions.
1350static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001351 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001352 return true;
1353
1354 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1355 if (ContainsCompileAction(*it))
1356 return true;
1357
1358 return false;
1359}
1360
1361/// \brief Check if -relax-all should be passed to the internal assembler.
1362/// This is done by default when compiling non-assembler source with -O0.
1363static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1364 bool RelaxDefault = true;
1365
1366 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1367 RelaxDefault = A->getOption().matches(options::OPT_O0);
1368
1369 if (RelaxDefault) {
1370 RelaxDefault = false;
1371 for (ActionList::const_iterator it = C.getActions().begin(),
1372 ie = C.getActions().end(); it != ie; ++it) {
1373 if (ContainsCompileAction(*it)) {
1374 RelaxDefault = true;
1375 break;
1376 }
1377 }
1378 }
1379
1380 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1381 RelaxDefault);
1382}
1383
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001384/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1385/// This needs to be called before we add the C run-time (malloc, etc).
1386static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001387 ArgStringList &CmdArgs) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001388 if (!Args.hasFlag(options::OPT_faddress_sanitizer,
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001389 options::OPT_fno_address_sanitizer, false))
1390 return;
Logan Chienc6fd8202012-09-02 09:30:11 +00001391 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001392 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanovea155f02012-06-04 11:15:05 +00001393 if (!Args.hasArg(options::OPT_pie))
1394 TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001395 }
Daniel Dunbar3ca41d42011-12-07 23:22:17 +00001396
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001397 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1398 llvm::sys::path::append(LibAsan, "lib", "linux",
1399 (Twine("libclang_rt.asan-") +
1400 TC.getArchName() + "-android.so"));
1401 CmdArgs.push_back(Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001402 } else {
1403 if (!Args.hasArg(options::OPT_shared)) {
1404 // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
1405 // resource directory.
1406 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1407 llvm::sys::path::append(LibAsan, "lib", "linux",
1408 (Twine("libclang_rt.asan-") +
1409 TC.getArchName() + ".a"));
1410 CmdArgs.push_back(Args.MakeArgString(LibAsan));
1411 CmdArgs.push_back("-lpthread");
1412 CmdArgs.push_back("-ldl");
1413 CmdArgs.push_back("-export-dynamic");
1414 }
1415 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001416}
1417
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001418/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1419/// This needs to be called before we add the C run-time (malloc, etc).
1420static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1421 ArgStringList &CmdArgs) {
1422 if (!Args.hasFlag(options::OPT_fthread_sanitizer,
1423 options::OPT_fno_thread_sanitizer, false))
1424 return;
1425 if (!Args.hasArg(options::OPT_shared)) {
1426 // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library
1427 // resource directory.
1428 SmallString<128> LibTsan(TC.getDriver().ResourceDir);
1429 llvm::sys::path::append(LibTsan, "lib", "linux",
1430 (Twine("libclang_rt.tsan-") +
1431 TC.getArchName() + ".a"));
1432 CmdArgs.push_back(Args.MakeArgString(LibTsan));
1433 CmdArgs.push_back("-lpthread");
1434 CmdArgs.push_back("-ldl");
1435 CmdArgs.push_back("-export-dynamic");
1436 }
1437}
1438
Rafael Espindola224dd632011-12-14 21:02:23 +00001439static bool shouldUseFramePointer(const ArgList &Args,
1440 const llvm::Triple &Triple) {
1441 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1442 options::OPT_fomit_frame_pointer))
1443 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1444
Rafael Espindola00b29182011-12-14 21:50:24 +00001445 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001446 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1447 Triple.getArch() == llvm::Triple::x86) &&
1448 Triple.getOS() == llvm::Triple::Linux) {
1449 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1450 if (!A->getOption().matches(options::OPT_O0))
1451 return false;
1452 }
1453
1454 return true;
1455}
1456
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001457void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001458 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001459 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001460 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001461 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001462 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1463 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001464 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001465 ArgStringList CmdArgs;
1466
Daniel Dunbare521a892009-03-31 20:53:55 +00001467 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1468
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001469 // Invoke ourselves in -cc1 mode.
1470 //
1471 // FIXME: Implement custom jobs for internal actions.
1472 CmdArgs.push_back("-cc1");
1473
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001474 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001475 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001476 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001477 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001478
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001479 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001480 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001481
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001482 if (isa<AnalyzeJobAction>(JA)) {
1483 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1484 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001485 } else if (isa<MigrateJobAction>(JA)) {
1486 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001487 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001488 if (Output.getType() == types::TY_Dependencies)
1489 CmdArgs.push_back("-Eonly");
1490 else
1491 CmdArgs.push_back("-E");
Daniel Dunbarc4343942010-02-03 03:07:56 +00001492 } else if (isa<AssembleJobAction>(JA)) {
1493 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001494
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001495 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001496 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001497
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001498 // When using an integrated assembler, translate -Wa, and -Xassembler
1499 // options.
1500 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1501 options::OPT_Xassembler),
1502 ie = Args.filtered_end(); it != ie; ++it) {
1503 const Arg *A = *it;
1504 A->claim();
1505
1506 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001507 StringRef Value = A->getValue(Args, i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001508
1509 if (Value == "-force_cpusubtype_ALL") {
1510 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001511 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001512 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001513 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001514 CmdArgs.push_back("-mllvm");
1515 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001516 } else if (Value == "--noexecstack") {
1517 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001518 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001519 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001520 << A->getOption().getName() << Value;
1521 }
1522 }
1523 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001524
1525 // Also ignore explicit -force_cpusubtype_ALL option.
1526 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001527 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001528 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001529 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001530
Aaron Ballman1f10cc52012-07-31 01:21:00 +00001531 if (JA.getType() == types::TY_Nothing)
1532 CmdArgs.push_back("-fsyntax-only");
1533 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001534 CmdArgs.push_back("-emit-pch");
1535 else
1536 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001537 } else {
1538 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001539
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001540 if (JA.getType() == types::TY_Nothing) {
1541 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001542 } else if (JA.getType() == types::TY_LLVM_IR ||
1543 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001544 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001545 } else if (JA.getType() == types::TY_LLVM_BC ||
1546 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001547 CmdArgs.push_back("-emit-llvm-bc");
1548 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00001549 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00001550 } else if (JA.getType() == types::TY_AST) {
1551 CmdArgs.push_back("-emit-pch");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001552 } else if (JA.getType() == types::TY_RewrittenObjC) {
1553 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001554 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00001555 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1556 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001557 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001558 } else {
1559 assert(JA.getType() == types::TY_PP_Asm &&
1560 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001561 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00001562 }
1563
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001564 // The make clang go fast button.
1565 CmdArgs.push_back("-disable-free");
1566
John McCallbb79b5f2010-02-13 03:50:24 +00001567 // Disable the verification pass in -asserts builds.
1568#ifdef NDEBUG
1569 CmdArgs.push_back("-disable-llvm-verifier");
1570#endif
1571
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001572 // Set the main file name, so that debug info works even with
1573 // -save-temps.
1574 CmdArgs.push_back("-main-file-name");
1575 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1576
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001577 // Some flags which affect the language (via preprocessor
1578 // defines). See darwin::CC1::AddCPPArgs.
1579 if (Args.hasArg(options::OPT_static))
1580 CmdArgs.push_back("-static-define");
1581
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001582 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00001583 // Enable region store model by default.
1584 CmdArgs.push_back("-analyzer-store=region");
1585
Ted Kremenek7bea9a12009-12-07 22:26:14 +00001586 // Treat blocks as analysis entry points.
1587 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1588
Ted Kremenek49c79792011-03-24 00:28:47 +00001589 CmdArgs.push_back("-analyzer-eagerly-assume");
1590
Anna Zaks0af3e062012-03-08 23:16:35 +00001591 CmdArgs.push_back("-analyzer-ipa=inlining");
Anna Zaksd5c30272012-03-01 22:37:46 +00001592
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001593 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001594 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001595 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00001596
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001597 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1598 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00001599
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001600 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00001601 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00001602
1603 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00001604
1605 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00001606 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1607 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1608 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1609 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1610 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1611 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001612 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001613
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001614 // Set the output format. The default is plist, for (lame) historical
1615 // reasons.
1616 CmdArgs.push_back("-analyzer-output");
1617 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
1618 CmdArgs.push_back(A->getValue(Args));
1619 else
1620 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001621
Ted Kremenekfe449a22010-03-22 22:32:05 +00001622 // Disable the presentation of standard compiler warnings when
1623 // using --analyze. We only want to show static analyzer diagnostics
1624 // or frontend errors.
1625 CmdArgs.push_back("-w");
1626
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001627 // Add -Xanalyzer arguments when running as analyzer.
1628 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00001629 }
1630
Daniel Dunbar4eadb602009-09-10 01:21:12 +00001631 CheckCodeGenerationOptions(D, Args);
1632
Daniel Dunbar44e71222009-04-29 18:32:25 +00001633 // Perform argument translation for LLVM backend. This
1634 // takes some care in reconciling with llvm-gcc. The
1635 // issue is that llvm-gcc translates these options based on
1636 // the values in cc1, whereas we are processing based on
1637 // the driver arguments.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001638
Daniel Dunbar44e71222009-04-29 18:32:25 +00001639 // This comes from the default translation the driver + cc1
1640 // would do to enable flag_pic.
Simon Atanasyana16b7fd2012-05-29 18:50:33 +00001641
1642 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1643 options::OPT_fpic, options::OPT_fno_pic,
1644 options::OPT_fPIE, options::OPT_fno_PIE,
1645 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruthc0c04552012-04-08 16:40:35 +00001646 bool PICDisabled = false;
1647 bool PICEnabled = false;
1648 bool PICForPIE = false;
1649 if (LastPICArg) {
1650 PICForPIE = (LastPICArg->getOption().matches(options::OPT_fPIE) ||
1651 LastPICArg->getOption().matches(options::OPT_fpie));
1652 PICEnabled = (PICForPIE ||
1653 LastPICArg->getOption().matches(options::OPT_fPIC) ||
1654 LastPICArg->getOption().matches(options::OPT_fpic));
1655 PICDisabled = !PICEnabled;
1656 }
1657 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1658 // PIC or PIE options above, if these show up, PIC is disabled.
1659 if (Args.hasArg(options::OPT_mkernel))
1660 PICDisabled = true;
1661 if (Args.hasArg(options::OPT_static))
1662 PICDisabled = true;
1663 bool DynamicNoPIC = Args.hasArg(options::OPT_mdynamic_no_pic);
1664
1665 // Select the relocation model.
Daniel Dunbar44e71222009-04-29 18:32:25 +00001666 const char *Model = getToolChain().GetForcedPicModel();
1667 if (!Model) {
Chandler Carruthc0c04552012-04-08 16:40:35 +00001668 if (DynamicNoPIC)
Daniel Dunbar44e71222009-04-29 18:32:25 +00001669 Model = "dynamic-no-pic";
1670 else if (PICDisabled)
1671 Model = "static";
1672 else if (PICEnabled)
1673 Model = "pic";
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001674 else
Daniel Dunbar44e71222009-04-29 18:32:25 +00001675 Model = getToolChain().GetDefaultRelocationModel();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001676 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001677 StringRef ModelStr = Model ? Model : "";
1678 if (Model && ModelStr != "pic") {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001679 CmdArgs.push_back("-mrelocation-model");
1680 CmdArgs.push_back(Model);
1681 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001682
Chandler Carruthc0c04552012-04-08 16:40:35 +00001683 // Infer the __PIC__ and __PIE__ values.
1684 if (ModelStr == "pic" && PICForPIE) {
1685 CmdArgs.push_back("-pie-level");
1686 CmdArgs.push_back((LastPICArg &&
1687 LastPICArg->getOption().matches(options::OPT_fPIE)) ?
1688 "2" : "1");
1689 } else if (ModelStr == "pic" || ModelStr == "dynamic-no-pic") {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00001690 CmdArgs.push_back("-pic-level");
Chandler Carruthc0c04552012-04-08 16:40:35 +00001691 CmdArgs.push_back(((ModelStr != "dynamic-no-pic" && LastPICArg &&
1692 LastPICArg->getOption().matches(options::OPT_fPIC)) ||
1693 getToolChain().getTriple().isOSDarwin()) ? "2" : "1");
Daniel Dunbar44e71222009-04-29 18:32:25 +00001694 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001695
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00001696 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1697 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00001698 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00001699
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001700 // LLVM Code Generator Options.
1701
Daniel Dunbar0bb03312011-02-09 17:54:19 +00001702 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
1703 CmdArgs.push_back("-mregparm");
1704 CmdArgs.push_back(A->getValue(Args));
1705 }
1706
Roman Divacky65b88cd2011-03-01 17:40:53 +00001707 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1708 CmdArgs.push_back("-mrtd");
1709
Rafael Espindola224dd632011-12-14 21:02:23 +00001710 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001711 CmdArgs.push_back("-mdisable-fp-elim");
1712 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1713 options::OPT_fno_zero_initialized_in_bss))
1714 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00001715 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1716 options::OPT_fno_strict_aliasing,
1717 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00001718 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00001719 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
1720 false))
1721 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00001722 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
1723 options::OPT_fno_optimize_sibling_calls))
1724 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001725
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001726 // Handle various floating point optimization flags, mapping them to the
1727 // appropriate LLVM code generation flags. The pattern for all of these is to
1728 // default off the codegen optimizations, and if any flag enables them and no
1729 // flag disables them after the flag enabling them, enable the codegen
1730 // optimization. This is complicated by several "umbrella" flags.
1731 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1732 options::OPT_ffinite_math_only,
1733 options::OPT_fno_finite_math_only,
1734 options::OPT_fhonor_infinities,
1735 options::OPT_fno_honor_infinities))
1736 if (A->getOption().getID() != options::OPT_fno_finite_math_only &&
1737 A->getOption().getID() != options::OPT_fhonor_infinities)
1738 CmdArgs.push_back("-menable-no-infs");
1739 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1740 options::OPT_ffinite_math_only,
1741 options::OPT_fno_finite_math_only,
1742 options::OPT_fhonor_nans,
1743 options::OPT_fno_honor_nans))
1744 if (A->getOption().getID() != options::OPT_fno_finite_math_only &&
1745 A->getOption().getID() != options::OPT_fhonor_nans)
1746 CmdArgs.push_back("-menable-no-nans");
1747
Benjamin Kramerc242ef22012-05-02 14:55:48 +00001748 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
1749 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001750 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1751 options::OPT_fmath_errno,
Chandler Carruth3634c662012-04-26 02:10:51 +00001752 options::OPT_fno_math_errno))
1753 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
1754 if (MathErrno)
1755 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001756
1757 // There are several flags which require disabling very specific
1758 // optimizations. Any of these being disabled forces us to turn off the
1759 // entire set of LLVM optimizations, so collect them through all the flag
1760 // madness.
1761 bool AssociativeMath = false;
1762 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1763 options::OPT_funsafe_math_optimizations,
1764 options::OPT_fno_unsafe_math_optimizations,
1765 options::OPT_fassociative_math,
1766 options::OPT_fno_associative_math))
1767 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1768 A->getOption().getID() != options::OPT_fno_associative_math)
1769 AssociativeMath = true;
1770 bool ReciprocalMath = false;
1771 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1772 options::OPT_funsafe_math_optimizations,
1773 options::OPT_fno_unsafe_math_optimizations,
1774 options::OPT_freciprocal_math,
1775 options::OPT_fno_reciprocal_math))
1776 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1777 A->getOption().getID() != options::OPT_fno_reciprocal_math)
1778 ReciprocalMath = true;
1779 bool SignedZeros = true;
1780 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1781 options::OPT_funsafe_math_optimizations,
1782 options::OPT_fno_unsafe_math_optimizations,
1783 options::OPT_fsigned_zeros,
1784 options::OPT_fno_signed_zeros))
1785 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1786 A->getOption().getID() != options::OPT_fsigned_zeros)
1787 SignedZeros = false;
1788 bool TrappingMath = true;
1789 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1790 options::OPT_funsafe_math_optimizations,
1791 options::OPT_fno_unsafe_math_optimizations,
1792 options::OPT_ftrapping_math,
1793 options::OPT_fno_trapping_math))
1794 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1795 A->getOption().getID() != options::OPT_ftrapping_math)
1796 TrappingMath = false;
1797 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
1798 !TrappingMath)
1799 CmdArgs.push_back("-menable-unsafe-fp-math");
1800
Lang Hamesaa53b932012-07-06 00:59:19 +00001801
1802 // Validate and pass through -fp-contract option.
1803 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1804 options::OPT_ffp_contract)) {
1805 if (A->getOption().getID() == options::OPT_ffp_contract) {
1806 StringRef Val = A->getValue(Args);
1807 if (Val == "fast" || Val == "on" || Val == "off") {
1808 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
1809 } else {
1810 D.Diag(diag::err_drv_unsupported_option_argument)
1811 << A->getOption().getName() << Val;
1812 }
1813 } else { // A is OPT_ffast_math
1814 // If fast-math is set then set the fp-contract mode to fast.
1815 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
1816 }
1817 }
1818
Bob Wilson6a039162012-07-19 03:52:53 +00001819 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
1820 // and if we find them, tell the frontend to provide the appropriate
1821 // preprocessor macros. This is distinct from enabling any optimizations as
1822 // these options induce language changes which must survive serialization
1823 // and deserialization, etc.
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001824 if (Args.hasArg(options::OPT_ffast_math))
1825 CmdArgs.push_back("-ffast-math");
Bob Wilson6a039162012-07-19 03:52:53 +00001826 if (Args.hasArg(options::OPT_ffinite_math_only))
1827 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001828
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001829 // Decide whether to use verbose asm. Verbose assembly is the default on
1830 // toolchains which have the integrated assembler on by default.
1831 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
1832 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001833 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001834 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001835 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001836
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001837 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
1838 CmdArgs.push_back("-mdebug-pass");
1839 CmdArgs.push_back("Structure");
1840 }
1841 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
1842 CmdArgs.push_back("-mdebug-pass");
1843 CmdArgs.push_back("Arguments");
1844 }
1845
John McCall8517abc2010-02-19 02:45:38 +00001846 // Enable -mconstructor-aliases except on darwin, where we have to
1847 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00001848 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00001849 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00001850
John McCall7ef5cb32011-03-18 02:56:14 +00001851 // Darwin's kernel doesn't support guard variables; just die if we
1852 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00001853 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00001854 CmdArgs.push_back("-fforbid-guard-variables");
1855
Douglas Gregordbe39272011-02-01 15:15:22 +00001856 if (Args.hasArg(options::OPT_mms_bitfields)) {
1857 CmdArgs.push_back("-mms-bitfields");
1858 }
John McCall8517abc2010-02-19 02:45:38 +00001859
Daniel Dunbar306945d2009-09-16 06:17:29 +00001860 // This is a coarse approximation of what llvm-gcc actually does, both
1861 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
1862 // complicated ways.
1863 bool AsynchronousUnwindTables =
1864 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
1865 options::OPT_fno_asynchronous_unwind_tables,
1866 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001867 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00001868 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
1869 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001870 CmdArgs.push_back("-munwind-tables");
1871
Rafael Espindola66aa0452012-06-19 01:26:10 +00001872 getToolChain().addClangTargetOptions(CmdArgs);
1873
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001874 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
1875 CmdArgs.push_back("-mlimit-float-precision");
1876 CmdArgs.push_back(A->getValue(Args));
1877 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001878
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001879 // FIXME: Handle -mtune=.
1880 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00001881
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001882 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001883 CmdArgs.push_back("-mcode-model");
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001884 CmdArgs.push_back(A->getValue(Args));
1885 }
1886
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001887 // Add target specific cpu and features flags.
1888 switch(getToolChain().getTriple().getArch()) {
1889 default:
1890 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001891
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001892 case llvm::Triple::arm:
1893 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00001894 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001895 break;
1896
Eric Christopher0b26a612010-03-02 02:41:08 +00001897 case llvm::Triple::mips:
1898 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00001899 case llvm::Triple::mips64:
1900 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00001901 AddMIPSTargetArgs(Args, CmdArgs);
1902 break;
1903
Hal Finkel8eb59282012-06-11 22:35:19 +00001904 case llvm::Triple::ppc:
1905 case llvm::Triple::ppc64:
1906 AddPPCTargetArgs(Args, CmdArgs);
1907 break;
1908
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001909 case llvm::Triple::sparc:
1910 AddSparcTargetArgs(Args, CmdArgs);
1911 break;
1912
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001913 case llvm::Triple::x86:
1914 case llvm::Triple::x86_64:
1915 AddX86TargetArgs(Args, CmdArgs);
1916 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001917
1918 case llvm::Triple::hexagon:
1919 AddHexagonTargetArgs(Args, CmdArgs);
1920 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00001921 }
1922
Tony Linthicum76329bf2011-12-12 21:14:55 +00001923
1924
Daniel Dunbar976a2f52010-08-11 23:07:47 +00001925 // Pass the linker version in use.
1926 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1927 CmdArgs.push_back("-target-linker-version");
1928 CmdArgs.push_back(A->getValue(Args));
1929 }
1930
Nick Lewycky75033772011-02-02 06:43:03 +00001931 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00001932 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewycky75033772011-02-02 06:43:03 +00001933 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson6524dd32011-10-14 05:03:44 +00001934 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00001935 CmdArgs.push_back("-momit-leaf-frame-pointer");
1936
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00001937 // Explicitly error on some things we know we don't support and can't just
1938 // ignore.
1939 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001940 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
1941 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001942 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00001943 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001944 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00001945 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
1946 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001947 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001948 << Unsupported->getOption().getName();
1949 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00001950 }
1951
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001952 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00001953 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00001954 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00001955 CmdArgs.push_back("-header-include-file");
1956 CmdArgs.push_back(D.CCPrintHeadersFilename ?
1957 D.CCPrintHeadersFilename : "-");
1958 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001959 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00001960 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001961
Chad Rosierbe10f982011-08-02 17:58:04 +00001962 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00001963 CmdArgs.push_back("-diagnostic-log-file");
1964 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
1965 D.CCLogDiagnosticsFilename : "-");
1966 }
1967
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00001968 // Use the last option from "-g" group. "-gline-tables-only" is
1969 // preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00001970 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00001971 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
1972 if (A->getOption().matches(options::OPT_gline_tables_only)) {
1973 CmdArgs.push_back("-gline-tables-only");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00001974 } else if (!A->getOption().matches(options::OPT_g0) &&
1975 !A->getOption().matches(options::OPT_ggdb0)) {
Chad Rosier8fe3b112011-11-07 19:52:29 +00001976 CmdArgs.push_back("-g");
Chad Rosierc2bf3382011-11-04 19:28:44 +00001977 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00001978 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001979
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00001980 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
1981 Args.ClaimAllArgs(options::OPT_g_flags_Group);
1982
Rafael Espindola66bfb2752010-05-06 21:06:04 +00001983 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
1984 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
1985
Chris Lattner3c77a352010-06-22 00:03:40 +00001986 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
1987
Nick Lewycky207bce32011-04-21 23:44:07 +00001988 if (Args.hasArg(options::OPT_ftest_coverage) ||
1989 Args.hasArg(options::OPT_coverage))
1990 CmdArgs.push_back("-femit-coverage-notes");
1991 if (Args.hasArg(options::OPT_fprofile_arcs) ||
1992 Args.hasArg(options::OPT_coverage))
1993 CmdArgs.push_back("-femit-coverage-data");
1994
Nick Lewycky480cb992011-05-04 20:46:58 +00001995 if (C.getArgs().hasArg(options::OPT_c) ||
1996 C.getArgs().hasArg(options::OPT_S)) {
1997 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00001998 CmdArgs.push_back("-coverage-file");
Bill Wendling8c0b4bc2012-08-30 00:43:41 +00001999 SmallString<128> absFilename(Output.getFilename());
2000 llvm::sys::fs::make_absolute(absFilename);
2001 CmdArgs.push_back(Args.MakeArgString(absFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002002 }
2003 }
2004
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002005 // Pass options for controlling the default header search paths.
2006 if (Args.hasArg(options::OPT_nostdinc)) {
2007 CmdArgs.push_back("-nostdsysteminc");
2008 CmdArgs.push_back("-nobuiltininc");
2009 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002010 if (Args.hasArg(options::OPT_nostdlibinc))
2011 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002012 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2013 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2014 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002015
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002016 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002017 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002018 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002019
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002020 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2021
Ted Kremenekf7639e12012-03-06 20:06:33 +00002022 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002023 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002024 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002025 options::OPT_ccc_arcmt_modify,
2026 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002027 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002028 switch (A->getOption().getID()) {
2029 default:
2030 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002031 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002032 CmdArgs.push_back("-arcmt-check");
2033 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002034 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002035 CmdArgs.push_back("-arcmt-modify");
2036 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002037 case options::OPT_ccc_arcmt_migrate:
2038 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002039 CmdArgs.push_back("-mt-migrate-directory");
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002040 CmdArgs.push_back(A->getValue(Args));
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002041
2042 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2043 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002044 break;
John McCalld70fb982011-06-15 23:25:17 +00002045 }
2046 }
2047 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002048
Ted Kremenekf7639e12012-03-06 20:06:33 +00002049 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2050 if (ARCMTEnabled) {
2051 D.Diag(diag::err_drv_argument_not_allowed_with)
2052 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2053 }
2054 CmdArgs.push_back("-mt-migrate-directory");
2055 CmdArgs.push_back(A->getValue(Args));
2056
2057 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2058 options::OPT_objcmt_migrate_subscripting)) {
2059 // None specified, means enable them all.
2060 CmdArgs.push_back("-objcmt-migrate-literals");
2061 CmdArgs.push_back("-objcmt-migrate-subscripting");
2062 } else {
2063 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2064 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2065 }
2066 }
2067
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002068 // Add preprocessing options like -I, -D, etc. if we are using the
2069 // preprocessor.
2070 //
2071 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002072 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Peter Collingbourne9b515cb2011-11-06 00:40:05 +00002073 AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002074
Rafael Espindolaa7431922011-07-21 23:40:37 +00002075 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2076 // that "The compiler can only warn and ignore the option if not recognized".
2077 // When building with ccache, it will pass -D options to clang even on
2078 // preprocessed inputs and configure concludes that -fPIC is not supported.
2079 Args.ClaimAllArgs(options::OPT_D);
2080
Daniel Dunbar58f78332009-09-17 06:53:36 +00002081 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002082 // others.
2083 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002084 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002085 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002086 else if (A->getOption().matches(options::OPT_O) &&
2087 A->getValue(Args)[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002088 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002089 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002090 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002091 }
2092
Daniel Dunbar945577c2009-10-29 02:24:45 +00002093 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002094 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2095 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002096 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002097 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002098
2099 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2100 // (-ansi is equivalent to -std=c89).
2101 //
2102 // If a std is supplied, only add -trigraphs if it follows the
2103 // option.
2104 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2105 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002106 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002107 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002108 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002109 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002110 else
2111 Std->render(Args, CmdArgs);
2112
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002113 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2114 options::OPT_trigraphs))
2115 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002116 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002117 } else {
2118 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002119 //
2120 // FIXME: Clang doesn't correctly handle -std= when the input language
2121 // doesn't match. For the time being just ignore this for C++ inputs;
2122 // eventually we want to do all the standard defaulting here instead of
2123 // splitting it between the driver and clang -cc1.
2124 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002125 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2126 "-std=", /*Joined=*/true);
2127 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2128 CmdArgs.push_back("-std=c++11");
2129
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002130 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002131 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002132
Chandler Carruthb009b142011-04-23 06:30:43 +00002133 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2134 // '-fconst-strings'; this better indicates its actual behavior.
2135 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2136 false)) {
2137 // For perfect compatibility with GCC, we do this even in the presence of
2138 // '-w'. This flag names something other than a warning for GCC.
2139 CmdArgs.push_back("-fconst-strings");
2140 }
2141
Chandler Carruth61fbf622011-04-23 09:27:53 +00002142 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002143 // during C++ compilation, which it is by default. GCC keeps this define even
2144 // in the presence of '-w', match this behavior bug-for-bug.
2145 if (types::isCXX(InputType) &&
2146 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2147 true)) {
2148 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002149 }
2150
Chandler Carruthe0391482010-05-22 02:21:53 +00002151 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2152 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2153 if (Asm->getOption().matches(options::OPT_fasm))
2154 CmdArgs.push_back("-fgnu-keywords");
2155 else
2156 CmdArgs.push_back("-fno-gnu-keywords");
2157 }
2158
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002159 if (ShouldDisableCFI(Args, getToolChain()))
2160 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002161
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002162 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2163 CmdArgs.push_back("-fno-dwarf-directory-asm");
2164
Nick Lewyckyba743b72011-10-21 02:32:14 +00002165 if (const char *pwd = ::getenv("PWD")) {
2166 // GCC also verifies that stat(pwd) and stat(".") have the same inode
2167 // number. Not doing those because stats are slow, but we could.
NAKAMURA Takumib5e6fa22011-10-22 10:25:25 +00002168 if (llvm::sys::path::is_absolute(pwd)) {
Nick Lewyckyba743b72011-10-21 02:32:14 +00002169 std::string CompDir = pwd;
2170 CmdArgs.push_back("-fdebug-compilation-dir");
2171 CmdArgs.push_back(Args.MakeArgString(CompDir));
2172 }
2173 }
2174
Richard Smith9a568822011-11-21 19:36:32 +00002175 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2176 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002177 CmdArgs.push_back("-ftemplate-depth");
2178 CmdArgs.push_back(A->getValue(Args));
2179 }
2180
Richard Smith9a568822011-11-21 19:36:32 +00002181 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2182 CmdArgs.push_back("-fconstexpr-depth");
2183 CmdArgs.push_back(A->getValue(Args));
2184 }
2185
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002186 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2187 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002188 if (A->getNumValues()) {
2189 StringRef bytes = A->getValue(Args);
2190 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2191 } else
2192 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002193 }
2194
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002195 if (Arg *A = Args.getLastArg(options::OPT_fbounds_checking,
2196 options::OPT_fbounds_checking_EQ)) {
2197 if (A->getNumValues()) {
2198 StringRef val = A->getValue(Args);
2199 CmdArgs.push_back(Args.MakeArgString("-fbounds-checking=" + val));
2200 } else
2201 CmdArgs.push_back("-fbounds-checking=1");
2202 }
2203
Daniel Dunbarfffd1812009-11-19 04:00:53 +00002204 if (Args.hasArg(options::OPT__relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002205 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002206
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002207 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2208 CmdArgs.push_back("-fconstant-string-class");
2209 CmdArgs.push_back(A->getValue(Args));
2210 }
David Chisnall5778fce2009-08-31 16:41:57 +00002211
Chris Lattnere23003d2010-01-09 21:54:33 +00002212 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2213 CmdArgs.push_back("-ftabstop");
2214 CmdArgs.push_back(A->getValue(Args));
2215 }
2216
Chris Lattnerb35583d2010-04-07 20:49:23 +00002217 CmdArgs.push_back("-ferror-limit");
2218 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
2219 CmdArgs.push_back(A->getValue(Args));
2220 else
2221 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002222
Chandler Carrutha77a7272010-05-06 04:55:18 +00002223 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2224 CmdArgs.push_back("-fmacro-backtrace-limit");
Douglas Gregorcd121fb2010-05-04 17:13:42 +00002225 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002226 }
2227
2228 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2229 CmdArgs.push_back("-ftemplate-backtrace-limit");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002230 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002231 }
2232
Richard Smithf6f003a2011-12-16 19:06:07 +00002233 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2234 CmdArgs.push_back("-fconstexpr-backtrace-limit");
2235 CmdArgs.push_back(A->getValue(Args));
2236 }
2237
Daniel Dunbar2c978472009-11-04 06:24:47 +00002238 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002239 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002240 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002241 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002242 } else {
2243 // If -fmessage-length=N was not specified, determine whether this is a
2244 // terminal and, if so, implicitly define -fmessage-length appropriately.
2245 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002246 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002247 }
2248
Daniel Dunbare357d562009-12-03 18:42:11 +00002249 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2250 CmdArgs.push_back("-fvisibility");
2251 CmdArgs.push_back(A->getValue(Args));
2252 }
2253
Douglas Gregor08329632010-06-15 17:05:35 +00002254 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002255
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002256 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2257
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002258 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002259 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2260 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002261 CmdArgs.push_back("-ffreestanding");
2262
Daniel Dunbare357d562009-12-03 18:42:11 +00002263 // Forward -f (flag) options which we can pass directly.
Mike Stumpd9546382009-12-12 01:27:46 +00002264 Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002265 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002266 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002267 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002268 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002269 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002270 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002271 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2272 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002273
2274 // Report and error for -faltivec on anything other then PowerPC.
2275 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2276 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2277 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2278 D.Diag(diag::err_drv_argument_only_allowed_with)
2279 << A->getAsString(Args) << "ppc/ppc64";
2280
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002281 if (getToolChain().SupportsProfiling())
2282 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002283
Kostya Serebryany8855ff62011-11-16 17:34:26 +00002284 if (Args.hasFlag(options::OPT_faddress_sanitizer,
2285 options::OPT_fno_address_sanitizer, false))
2286 CmdArgs.push_back("-faddress-sanitizer");
2287
Kostya Serebryany28a7a112012-03-01 22:27:08 +00002288 if (Args.hasFlag(options::OPT_fthread_sanitizer,
2289 options::OPT_fno_thread_sanitizer, false))
2290 CmdArgs.push_back("-fthread-sanitizer");
2291
Daniel Dunbar35621a92010-03-16 16:57:46 +00002292 // -flax-vector-conversions is default.
2293 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2294 options::OPT_fno_lax_vector_conversions))
2295 CmdArgs.push_back("-fno-lax-vector-conversions");
2296
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002297 if (Args.getLastArg(options::OPT_fapple_kext))
2298 CmdArgs.push_back("-fapple-kext");
2299
David Blaikie690f21e2012-06-14 18:55:27 +00002300 if (Args.hasFlag(options::OPT_frewrite_includes,
2301 options::OPT_fno_rewrite_includes, false))
2302 CmdArgs.push_back("-frewrite-includes");
2303
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002304 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002305 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002306 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002307 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2308 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002309
2310 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2311 CmdArgs.push_back("-ftrapv-handler");
2312 CmdArgs.push_back(A->getValue(Args));
2313 }
2314
Bob Wilson14adb362012-02-03 06:27:22 +00002315 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002316
Chandler Carruth6e501032011-03-27 00:04:55 +00002317 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2318 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2319 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2320 options::OPT_fno_wrapv)) {
2321 if (A->getOption().matches(options::OPT_fwrapv))
2322 CmdArgs.push_back("-fwrapv");
2323 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2324 options::OPT_fno_strict_overflow)) {
2325 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2326 CmdArgs.push_back("-fwrapv");
2327 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002328 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002329 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002330
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002331 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2332
Daniel Dunbar4930e332009-11-17 08:07:36 +00002333 // -stack-protector=0 is default.
2334 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002335 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2336 options::OPT_fstack_protector_all,
2337 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002338 if (A->getOption().matches(options::OPT_fstack_protector))
2339 StackProtectorLevel = 1;
2340 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2341 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002342 } else {
2343 StackProtectorLevel =
2344 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2345 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002346 if (StackProtectorLevel) {
2347 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002348 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002349 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002350
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002351 // --param ssp-buffer-size=
2352 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2353 ie = Args.filtered_end(); it != ie; ++it) {
2354 StringRef Str((*it)->getValue(Args));
2355 if (Str.startswith("ssp-buffer-size=")) {
2356 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00002357 CmdArgs.push_back("-stack-protector-buffer-size");
2358 // FIXME: Verify the argument is a valid integer.
2359 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002360 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002361 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00002362 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002363 }
2364
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002365 // Translate -mstackrealign
2366 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2367 false)) {
2368 CmdArgs.push_back("-backend-option");
2369 CmdArgs.push_back("-force-align-stack");
2370 }
2371 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2372 false)) {
2373 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2374 }
2375
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002376 if (Args.hasArg(options::OPT_mstack_alignment)) {
2377 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2378 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002379 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002380
Daniel Dunbard18049a2009-04-07 21:16:11 +00002381 // Forward -f options with positive and negative forms; we translate
2382 // these by hand.
2383
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002384 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002385 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002386 CmdArgs.push_back("-fapple-kext");
2387 if (!Args.hasArg(options::OPT_fbuiltin))
2388 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002389 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002390 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002391 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002392 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002393 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002394
Nuno Lopes13c88c72009-12-16 16:59:22 +00002395 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2396 options::OPT_fno_assume_sane_operator_new))
2397 CmdArgs.push_back("-fno-assume-sane-operator-new");
2398
Daniel Dunbar4930e332009-11-17 08:07:36 +00002399 // -fblocks=0 is default.
2400 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002401 getToolChain().IsBlocksDefault()) ||
2402 (Args.hasArg(options::OPT_fgnu_runtime) &&
2403 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2404 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002405 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002406
2407 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2408 !getToolChain().hasBlocksRuntime())
2409 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002410 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002411
Douglas Gregor226173a2012-01-18 15:19:58 +00002412 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2413 // users must also pass -fcxx-modules. The latter flag will disappear once the
2414 // modules implementation is solid for C++/Objective-C++ programs as well.
2415 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2416 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2417 options::OPT_fno_cxx_modules,
2418 false);
2419 if (AllowedInCXX || !types::isCXX(InputType))
2420 CmdArgs.push_back("-fmodules");
2421 }
Douglas Gregor787869b2012-01-03 17:13:05 +00002422
John McCalldfea9982010-04-09 19:12:06 +00002423 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002424 if (Args.hasFlag(options::OPT_fno_access_control,
2425 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002426 false))
John McCall3155f572010-04-09 19:03:51 +00002427 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00002428
Anders Carlssond470fef2010-11-21 00:09:52 +00002429 // -felide-constructors is the default.
2430 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2431 options::OPT_felide_constructors,
2432 false))
2433 CmdArgs.push_back("-fno-elide-constructors");
2434
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002435 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002436 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
2437 KernelOrKext)
Daniel Dunbar484afa22009-11-19 04:55:23 +00002438 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00002439
Tony Linthicum76329bf2011-12-12 21:14:55 +00002440 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002441 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00002442 options::OPT_fno_short_enums,
2443 getToolChain().getTriple().getArch() ==
2444 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002445 CmdArgs.push_back("-fshort-enums");
2446
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002447 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002448 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002449 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00002450 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00002451
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002452 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002453 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002454 options::OPT_fno_threadsafe_statics))
2455 CmdArgs.push_back("-fno-threadsafe-statics");
2456
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002457 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002458 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2459 options::OPT_fno_use_cxa_atexit,
2460 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00002461 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00002462 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2463 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002464 CmdArgs.push_back("-fno-use-cxa-atexit");
2465
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002466 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002467 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002468 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2469 CmdArgs.push_back("-fms-extensions");
2470
Chad Rosiered943242012-07-20 21:20:33 +00002471 // -fms-inline-asm.
Chad Rosierd3957e52012-07-20 23:12:26 +00002472 if (Args.hasArg(options::OPT_fenable_experimental_ms_inline_asm))
2473 CmdArgs.push_back("-fenable-experimental-ms-inline-asm");
Chad Rosiered943242012-07-20 21:20:33 +00002474
Francois Pichet1b4f1632011-09-17 04:32:15 +00002475 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00002476 if (Args.hasFlag(options::OPT_fms_compatibility,
2477 options::OPT_fno_ms_compatibility,
2478 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2479 Args.hasFlag(options::OPT_fms_extensions,
2480 options::OPT_fno_ms_extensions,
2481 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00002482 CmdArgs.push_back("-fms-compatibility");
2483
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002484 // -fmsc-version=1300 is default.
2485 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2486 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2487 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002488 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002489 if (msc_ver.empty())
2490 CmdArgs.push_back("-fmsc-version=1300");
2491 else
2492 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2493 }
2494
2495
Dawn Perchik68bb1b42010-09-02 23:59:25 +00002496 // -fborland-extensions=0 is default.
2497 if (Args.hasFlag(options::OPT_fborland_extensions,
2498 options::OPT_fno_borland_extensions, false))
2499 CmdArgs.push_back("-fborland-extensions");
2500
Francois Pichet02744872011-09-01 16:38:08 +00002501 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2502 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00002503 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2504 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00002505 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00002506 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00002507
Chandler Carruthe03aa552010-04-17 20:17:31 +00002508 // -fgnu-keywords default varies depending on language; only pass if
2509 // specified.
2510 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00002511 options::OPT_fno_gnu_keywords))
2512 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00002513
Rafael Espindola922a6242011-06-02 17:30:53 +00002514 if (Args.hasFlag(options::OPT_fgnu89_inline,
2515 options::OPT_fno_gnu89_inline,
2516 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00002517 CmdArgs.push_back("-fgnu89-inline");
2518
Chad Rosier9c76d242012-03-15 22:31:42 +00002519 if (Args.hasArg(options::OPT_fno_inline))
2520 CmdArgs.push_back("-fno-inline");
2521
Chad Rosier64d6be92012-03-06 21:17:19 +00002522 if (Args.hasArg(options::OPT_fno_inline_functions))
2523 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00002524
John McCall5fb5df92012-06-20 06:18:46 +00002525 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00002526
John McCall5fb5df92012-06-20 06:18:46 +00002527 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2528 // legacy is the default.
2529 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00002530 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2531 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00002532 objcRuntime.isLegacyDispatchDefaultForArch(
2533 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00002534 if (getToolChain().UseObjCMixedDispatch())
2535 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2536 else
2537 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2538 }
2539 }
2540
Nico Weber97bd94b2012-03-09 21:19:44 +00002541 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2542 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00002543 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00002544 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2545 }
2546
John McCall24fc0de2011-07-06 00:26:06 +00002547 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2548 // NOTE: This logic is duplicated in ToolChains.cpp.
2549 bool ARC = isObjCAutoRefCount(Args);
2550 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00002551 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00002552
John McCall24fc0de2011-07-06 00:26:06 +00002553 CmdArgs.push_back("-fobjc-arc");
2554
Chandler Carruth491db322011-11-04 07:34:47 +00002555 // FIXME: It seems like this entire block, and several around it should be
2556 // wrapped in isObjC, but for now we just use it here as this is where it
2557 // was being used previously.
2558 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2559 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2560 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2561 else
2562 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2563 }
2564
John McCall24fc0de2011-07-06 00:26:06 +00002565 // Allow the user to enable full exceptions code emission.
2566 // We define off for Objective-CC, on for Objective-C++.
2567 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2568 options::OPT_fno_objc_arc_exceptions,
2569 /*default*/ types::isCXX(InputType)))
2570 CmdArgs.push_back("-fobjc-arc-exceptions");
2571 }
2572
2573 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2574 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00002575 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00002576 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002577
John McCall24fc0de2011-07-06 00:26:06 +00002578 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2579 // takes precedence.
2580 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2581 if (!GCArg)
2582 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2583 if (GCArg) {
2584 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002585 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00002586 << GCArg->getAsString(Args);
2587 } else if (getToolChain().SupportsObjCGC()) {
2588 GCArg->render(Args, CmdArgs);
2589 } else {
2590 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002591 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00002592 << GCArg->getAsString(Args);
2593 }
2594 }
2595
John McCallb5f652e2011-06-22 00:53:57 +00002596 // Add exception args.
2597 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00002598 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00002599
2600 if (getToolChain().UseSjLjExceptions())
2601 CmdArgs.push_back("-fsjlj-exceptions");
2602
2603 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00002604 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2605 options::OPT_fno_assume_sane_operator_new))
2606 CmdArgs.push_back("-fno-assume-sane-operator-new");
2607
Daniel Dunbar34d7a992010-04-27 15:34:57 +00002608 // -fconstant-cfstrings is default, and may be subject to argument translation
2609 // on Darwin.
2610 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2611 options::OPT_fno_constant_cfstrings) ||
2612 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2613 options::OPT_mno_constant_cfstrings))
2614 CmdArgs.push_back("-fno-constant-cfstrings");
2615
John Thompsoned4e2952009-11-05 20:14:16 +00002616 // -fshort-wchar default varies depending on platform; only
2617 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00002618 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2619 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00002620
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00002621 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2622 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00002623 //
2624 // FIXME: This is gross; that translation should be pulled from the
2625 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002626 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00002627 options::OPT_fno_pascal_strings,
2628 false) ||
2629 Args.hasFlag(options::OPT_mpascal_strings,
2630 options::OPT_mno_pascal_strings,
2631 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002632 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002633
Daniel Dunbar096ed292011-10-05 21:04:55 +00002634 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2635 // -fno-pack-struct doesn't apply to -fpack-struct=.
2636 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00002637 std::string PackStructStr = "-fpack-struct=";
2638 PackStructStr += A->getValue(Args);
2639 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00002640 } else if (Args.hasFlag(options::OPT_fpack_struct,
2641 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00002642 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00002643 }
2644
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002645 if (Args.hasArg(options::OPT_mkernel) ||
2646 Args.hasArg(options::OPT_fapple_kext)) {
2647 if (!Args.hasArg(options::OPT_fcommon))
2648 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00002649 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002650 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00002651
Daniel Dunbard18049a2009-04-07 21:16:11 +00002652 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002653 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002654 CmdArgs.push_back("-fno-common");
2655
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002656 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00002657 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00002658 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002659 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002660 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002661 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2662
Daniel Dunbar6358d682010-10-15 22:30:42 +00002663 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2664 if (!Args.hasFlag(options::OPT_ffor_scope,
2665 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002666 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00002667 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2668
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00002669 // -fcaret-diagnostics is default.
2670 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2671 options::OPT_fno_caret_diagnostics, true))
2672 CmdArgs.push_back("-fno-caret-diagnostics");
2673
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002674 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00002675 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002676 options::OPT_fno_diagnostics_fixit_info))
2677 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002678
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002679 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00002680 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002681 options::OPT_fno_diagnostics_show_option))
2682 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002683
Chris Lattnerbf6fac82010-05-04 21:55:25 +00002684 if (const Arg *A =
2685 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
2686 CmdArgs.push_back("-fdiagnostics-show-category");
2687 CmdArgs.push_back(A->getValue(Args));
2688 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002689
Douglas Gregor643c9222011-05-21 17:07:29 +00002690 if (const Arg *A =
2691 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
2692 CmdArgs.push_back("-fdiagnostics-format");
2693 CmdArgs.push_back(A->getValue(Args));
2694 }
2695
Chandler Carruthb6766f02011-03-27 01:50:55 +00002696 if (Arg *A = Args.getLastArg(
2697 options::OPT_fdiagnostics_show_note_include_stack,
2698 options::OPT_fno_diagnostics_show_note_include_stack)) {
2699 if (A->getOption().matches(
2700 options::OPT_fdiagnostics_show_note_include_stack))
2701 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
2702 else
2703 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
2704 }
2705
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002706 // Color diagnostics are the default, unless the terminal doesn't support
2707 // them.
2708 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidis4f920162010-09-23 12:56:06 +00002709 options::OPT_fno_color_diagnostics,
2710 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002711 CmdArgs.push_back("-fcolor-diagnostics");
2712
Daniel Dunbardb097022009-06-08 21:13:54 +00002713 if (!Args.hasFlag(options::OPT_fshow_source_location,
2714 options::OPT_fno_show_source_location))
2715 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002716
Douglas Gregor643c9222011-05-21 17:07:29 +00002717 if (!Args.hasFlag(options::OPT_fshow_column,
2718 options::OPT_fno_show_column,
2719 true))
2720 CmdArgs.push_back("-fno-show-column");
2721
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00002722 if (!Args.hasFlag(options::OPT_fspell_checking,
2723 options::OPT_fno_spell_checking))
2724 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002725
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002726
Daniel Dunbar3ada2b72010-11-02 19:42:04 +00002727 // Silently ignore -fasm-blocks for now.
2728 (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
2729 false);
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002730
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00002731 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
2732 A->render(Args, CmdArgs);
2733
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002734 // -fdollars-in-identifiers default varies depending on platform and
2735 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00002736 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002737 options::OPT_fno_dollars_in_identifiers)) {
2738 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002739 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002740 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002741 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002742 }
2743
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002744 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
2745 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00002746 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002747 options::OPT_fno_unit_at_a_time)) {
2748 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002749 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002750 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002751
Eli Friedman055c9702011-11-02 01:53:16 +00002752 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
2753 options::OPT_fno_apple_pragma_pack, false))
2754 CmdArgs.push_back("-fapple-pragma-pack");
2755
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002756 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002757 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002758 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002759#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00002760 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002761 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
2762 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
2763 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
2764 CmdArgs.push_back("-fno-builtin-strcat");
2765 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
2766 CmdArgs.push_back("-fno-builtin-strcpy");
2767 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002768#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002769
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002770 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00002771 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002772 options::OPT_traditional_cpp)) {
2773 if (isa<PreprocessJobAction>(JA))
2774 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002775 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002776 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002777 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002778
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002779 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00002780 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00002781
2782 // Handle serialized diagnostics.
2783 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
2784 CmdArgs.push_back("-serialize-diagnostic-file");
2785 CmdArgs.push_back(Args.MakeArgString(A->getValue(Args)));
2786 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002787
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00002788 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
2789 CmdArgs.push_back("-fretain-comments-from-system-headers");
2790
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002791 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
2792 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002793 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002794 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
2795 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00002796 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00002797
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002798 // We translate this by hand to the -cc1 argument, since nightly test uses
2799 // it and developers have been trained to spell it with -mllvm.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002800 if (StringRef((*it)->getValue(Args, 0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002801 CmdArgs.push_back("-disable-llvm-optzns");
2802 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00002803 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002804 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002805
Daniel Dunbard67a3222009-03-30 06:36:42 +00002806 if (Output.getType() == types::TY_Dependencies) {
2807 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002808 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00002809 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002810 CmdArgs.push_back(Output.getFilename());
2811 } else {
2812 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002813 }
2814
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002815 for (InputInfoList::const_iterator
2816 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2817 const InputInfo &II = *it;
2818 CmdArgs.push_back("-x");
2819 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00002820 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002821 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002822 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002823 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002824 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002825
Chris Lattnere9d7d782009-11-03 19:50:27 +00002826 Args.AddAllArgs(CmdArgs, options::OPT_undef);
2827
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00002828 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002829
2830 // Optionally embed the -cc1 level arguments into the debug info, for build
2831 // analysis.
2832 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002833 ArgStringList OriginalArgs;
2834 for (ArgList::const_iterator it = Args.begin(),
2835 ie = Args.end(); it != ie; ++it)
2836 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002837
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00002838 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002839 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002840 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002841 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002842 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002843 }
2844 CmdArgs.push_back("-dwarf-debug-flags");
2845 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
2846 }
2847
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00002848 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00002849
Roman Divacky178e01602011-02-10 16:52:03 +00002850 if (Arg *A = Args.getLastArg(options::OPT_pg))
2851 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002852 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00002853 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002854
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002855 // Claim some arguments which clang supports automatically.
2856
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00002857 // -fpch-preprocess is used with gcc to add a special marker in the output to
2858 // include the PCH file. Clang's PTH solution is completely transparent, so we
2859 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002860 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002861
Daniel Dunbar17731772009-03-23 19:03:36 +00002862 // Claim some arguments which clang doesn't support, but we don't
2863 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00002864 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
2865 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00002866
Rafael Espindolad95a8122011-03-01 05:25:27 +00002867 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00002868 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00002869 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002870}
2871
Jim Grosbach576452b2012-02-10 20:37:10 +00002872void ClangAs::AddARMTargetArgs(const ArgList &Args,
2873 ArgStringList &CmdArgs) const {
2874 const Driver &D = getToolChain().getDriver();
2875 llvm::Triple Triple = getToolChain().getTriple();
2876
2877 // Set the CPU based on -march= and -mcpu=.
2878 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00002879 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00002880
2881 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00002882 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00002883 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00002884
2885 // Honor -mfpmath=.
2886 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00002887 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00002888}
2889
John McCall5fb5df92012-06-20 06:18:46 +00002890/// Add options related to the Objective-C runtime/ABI.
2891///
2892/// Returns true if the runtime is non-fragile.
2893ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
2894 ArgStringList &cmdArgs,
2895 RewriteKind rewriteKind) const {
2896 // Look for the controlling runtime option.
2897 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
2898 options::OPT_fgnu_runtime,
2899 options::OPT_fobjc_runtime_EQ);
2900
2901 // Just forward -fobjc-runtime= to the frontend. This supercedes
2902 // options about fragility.
2903 if (runtimeArg &&
2904 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
2905 ObjCRuntime runtime;
2906 StringRef value = runtimeArg->getValue(args);
2907 if (runtime.tryParse(value)) {
2908 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
2909 << value;
2910 }
2911
2912 runtimeArg->render(args, cmdArgs);
2913 return runtime;
2914 }
2915
2916 // Otherwise, we'll need the ABI "version". Version numbers are
2917 // slightly confusing for historical reasons:
2918 // 1 - Traditional "fragile" ABI
2919 // 2 - Non-fragile ABI, version 1
2920 // 3 - Non-fragile ABI, version 2
2921 unsigned objcABIVersion = 1;
2922 // If -fobjc-abi-version= is present, use that to set the version.
2923 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
2924 StringRef value = abiArg->getValue(args);
2925 if (value == "1")
2926 objcABIVersion = 1;
2927 else if (value == "2")
2928 objcABIVersion = 2;
2929 else if (value == "3")
2930 objcABIVersion = 3;
2931 else
2932 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2933 << value;
2934 } else {
2935 // Otherwise, determine if we are using the non-fragile ABI.
2936 bool nonFragileABIIsDefault =
2937 (rewriteKind == RK_NonFragile ||
2938 (rewriteKind == RK_None &&
2939 getToolChain().IsObjCNonFragileABIDefault()));
2940 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
2941 options::OPT_fno_objc_nonfragile_abi,
2942 nonFragileABIIsDefault)) {
2943 // Determine the non-fragile ABI version to use.
2944#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
2945 unsigned nonFragileABIVersion = 1;
2946#else
2947 unsigned nonFragileABIVersion = 2;
2948#endif
2949
2950 if (Arg *abiArg = args.getLastArg(
2951 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
2952 StringRef value = abiArg->getValue(args);
2953 if (value == "1")
2954 nonFragileABIVersion = 1;
2955 else if (value == "2")
2956 nonFragileABIVersion = 2;
2957 else
2958 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2959 << value;
2960 }
2961
2962 objcABIVersion = 1 + nonFragileABIVersion;
2963 } else {
2964 objcABIVersion = 1;
2965 }
2966 }
2967
2968 // We don't actually care about the ABI version other than whether
2969 // it's non-fragile.
2970 bool isNonFragile = objcABIVersion != 1;
2971
2972 // If we have no runtime argument, ask the toolchain for its default runtime.
2973 // However, the rewriter only really supports the Mac runtime, so assume that.
2974 ObjCRuntime runtime;
2975 if (!runtimeArg) {
2976 switch (rewriteKind) {
2977 case RK_None:
2978 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
2979 break;
2980 case RK_Fragile:
2981 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
2982 break;
2983 case RK_NonFragile:
2984 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
2985 break;
2986 }
2987
2988 // -fnext-runtime
2989 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
2990 // On Darwin, make this use the default behavior for the toolchain.
2991 if (getToolChain().getTriple().isOSDarwin()) {
2992 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
2993
2994 // Otherwise, build for a generic macosx port.
2995 } else {
2996 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
2997 }
2998
2999 // -fgnu-runtime
3000 } else {
3001 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003002 // Legacy behaviour is to target the gnustep runtime if we are i
3003 // non-fragile mode or the GCC runtime in fragile mode.
3004 if (isNonFragile)
3005 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple());
3006 else
3007 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003008 }
3009
3010 cmdArgs.push_back(args.MakeArgString(
3011 "-fobjc-runtime=" + runtime.getAsString()));
3012 return runtime;
3013}
3014
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003015void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003016 const InputInfo &Output,
3017 const InputInfoList &Inputs,
3018 const ArgList &Args,
3019 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003020 ArgStringList CmdArgs;
3021
3022 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3023 const InputInfo &Input = Inputs[0];
3024
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003025 // Don't warn about "clang -w -c foo.s"
3026 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003027 // and "clang -emit-llvm -c foo.s"
3028 Args.ClaimAllArgs(options::OPT_emit_llvm);
3029 // and "clang -use-gold-plugin -c foo.s"
3030 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003031
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003032 // Invoke ourselves in -cc1as mode.
3033 //
3034 // FIXME: Implement custom jobs for internal actions.
3035 CmdArgs.push_back("-cc1as");
3036
3037 // Add the "effective" target triple.
3038 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003039 std::string TripleStr =
3040 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003041 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3042
3043 // Set the output mode, we currently only expect to be used as a real
3044 // assembler.
3045 CmdArgs.push_back("-filetype");
3046 CmdArgs.push_back("obj");
3047
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003048 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003049 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003050
Jim Grosbach576452b2012-02-10 20:37:10 +00003051 // Add target specific cpu and features flags.
3052 switch(getToolChain().getTriple().getArch()) {
3053 default:
3054 break;
3055
3056 case llvm::Triple::arm:
3057 case llvm::Triple::thumb:
3058 AddARMTargetArgs(Args, CmdArgs);
3059 break;
3060 }
3061
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003062 // Ignore explicit -force_cpusubtype_ALL option.
3063 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003064
Eric Christopherfc3ee562012-01-10 00:38:01 +00003065 // Determine the original source input.
3066 const Action *SourceAction = &JA;
3067 while (SourceAction->getKind() != Action::InputClass) {
3068 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3069 SourceAction = SourceAction->getInputs()[0];
3070 }
3071
3072 // Forward -g, assuming we are dealing with an actual assembly file.
3073 if (SourceAction->getType() == types::TY_Asm ||
3074 SourceAction->getType() == types::TY_PP_Asm) {
3075 Args.ClaimAllArgs(options::OPT_g_Group);
3076 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3077 if (!A->getOption().matches(options::OPT_g0))
3078 CmdArgs.push_back("-g");
3079 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003080
3081 // Optionally embed the -cc1as level arguments into the debug info, for build
3082 // analysis.
3083 if (getToolChain().UseDwarfDebugFlags()) {
3084 ArgStringList OriginalArgs;
3085 for (ArgList::const_iterator it = Args.begin(),
3086 ie = Args.end(); it != ie; ++it)
3087 (*it)->render(Args, OriginalArgs);
3088
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003089 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003090 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3091 Flags += Exec;
3092 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3093 Flags += " ";
3094 Flags += OriginalArgs[i];
3095 }
3096 CmdArgs.push_back("-dwarf-debug-flags");
3097 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3098 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003099
3100 // FIXME: Add -static support, once we have it.
3101
3102 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3103 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003104 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003105
3106 assert(Output.isFilename() && "Unexpected lipo output.");
3107 CmdArgs.push_back("-o");
3108 CmdArgs.push_back(Output.getFilename());
3109
Daniel Dunbarb440f562010-08-02 02:38:21 +00003110 assert(Input.isFilename() && "Invalid input.");
3111 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003112
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003113 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003114 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003115}
3116
Daniel Dunbara3246a02009-03-18 08:07:30 +00003117void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003118 const InputInfo &Output,
3119 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003120 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003121 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003122 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003123 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003124
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003125 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003126 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003127 Arg *A = *it;
Daniel Dunbar2da02722009-03-19 07:55:12 +00003128 if (A->getOption().hasForwardToGCC()) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003129 // Don't forward any -g arguments to assembly steps.
3130 if (isa<AssembleJobAction>(JA) &&
3131 A->getOption().matches(options::OPT_g_Group))
3132 continue;
3133
Daniel Dunbar2da02722009-03-19 07:55:12 +00003134 // It is unfortunate that we have to claim here, as this means
3135 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003136 // platforms using a generic gcc, even if we are just using gcc
3137 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003138 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003139 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003140 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003141 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003142
Daniel Dunbar4e295052010-01-25 22:35:08 +00003143 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003144
3145 // If using a driver driver, force the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003146 const std::string &Arch = getToolChain().getArchName();
Bob Wilson6524dd32011-10-14 05:03:44 +00003147 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003148 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003149
3150 // FIXME: Remove these special cases.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003151 if (Arch == "powerpc")
3152 CmdArgs.push_back("ppc");
3153 else if (Arch == "powerpc64")
3154 CmdArgs.push_back("ppc64");
3155 else
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003156 CmdArgs.push_back(Args.MakeArgString(Arch));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003157 }
3158
Daniel Dunbar5716d872009-05-02 21:41:52 +00003159 // Try to force gcc to match the tool chain we want, if we recognize
3160 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003161 //
3162 // FIXME: The triple class should directly provide the information we want
3163 // here.
3164 if (Arch == "i386" || Arch == "powerpc")
Daniel Dunbar5716d872009-05-02 21:41:52 +00003165 CmdArgs.push_back("-m32");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003166 else if (Arch == "x86_64" || Arch == "powerpc64")
Daniel Dunbar5716d872009-05-02 21:41:52 +00003167 CmdArgs.push_back("-m64");
3168
Daniel Dunbarb440f562010-08-02 02:38:21 +00003169 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003170 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003171 CmdArgs.push_back(Output.getFilename());
3172 } else {
3173 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003174 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003175 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003176
Tony Linthicum76329bf2011-12-12 21:14:55 +00003177 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3178 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003179
3180 // Only pass -x if gcc will understand it; otherwise hope gcc
3181 // understands the suffix correctly. The main use case this would go
3182 // wrong in is for linker inputs if they happened to have an odd
3183 // suffix; really the only way to get this to happen is a command
3184 // like '-x foobar a.c' which will treat a.c like a linker input.
3185 //
3186 // FIXME: For the linker case specifically, can we safely convert
3187 // inputs into '-Wl,' options?
3188 for (InputInfoList::const_iterator
3189 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3190 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003191
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003192 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003193 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3194 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003195 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003196 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003197 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003198 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003199 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003200
Daniel Dunbara3246a02009-03-18 08:07:30 +00003201 if (types::canTypeBeUserSpecified(II.getType())) {
3202 CmdArgs.push_back("-x");
3203 CmdArgs.push_back(types::getTypeName(II.getType()));
3204 }
3205
Daniel Dunbarb440f562010-08-02 02:38:21 +00003206 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003207 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003208 else {
3209 const Arg &A = II.getInputArg();
3210
3211 // Reverse translate some rewritten options.
3212 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3213 CmdArgs.push_back("-lstdc++");
3214 continue;
3215 }
3216
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003217 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003218 A.render(Args, CmdArgs);
3219 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003220 }
3221
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003222 const std::string customGCCName = D.getCCCGenericGCCName();
3223 const char *GCCName;
3224 if (!customGCCName.empty())
3225 GCCName = customGCCName.c_str();
3226 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003227 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003228 } else
3229 GCCName = "gcc";
3230
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003231 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003232 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003233 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003234}
3235
Daniel Dunbar4e295052010-01-25 22:35:08 +00003236void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3237 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003238 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003239}
3240
Daniel Dunbar4e295052010-01-25 22:35:08 +00003241void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3242 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003243 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003244}
3245
Daniel Dunbar4e295052010-01-25 22:35:08 +00003246void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3247 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003248 const Driver &D = getToolChain().getDriver();
3249
Daniel Dunbar4e295052010-01-25 22:35:08 +00003250 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003251 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3252 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003253 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003254 else {
3255 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003256 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003257 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003258
Daniel Dunbar4e295052010-01-25 22:35:08 +00003259 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003260 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003261}
3262
Daniel Dunbar4e295052010-01-25 22:35:08 +00003263void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3264 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003265 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003266}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003267
Daniel Dunbar4e295052010-01-25 22:35:08 +00003268void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3269 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003270 // The types are (hopefully) good enough.
3271}
3272
Tony Linthicum76329bf2011-12-12 21:14:55 +00003273// Hexagon tools start.
3274void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3275 ArgStringList &CmdArgs) const {
3276
3277}
3278void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3279 const InputInfo &Output,
3280 const InputInfoList &Inputs,
3281 const ArgList &Args,
3282 const char *LinkingOutput) const {
3283
3284 const Driver &D = getToolChain().getDriver();
3285 ArgStringList CmdArgs;
3286
3287 std::string MarchString = "-march=";
3288 MarchString += getHexagonTargetCPU(Args);
3289 CmdArgs.push_back(Args.MakeArgString(MarchString));
3290
3291 RenderExtraToolArgs(JA, CmdArgs);
3292
3293 if (Output.isFilename()) {
3294 CmdArgs.push_back("-o");
3295 CmdArgs.push_back(Output.getFilename());
3296 } else {
3297 assert(Output.isNothing() && "Unexpected output");
3298 CmdArgs.push_back("-fsyntax-only");
3299 }
3300
3301
3302 // Only pass -x if gcc will understand it; otherwise hope gcc
3303 // understands the suffix correctly. The main use case this would go
3304 // wrong in is for linker inputs if they happened to have an odd
3305 // suffix; really the only way to get this to happen is a command
3306 // like '-x foobar a.c' which will treat a.c like a linker input.
3307 //
3308 // FIXME: For the linker case specifically, can we safely convert
3309 // inputs into '-Wl,' options?
3310 for (InputInfoList::const_iterator
3311 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3312 const InputInfo &II = *it;
3313
3314 // Don't try to pass LLVM or AST inputs to a generic gcc.
3315 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3316 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3317 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3318 << getToolChain().getTripleString();
3319 else if (II.getType() == types::TY_AST)
3320 D.Diag(clang::diag::err_drv_no_ast_support)
3321 << getToolChain().getTripleString();
3322
3323 if (II.isFilename())
3324 CmdArgs.push_back(II.getFilename());
3325 else
3326 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3327 II.getInputArg().render(Args, CmdArgs);
3328 }
3329
3330 const char *GCCName = "hexagon-as";
3331 const char *Exec =
3332 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3333 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3334
3335}
3336void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3337 ArgStringList &CmdArgs) const {
3338 // The types are (hopefully) good enough.
3339}
3340
3341void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3342 const InputInfo &Output,
3343 const InputInfoList &Inputs,
3344 const ArgList &Args,
3345 const char *LinkingOutput) const {
3346
3347 const Driver &D = getToolChain().getDriver();
3348 ArgStringList CmdArgs;
3349
3350 for (ArgList::const_iterator
3351 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3352 Arg *A = *it;
3353 if (A->getOption().hasForwardToGCC()) {
3354 // Don't forward any -g arguments to assembly steps.
3355 if (isa<AssembleJobAction>(JA) &&
3356 A->getOption().matches(options::OPT_g_Group))
3357 continue;
3358
3359 // It is unfortunate that we have to claim here, as this means
3360 // we will basically never report anything interesting for
3361 // platforms using a generic gcc, even if we are just using gcc
3362 // to get to the assembler.
3363 A->claim();
3364 A->render(Args, CmdArgs);
3365 }
3366 }
3367
3368 RenderExtraToolArgs(JA, CmdArgs);
3369
3370 // Add Arch Information
3371 Arg *A;
Sebastian Pop86500282012-01-13 20:37:10 +00003372 if ((A = getLastHexagonArchArg(Args))) {
3373 if (A->getOption().matches(options::OPT_m_Joined))
3374 A->render(Args, CmdArgs);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003375 else
Sebastian Pop86500282012-01-13 20:37:10 +00003376 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003377 }
Sebastian Pop86500282012-01-13 20:37:10 +00003378 else {
3379 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
3380 }
3381
Tony Linthicum76329bf2011-12-12 21:14:55 +00003382 CmdArgs.push_back("-mqdsp6-compat");
3383
3384 const char *GCCName;
3385 if (C.getDriver().CCCIsCXX)
3386 GCCName = "hexagon-g++";
3387 else
3388 GCCName = "hexagon-gcc";
3389 const char *Exec =
3390 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3391
3392 if (Output.isFilename()) {
3393 CmdArgs.push_back("-o");
3394 CmdArgs.push_back(Output.getFilename());
3395 }
3396
3397 for (InputInfoList::const_iterator
3398 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3399 const InputInfo &II = *it;
3400
3401 // Don't try to pass LLVM or AST inputs to a generic gcc.
3402 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3403 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3404 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3405 << getToolChain().getTripleString();
3406 else if (II.getType() == types::TY_AST)
3407 D.Diag(clang::diag::err_drv_no_ast_support)
3408 << getToolChain().getTripleString();
3409
3410 if (II.isFilename())
3411 CmdArgs.push_back(II.getFilename());
3412 else
3413 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3414 II.getInputArg().render(Args, CmdArgs);
3415 }
3416 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3417
3418}
3419// Hexagon tools end.
3420
3421
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003422const char *darwin::CC1::getCC1Name(types::ID Type) const {
3423 switch (Type) {
3424 default:
David Blaikie83d382b2011-09-23 05:06:16 +00003425 llvm_unreachable("Unexpected type for Darwin CC1 tool.");
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003426 case types::TY_Asm:
3427 case types::TY_C: case types::TY_CHeader:
3428 case types::TY_PP_C: case types::TY_PP_CHeader:
3429 return "cc1";
3430 case types::TY_ObjC: case types::TY_ObjCHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003431 case types::TY_PP_ObjC: case types::TY_PP_ObjC_Alias:
3432 case types::TY_PP_ObjCHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003433 return "cc1obj";
3434 case types::TY_CXX: case types::TY_CXXHeader:
3435 case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
3436 return "cc1plus";
3437 case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003438 case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXX_Alias:
3439 case types::TY_PP_ObjCXXHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003440 return "cc1objplus";
3441 }
3442}
3443
David Blaikie68e081d2011-12-20 02:48:34 +00003444void darwin::CC1::anchor() {}
3445
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003446const char *darwin::CC1::getBaseInputName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003447 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00003448 return Args.MakeArgString(
3449 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003450}
3451
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003452const char *darwin::CC1::getBaseInputStem(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003453 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003454 const char *Str = getBaseInputName(Args, Inputs);
3455
Chris Lattner906bb902011-01-16 08:14:11 +00003456 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003457 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003458
3459 return Str;
3460}
3461
3462const char *
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003463darwin::CC1::getDependencyFileName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003464 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003465 // FIXME: Think about this more.
3466 std::string Res;
3467
3468 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3469 std::string Str(OutputOpt->getValue(Args));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003470 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003471 } else {
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003472 Res = darwin::CC1::getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003473 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003474 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003475}
3476
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003477void darwin::CC1::RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const {
Eric Christopher84fbdb42011-08-19 00:30:14 +00003478 for (ArgStringList::iterator it = CmdArgs.begin(), ie = CmdArgs.end();
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003479 it != ie;) {
Chad Rosier2f818792011-08-18 17:56:32 +00003480
3481 StringRef Option = *it;
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003482 bool RemoveOption = false;
Chad Rosier30453862011-08-18 01:18:28 +00003483
Bob Wilson7ecbd322012-02-07 01:17:55 +00003484 // Erase both -fmodule-cache-path and its argument.
3485 if (Option.equals("-fmodule-cache-path") && it+2 != ie) {
3486 it = CmdArgs.erase(it, it+2);
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003487 ie = CmdArgs.end();
Chad Rosier30453862011-08-18 01:18:28 +00003488 continue;
3489 }
3490
Bob Wilson7ecbd322012-02-07 01:17:55 +00003491 // Remove unsupported -f options.
3492 if (Option.startswith("-f")) {
3493 // Remove -f/-fno- to reduce the number of cases.
3494 if (Option.startswith("-fno-"))
3495 Option = Option.substr(5);
3496 else
3497 Option = Option.substr(2);
3498 RemoveOption = llvm::StringSwitch<bool>(Option)
3499 .Case("altivec", true)
3500 .Case("modules", true)
3501 .Case("diagnostics-show-note-include-stack", true)
3502 .Default(false);
3503 }
3504
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003505 // Handle machine specific options.
3506 if (Option.startswith("-m")) {
3507 RemoveOption = llvm::StringSwitch<bool>(Option)
3508 .Case("-mthumb", true)
3509 .Case("-mno-thumb", true)
3510 .Case("-mno-fused-madd", true)
3511 .Case("-mlong-branch", true)
3512 .Case("-mlongcall", true)
3513 .Case("-mcpu=G4", true)
3514 .Case("-mcpu=G5", true)
3515 .Default(false);
3516 }
3517
3518 // Handle warning options.
3519 if (Option.startswith("-W")) {
3520 // Remove -W/-Wno- to reduce the number of cases.
3521 if (Option.startswith("-Wno-"))
3522 Option = Option.substr(5);
3523 else
3524 Option = Option.substr(2);
3525
3526 RemoveOption = llvm::StringSwitch<bool>(Option)
3527 .Case("address-of-temporary", true)
3528 .Case("ambiguous-member-template", true)
3529 .Case("analyzer-incompatible-plugin", true)
3530 .Case("array-bounds", true)
3531 .Case("array-bounds-pointer-arithmetic", true)
3532 .Case("bind-to-temporary-copy", true)
3533 .Case("bitwise-op-parentheses", true)
3534 .Case("bool-conversions", true)
3535 .Case("builtin-macro-redefined", true)
3536 .Case("c++-hex-floats", true)
3537 .Case("c++0x-compat", true)
3538 .Case("c++0x-extensions", true)
3539 .Case("c++0x-narrowing", true)
Richard Smith31ce7932011-10-13 23:32:09 +00003540 .Case("c++11-compat", true)
3541 .Case("c++11-extensions", true)
3542 .Case("c++11-narrowing", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003543 .Case("conditional-uninitialized", true)
3544 .Case("constant-conversion", true)
David Blaikieebcbe4b2012-03-15 04:50:32 +00003545 .Case("conversion-null", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003546 .Case("CFString-literal", true)
3547 .Case("constant-logical-operand", true)
3548 .Case("custom-atomic-properties", true)
3549 .Case("default-arg-special-member", true)
3550 .Case("delegating-ctor-cycles", true)
3551 .Case("delete-non-virtual-dtor", true)
3552 .Case("deprecated-implementations", true)
3553 .Case("deprecated-writable-strings", true)
3554 .Case("distributed-object-modifiers", true)
3555 .Case("duplicate-method-arg", true)
3556 .Case("dynamic-class-memaccess", true)
3557 .Case("enum-compare", true)
3558 .Case("exit-time-destructors", true)
3559 .Case("gnu", true)
3560 .Case("gnu-designator", true)
3561 .Case("header-hygiene", true)
3562 .Case("idiomatic-parentheses", true)
3563 .Case("ignored-qualifiers", true)
3564 .Case("implicit-atomic-properties", true)
3565 .Case("incompatible-pointer-types", true)
3566 .Case("incomplete-implementation", true)
3567 .Case("initializer-overrides", true)
3568 .Case("invalid-noreturn", true)
3569 .Case("invalid-token-paste", true)
Ivan Krasin31f74112011-10-06 02:46:34 +00003570 .Case("language-extension-token", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003571 .Case("literal-conversion", true)
3572 .Case("literal-range", true)
3573 .Case("local-type-template-args", true)
3574 .Case("logical-op-parentheses", true)
3575 .Case("method-signatures", true)
3576 .Case("microsoft", true)
3577 .Case("mismatched-tags", true)
3578 .Case("missing-method-return-type", true)
3579 .Case("non-pod-varargs", true)
3580 .Case("nonfragile-abi2", true)
3581 .Case("null-arithmetic", true)
3582 .Case("null-dereference", true)
3583 .Case("out-of-line-declaration", true)
3584 .Case("overriding-method-mismatch", true)
3585 .Case("readonly-setter-attrs", true)
3586 .Case("return-stack-address", true)
3587 .Case("self-assign", true)
3588 .Case("semicolon-before-method-body", true)
3589 .Case("sentinel", true)
3590 .Case("shift-overflow", true)
3591 .Case("shift-sign-overflow", true)
3592 .Case("sign-conversion", true)
3593 .Case("sizeof-array-argument", true)
3594 .Case("sizeof-pointer-memaccess", true)
3595 .Case("string-compare", true)
3596 .Case("super-class-method-mismatch", true)
3597 .Case("tautological-compare", true)
3598 .Case("typedef-redefinition", true)
3599 .Case("typename-missing", true)
3600 .Case("undefined-reinterpret-cast", true)
3601 .Case("unknown-warning-option", true)
3602 .Case("unnamed-type-template-args", true)
3603 .Case("unneeded-internal-declaration", true)
3604 .Case("unneeded-member-function", true)
3605 .Case("unused-comparison", true)
3606 .Case("unused-exception-parameter", true)
3607 .Case("unused-member-function", true)
3608 .Case("unused-result", true)
3609 .Case("vector-conversions", true)
3610 .Case("vla", true)
3611 .Case("used-but-marked-unused", true)
3612 .Case("weak-vtables", true)
3613 .Default(false);
3614 } // if (Option.startswith("-W"))
Chad Rosier30453862011-08-18 01:18:28 +00003615 if (RemoveOption) {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003616 it = CmdArgs.erase(it);
Chad Rosier23594f62011-08-17 18:51:56 +00003617 ie = CmdArgs.end();
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003618 } else {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003619 ++it;
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003620 }
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003621 }
3622}
3623
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003624void darwin::CC1::AddCC1Args(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003625 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003626 const Driver &D = getToolChain().getDriver();
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003627
3628 CheckCodeGenerationOptions(D, Args);
3629
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003630 // Derived from cc1 spec.
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003631 if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) &&
3632 !Args.hasArg(options::OPT_mdynamic_no_pic))
3633 CmdArgs.push_back("-fPIC");
3634
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003635 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3636 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3637 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3638 CmdArgs.push_back("-fno-builtin-strcat");
3639 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3640 CmdArgs.push_back("-fno-builtin-strcpy");
3641 }
3642
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003643 if (Args.hasArg(options::OPT_g_Flag) &&
3644 !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
3645 CmdArgs.push_back("-feliminate-unused-debug-symbols");
3646}
3647
3648void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3649 const InputInfoList &Inputs,
3650 const ArgStringList &OutputArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003651 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003652
3653 // Derived from cc1_options spec.
3654 if (Args.hasArg(options::OPT_fast) ||
3655 Args.hasArg(options::OPT_fastf) ||
3656 Args.hasArg(options::OPT_fastcp))
3657 CmdArgs.push_back("-O3");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003658
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003659 if (Arg *A = Args.getLastArg(options::OPT_pg))
3660 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003661 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003662 << A->getAsString(Args) << "-fomit-frame-pointer";
3663
3664 AddCC1Args(Args, CmdArgs);
3665
3666 if (!Args.hasArg(options::OPT_Q))
3667 CmdArgs.push_back("-quiet");
3668
3669 CmdArgs.push_back("-dumpbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003670 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003671
3672 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3673
3674 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
3675 Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
3676
3677 // FIXME: The goal is to use the user provided -o if that is our
3678 // final output, otherwise to drive from the original input
3679 // name. Find a clean way to go about this.
3680 if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
3681 Args.hasArg(options::OPT_o)) {
3682 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
3683 CmdArgs.push_back("-auxbase-strip");
3684 CmdArgs.push_back(OutputOpt->getValue(Args));
3685 } else {
3686 CmdArgs.push_back("-auxbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003687 CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003688 }
3689
3690 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3691
3692 Args.AddAllArgs(CmdArgs, options::OPT_O);
3693 // FIXME: -Wall is getting some special treatment. Investigate.
3694 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3695 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003696 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003697 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003698 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3699 // Honor -std-default.
3700 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3701 "-std=", /*Joined=*/true);
3702 }
3703
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003704 if (Args.hasArg(options::OPT_v))
3705 CmdArgs.push_back("-version");
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003706 if (Args.hasArg(options::OPT_pg) &&
3707 getToolChain().SupportsProfiling())
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003708 CmdArgs.push_back("-p");
3709 Args.AddLastArg(CmdArgs, options::OPT_p);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003710
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003711 // The driver treats -fsyntax-only specially.
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003712 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3713 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3714 // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
3715 // used to inhibit the default -fno-builtin-str{cat,cpy}.
3716 //
3717 // FIXME: Should we grow a better way to deal with "removing" args?
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003718 for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
3719 options::OPT_fsyntax_only),
3720 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003721 if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
3722 !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
3723 (*it)->claim();
3724 (*it)->render(Args, CmdArgs);
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003725 }
3726 }
3727 } else
3728 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003729
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003730 // Claim Clang only -f options, they aren't worth warning about.
3731 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3732
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003733 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3734 if (Args.hasArg(options::OPT_Qn))
3735 CmdArgs.push_back("-fno-ident");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003736
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003737 // FIXME: This isn't correct.
3738 //Args.AddLastArg(CmdArgs, options::OPT__help)
3739 //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
3740
3741 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3742
3743 // FIXME: Still don't get what is happening here. Investigate.
3744 Args.AddAllArgs(CmdArgs, options::OPT__param);
3745
3746 if (Args.hasArg(options::OPT_fmudflap) ||
3747 Args.hasArg(options::OPT_fmudflapth)) {
3748 CmdArgs.push_back("-fno-builtin");
3749 CmdArgs.push_back("-fno-merge-constants");
3750 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003751
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003752 if (Args.hasArg(options::OPT_coverage)) {
3753 CmdArgs.push_back("-fprofile-arcs");
3754 CmdArgs.push_back("-ftest-coverage");
3755 }
3756
3757 if (types::isCXX(Inputs[0].getType()))
3758 CmdArgs.push_back("-D__private_extern__=extern");
3759}
3760
3761void darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3762 const InputInfoList &Inputs,
3763 const ArgStringList &OutputArgs) const {
3764 // Derived from cpp_options
3765 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003766
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003767 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3768
3769 AddCC1Args(Args, CmdArgs);
3770
3771 // NOTE: The code below has some commonality with cpp_options, but
3772 // in classic gcc style ends up sending things in different
3773 // orders. This may be a good merge candidate once we drop pedantic
3774 // compatibility.
3775
3776 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003777 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003778 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003779 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3780 // Honor -std-default.
3781 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3782 "-std=", /*Joined=*/true);
3783 }
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003784 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3785 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003786
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003787 // The driver treats -fsyntax-only specially.
3788 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
3789
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003790 // Claim Clang only -f options, they aren't worth warning about.
3791 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3792
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003793 if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
3794 !Args.hasArg(options::OPT_fno_working_directory))
3795 CmdArgs.push_back("-fworking-directory");
3796
3797 Args.AddAllArgs(CmdArgs, options::OPT_O);
3798 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3799 if (Args.hasArg(options::OPT_save_temps))
3800 CmdArgs.push_back("-fpch-preprocess");
3801}
3802
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003803void darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003804 ArgStringList &CmdArgs,
Mike Stump11289f42009-09-09 15:08:12 +00003805 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003806 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003807
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003808 CheckPreprocessingOptions(D, Args);
3809
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003810 // Derived from cpp_unique_options.
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003811 // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
3812 Args.AddLastArg(CmdArgs, options::OPT_C);
3813 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003814 if (!Args.hasArg(options::OPT_Q))
3815 CmdArgs.push_back("-quiet");
3816 Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
Douglas Gregor64b046f2010-03-24 20:13:48 +00003817 Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003818 Args.AddLastArg(CmdArgs, options::OPT_v);
3819 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
3820 Args.AddLastArg(CmdArgs, options::OPT_P);
3821
3822 // FIXME: Handle %I properly.
3823 if (getToolChain().getArchName() == "x86_64") {
3824 CmdArgs.push_back("-imultilib");
3825 CmdArgs.push_back("x86_64");
3826 }
3827
3828 if (Args.hasArg(options::OPT_MD)) {
3829 CmdArgs.push_back("-MD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003830 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003831 }
3832
3833 if (Args.hasArg(options::OPT_MMD)) {
3834 CmdArgs.push_back("-MMD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003835 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003836 }
3837
3838 Args.AddLastArg(CmdArgs, options::OPT_M);
3839 Args.AddLastArg(CmdArgs, options::OPT_MM);
3840 Args.AddAllArgs(CmdArgs, options::OPT_MF);
3841 Args.AddLastArg(CmdArgs, options::OPT_MG);
3842 Args.AddLastArg(CmdArgs, options::OPT_MP);
3843 Args.AddAllArgs(CmdArgs, options::OPT_MQ);
3844 Args.AddAllArgs(CmdArgs, options::OPT_MT);
3845 if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
3846 (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
3847 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3848 CmdArgs.push_back("-MQ");
3849 CmdArgs.push_back(OutputOpt->getValue(Args));
3850 }
3851 }
3852
3853 Args.AddLastArg(CmdArgs, options::OPT_remap);
3854 if (Args.hasArg(options::OPT_g3))
3855 CmdArgs.push_back("-dD");
3856 Args.AddLastArg(CmdArgs, options::OPT_H);
3857
3858 AddCPPArgs(Args, CmdArgs);
3859
3860 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
3861 Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
3862
3863 for (InputInfoList::const_iterator
3864 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3865 const InputInfo &II = *it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003866
Daniel Dunbarb440f562010-08-02 02:38:21 +00003867 CmdArgs.push_back(II.getFilename());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003868 }
3869
3870 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
3871 options::OPT_Xpreprocessor);
3872
3873 if (Args.hasArg(options::OPT_fmudflap)) {
3874 CmdArgs.push_back("-D_MUDFLAP");
3875 CmdArgs.push_back("-include");
3876 CmdArgs.push_back("mf-runtime.h");
3877 }
3878
3879 if (Args.hasArg(options::OPT_fmudflapth)) {
3880 CmdArgs.push_back("-D_MUDFLAP");
3881 CmdArgs.push_back("-D_MUDFLAPTH");
3882 CmdArgs.push_back("-include");
3883 CmdArgs.push_back("mf-runtime.h");
3884 }
3885}
3886
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003887void darwin::CC1::AddCPPArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003888 ArgStringList &CmdArgs) const {
3889 // Derived from cpp spec.
3890
3891 if (Args.hasArg(options::OPT_static)) {
3892 // The gcc spec is broken here, it refers to dynamic but
3893 // that has been translated. Start by being bug compatible.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003894
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003895 // if (!Args.hasArg(arglist.parser.dynamicOption))
3896 CmdArgs.push_back("-D__STATIC__");
3897 } else
3898 CmdArgs.push_back("-D__DYNAMIC__");
3899
3900 if (Args.hasArg(options::OPT_pthread))
3901 CmdArgs.push_back("-D_REENTRANT");
3902}
3903
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003904void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003905 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003906 const InputInfoList &Inputs,
3907 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003908 const char *LinkingOutput) const {
3909 ArgStringList CmdArgs;
3910
3911 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3912
3913 CmdArgs.push_back("-E");
3914
3915 if (Args.hasArg(options::OPT_traditional) ||
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003916 Args.hasArg(options::OPT_traditional_cpp))
3917 CmdArgs.push_back("-traditional-cpp");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003918
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003919 ArgStringList OutputArgs;
Daniel Dunbarb440f562010-08-02 02:38:21 +00003920 assert(Output.isFilename() && "Unexpected CC1 output.");
3921 OutputArgs.push_back("-o");
3922 OutputArgs.push_back(Output.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003923
Joerg Sonnenbergerb86f5f42011-03-06 23:31:01 +00003924 if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
Daniel Dunbarf64f5302009-03-29 22:27:40 +00003925 AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3926 } else {
3927 AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
3928 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3929 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003930
Daniel Dunbar6a8803a2009-04-03 01:27:06 +00003931 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3932
Chad Rosierc31e48d2011-09-08 00:38:00 +00003933 RemoveCC1UnsupportedArgs(CmdArgs);
3934
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003935 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003936 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003937 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003938 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003939}
3940
3941void darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003942 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003943 const InputInfoList &Inputs,
3944 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003945 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003946 const Driver &D = getToolChain().getDriver();
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003947 ArgStringList CmdArgs;
3948
3949 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3950
Bob Wilson0090df22012-04-01 23:03:29 +00003951 // Silence warning about unused --serialize-diagnostics
3952 Args.ClaimAllArgs(options::OPT__serialize_diags);
3953
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003954 types::ID InputType = Inputs[0].getType();
David Blaikie747ff7e2012-04-04 20:43:14 +00003955 if (const Arg *A = Args.getLastArg(options::OPT_traditional))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003956 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003957 << A->getAsString(Args) << "-E";
3958
Daniel Dunbar24e52992010-06-07 23:28:45 +00003959 if (JA.getType() == types::TY_LLVM_IR ||
3960 JA.getType() == types::TY_LTO_IR)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003961 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003962 else if (JA.getType() == types::TY_LLVM_BC ||
3963 JA.getType() == types::TY_LTO_BC)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003964 CmdArgs.push_back("-emit-llvm-bc");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003965 else if (Output.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003966 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003967 << getToolChain().getTripleString();
Daniel Dunbarbcd554f2010-02-11 17:33:45 +00003968 else if (JA.getType() != types::TY_PP_Asm &&
3969 JA.getType() != types::TY_PCH)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003970 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003971 << getTypeName(JA.getType());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003972
3973 ArgStringList OutputArgs;
3974 if (Output.getType() != types::TY_PCH) {
3975 OutputArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00003976 if (Output.isNothing())
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003977 OutputArgs.push_back("/dev/null");
3978 else
3979 OutputArgs.push_back(Output.getFilename());
3980 }
3981
3982 // There is no need for this level of compatibility, but it makes
3983 // diffing easier.
3984 bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
3985 Args.hasArg(options::OPT_S));
3986
3987 if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003988 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003989 if (OutputArgsEarly) {
3990 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3991 } else {
3992 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
3993 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3994 }
3995 } else {
3996 CmdArgs.push_back("-fpreprocessed");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003997
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003998 for (InputInfoList::const_iterator
3999 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4000 const InputInfo &II = *it;
4001
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004002 // Reject AST inputs.
4003 if (II.getType() == types::TY_AST) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004004 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004005 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004006 return;
4007 }
4008
Daniel Dunbarb440f562010-08-02 02:38:21 +00004009 CmdArgs.push_back(II.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004010 }
4011
4012 if (OutputArgsEarly) {
4013 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4014 } else {
4015 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4016 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4017 }
4018 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004019
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004020 if (Output.getType() == types::TY_PCH) {
4021 assert(Output.isFilename() && "Invalid PCH output.");
4022
4023 CmdArgs.push_back("-o");
4024 // NOTE: gcc uses a temp .s file for this, but there doesn't seem
4025 // to be a good reason.
Chad Rosier96d690c2011-08-01 19:58:48 +00004026 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004027 D.GetTemporaryPath("cc", "s"));
Chad Rosier96d690c2011-08-01 19:58:48 +00004028 C.addTempFile(TmpPath);
4029 CmdArgs.push_back(TmpPath);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004030
Eric Christopher84fbdb42011-08-19 00:30:14 +00004031 // If we're emitting a pch file with the last 4 characters of ".pth"
4032 // and falling back to llvm-gcc we want to use ".gch" instead.
4033 std::string OutputFile(Output.getFilename());
4034 size_t loc = OutputFile.rfind(".pth");
4035 if (loc != std::string::npos)
4036 OutputFile.replace(loc, 4, ".gch");
4037 const char *Tmp = C.getArgs().MakeArgString("--output-pch="+OutputFile);
4038 CmdArgs.push_back(Tmp);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004039 }
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004040
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00004041 RemoveCC1UnsupportedArgs(CmdArgs);
4042
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004043 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004044 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004045 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004046 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004047}
4048
Daniel Dunbarbe220842009-03-20 16:06:39 +00004049void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004050 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004051 const InputInfoList &Inputs,
4052 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004053 const char *LinkingOutput) const {
4054 ArgStringList CmdArgs;
4055
4056 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4057 const InputInfo &Input = Inputs[0];
4058
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004059 // Determine the original source input.
4060 const Action *SourceAction = &JA;
4061 while (SourceAction->getKind() != Action::InputClass) {
4062 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4063 SourceAction = SourceAction->getInputs()[0];
4064 }
4065
4066 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004067 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004068 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004069 if (Args.hasArg(options::OPT_gstabs))
4070 CmdArgs.push_back("--gstabs");
4071 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004072 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004073 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004074
Daniel Dunbarbe220842009-03-20 16:06:39 +00004075 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004076 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004077
Daniel Dunbar6d484762010-07-22 01:47:22 +00004078 // Use -force_cpusubtype_ALL on x86 by default.
4079 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4080 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004081 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4082 CmdArgs.push_back("-force_cpusubtype_ALL");
4083
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004084 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
4085 (Args.hasArg(options::OPT_mkernel) ||
Daniel Dunbarbe220842009-03-20 16:06:39 +00004086 Args.hasArg(options::OPT_static) ||
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004087 Args.hasArg(options::OPT_fapple_kext)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004088 CmdArgs.push_back("-static");
4089
Daniel Dunbarbe220842009-03-20 16:06:39 +00004090 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4091 options::OPT_Xassembler);
4092
4093 assert(Output.isFilename() && "Unexpected lipo output.");
4094 CmdArgs.push_back("-o");
4095 CmdArgs.push_back(Output.getFilename());
4096
Daniel Dunbarb440f562010-08-02 02:38:21 +00004097 assert(Input.isFilename() && "Invalid input.");
4098 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004099
4100 // asm_final spec is empty.
4101
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004102 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004103 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004104 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004105}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004106
David Blaikie68e081d2011-12-20 02:48:34 +00004107void darwin::DarwinTool::anchor() {}
4108
Daniel Dunbare9ded432009-09-09 18:36:20 +00004109void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4110 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004111 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004112
Daniel Dunbarc1964212009-03-26 16:23:12 +00004113 // Derived from darwin_arch spec.
4114 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004115 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004116
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004117 // FIXME: Is this needed anymore?
4118 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004119 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004120}
4121
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004122void darwin::Link::AddLinkArgs(Compilation &C,
4123 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004124 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004125 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004126 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004127
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004128 unsigned Version[3] = { 0, 0, 0 };
4129 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4130 bool HadExtra;
4131 if (!Driver::GetReleaseVersion(A->getValue(Args), Version[0],
4132 Version[1], Version[2], HadExtra) ||
4133 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004134 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004135 << A->getAsString(Args);
4136 }
4137
4138 // Newer linkers support -demangle, pass it if supported and not disabled by
4139 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004140 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004141 // Don't pass -demangle to ld_classic.
4142 //
4143 // FIXME: This is a temporary workaround, ld should be handling this.
4144 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4145 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004146 if (getToolChain().getArch() == llvm::Triple::x86) {
4147 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4148 options::OPT_Wl_COMMA),
4149 ie = Args.filtered_end(); it != ie; ++it) {
4150 const Arg *A = *it;
4151 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004152 if (StringRef(A->getValue(Args, i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004153 UsesLdClassic = true;
4154 }
4155 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004156 if (!UsesLdClassic)
4157 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004158 }
4159
Daniel Dunbaref889c72011-06-21 20:55:11 +00004160 // If we are using LTO, then automatically create a temporary file path for
4161 // the linker to use, so that it's lifetime will extend past a possible
4162 // dsymutil step.
Daniel Dunbar3d125d32011-06-21 21:18:32 +00004163 if (Version[0] >= 116 && D.IsUsingLTO(Args)) {
Daniel Dunbaref889c72011-06-21 20:55:11 +00004164 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004165 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Daniel Dunbaref889c72011-06-21 20:55:11 +00004166 C.addTempFile(TmpPath);
4167 CmdArgs.push_back("-object_path_lto");
4168 CmdArgs.push_back(TmpPath);
4169 }
4170
Daniel Dunbarc1964212009-03-26 16:23:12 +00004171 // Derived from the "link" spec.
4172 Args.AddAllArgs(CmdArgs, options::OPT_static);
4173 if (!Args.hasArg(options::OPT_static))
4174 CmdArgs.push_back("-dynamic");
4175 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4176 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4177 // here. How do we wish to handle such things?
4178 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004179
Daniel Dunbarc1964212009-03-26 16:23:12 +00004180 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004181 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004182 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004183 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004184
4185 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4186 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4187 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4188
4189 Arg *A;
4190 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4191 (A = Args.getLastArg(options::OPT_current__version)) ||
4192 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004193 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004194 << A->getAsString(Args) << "-dynamiclib";
4195
4196 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4197 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4198 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4199 } else {
4200 CmdArgs.push_back("-dylib");
4201
4202 Arg *A;
4203 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4204 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4205 (A = Args.getLastArg(options::OPT_client__name)) ||
4206 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4207 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4208 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004209 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004210 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004211
Daniel Dunbarc1964212009-03-26 16:23:12 +00004212 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4213 "-dylib_compatibility_version");
4214 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4215 "-dylib_current_version");
4216
Daniel Dunbara48823f2010-01-22 02:04:52 +00004217 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004218
4219 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4220 "-dylib_install_name");
4221 }
4222
4223 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4224 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4225 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004226 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004227 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004228 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4229 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4230 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4231 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4232 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4233 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004234 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004235 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4236 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4237 Args.AddAllArgs(CmdArgs, options::OPT_init);
4238
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004239 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004240 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004241
4242 // If we had an explicit -mios-simulator-version-min argument, honor that,
4243 // otherwise use the traditional deployment targets. We can't just check the
4244 // is-sim attribute because existing code follows this path, and the linker
4245 // may not handle the argument.
4246 //
4247 // FIXME: We may be able to remove this, once we can verify no one depends on
4248 // it.
4249 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4250 CmdArgs.push_back("-ios_simulator_version_min");
4251 else if (DarwinTC.isTargetIPhoneOS())
4252 CmdArgs.push_back("-iphoneos_version_min");
4253 else
4254 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004255 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004256
Daniel Dunbarc1964212009-03-26 16:23:12 +00004257 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4258 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4259 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4260 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4261 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004262
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004263 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4264 options::OPT_fno_pie,
4265 options::OPT_fno_PIE)) {
4266 if (A->getOption().matches(options::OPT_fpie) ||
4267 A->getOption().matches(options::OPT_fPIE))
4268 CmdArgs.push_back("-pie");
4269 else
4270 CmdArgs.push_back("-no_pie");
4271 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004272
4273 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4274 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4275 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4276 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4277 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4278 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4279 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4280 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4281 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4282 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4283 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4284 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4285 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4286 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4287 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4288 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004289
Daniel Dunbar84384642011-05-02 21:03:47 +00004290 // Give --sysroot= preference, over the Apple specific behavior to also use
4291 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004292 StringRef sysroot = C.getSysRoot();
4293 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004294 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004295 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004296 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4297 CmdArgs.push_back("-syslibroot");
4298 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004299 }
4300
Daniel Dunbarc1964212009-03-26 16:23:12 +00004301 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4302 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4303 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4304 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4305 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004306 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004307 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4308 Args.AddAllArgs(CmdArgs, options::OPT_y);
4309 Args.AddLastArg(CmdArgs, options::OPT_w);
4310 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4311 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4312 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4313 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4314 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4315 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4316 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4317 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4318 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4319 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4320 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4321 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4322}
4323
4324void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004325 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004326 const InputInfoList &Inputs,
4327 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004328 const char *LinkingOutput) const {
4329 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004330
Daniel Dunbarc1964212009-03-26 16:23:12 +00004331 // The logic here is derived from gcc's behavior; most of which
4332 // comes from specs (starting with link_command). Consult gcc for
4333 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004334 ArgStringList CmdArgs;
4335
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004336 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4337 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4338 options::OPT_ccc_arcmt_migrate)) {
4339 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4340 (*I)->claim();
4341 const char *Exec =
4342 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4343 CmdArgs.push_back(Output.getFilename());
4344 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4345 return;
4346 }
4347
Daniel Dunbarc1964212009-03-26 16:23:12 +00004348 // I'm not sure why this particular decomposition exists in gcc, but
4349 // we follow suite for ease of comparison.
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004350 AddLinkArgs(C, Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004351
Daniel Dunbarc1964212009-03-26 16:23:12 +00004352 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4353 Args.AddAllArgs(CmdArgs, options::OPT_s);
4354 Args.AddAllArgs(CmdArgs, options::OPT_t);
4355 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4356 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004357 Args.AddLastArg(CmdArgs, options::OPT_e);
4358 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4359 Args.AddAllArgs(CmdArgs, options::OPT_r);
4360
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004361 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4362 // members of static archive libraries which implement Objective-C classes or
4363 // categories.
4364 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4365 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004366
Daniel Dunbarc1964212009-03-26 16:23:12 +00004367 CmdArgs.push_back("-o");
4368 CmdArgs.push_back(Output.getFilename());
4369
Chad Rosier06fd3c62012-05-16 23:45:12 +00004370 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004371 !Args.hasArg(options::OPT_nostartfiles)) {
4372 // Derived from startfile spec.
4373 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004374 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004375 if (getDarwinToolChain().isTargetIOSSimulator()) {
4376 // The simulator doesn't have a versioned crt1 file.
4377 CmdArgs.push_back("-ldylib1.o");
4378 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004379 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4380 CmdArgs.push_back("-ldylib1.o");
4381 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004382 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004383 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004384 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004385 CmdArgs.push_back("-ldylib1.10.5.o");
4386 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004387 } else {
4388 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004389 if (!Args.hasArg(options::OPT_static)) {
4390 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004391 if (getDarwinToolChain().isTargetIOSSimulator()) {
4392 // The simulator doesn't have a versioned crt1 file.
4393 CmdArgs.push_back("-lbundle1.o");
4394 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004395 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4396 CmdArgs.push_back("-lbundle1.o");
4397 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004398 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004399 CmdArgs.push_back("-lbundle1.o");
4400 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004401 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004402 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004403 if (Args.hasArg(options::OPT_pg) &&
4404 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004405 if (Args.hasArg(options::OPT_static) ||
4406 Args.hasArg(options::OPT_object) ||
4407 Args.hasArg(options::OPT_preload)) {
4408 CmdArgs.push_back("-lgcrt0.o");
4409 } else {
4410 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004411
Daniel Dunbarc1964212009-03-26 16:23:12 +00004412 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004413 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004414 // By default on OS X 10.8 and later, we don't link with a crt1.o
4415 // file and the linker knows to use _main as the entry point. But,
4416 // when compiling with -pg, we need to link with the gcrt1.o file,
4417 // so pass the -no_new_main option to tell the linker to use the
4418 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004419 if (getDarwinToolChain().isTargetMacOS() &&
4420 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4421 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004422 } else {
4423 if (Args.hasArg(options::OPT_static) ||
4424 Args.hasArg(options::OPT_object) ||
4425 Args.hasArg(options::OPT_preload)) {
4426 CmdArgs.push_back("-lcrt0.o");
4427 } else {
4428 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004429 if (getDarwinToolChain().isTargetIOSSimulator()) {
4430 // The simulator doesn't have a versioned crt1 file.
4431 CmdArgs.push_back("-lcrt1.o");
4432 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004433 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4434 CmdArgs.push_back("-lcrt1.o");
4435 else
4436 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004437 } else {
4438 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4439 CmdArgs.push_back("-lcrt1.o");
4440 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4441 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004442 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004443 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004444
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004445 // darwin_crt2 spec is empty.
4446 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004447 }
4448 }
4449 }
4450 }
4451
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004452 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4453 Args.hasArg(options::OPT_shared_libgcc) &&
4454 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004455 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004456 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004457 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004458 }
4459 }
4460
4461 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004462
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004463 // If we're building a dynamic lib with -faddress-sanitizer, unresolved
4464 // symbols may appear. Mark all of them as dynamic_lookup.
4465 // Linking executables is handled in lib/Driver/ToolChains.cpp.
4466 if (Args.hasFlag(options::OPT_faddress_sanitizer,
4467 options::OPT_fno_address_sanitizer, false)) {
4468 if (Args.hasArg(options::OPT_dynamiclib) ||
4469 Args.hasArg(options::OPT_bundle)) {
4470 CmdArgs.push_back("-undefined");
4471 CmdArgs.push_back("dynamic_lookup");
4472 }
4473 }
4474
Daniel Dunbarc1964212009-03-26 16:23:12 +00004475 if (Args.hasArg(options::OPT_fopenmp))
4476 // This is more complicated in gcc...
4477 CmdArgs.push_back("-lgomp");
4478
Douglas Gregor9295df02012-05-15 21:00:27 +00004479 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4480
Bob Wilson16d93952012-05-15 18:57:39 +00004481 if (isObjCRuntimeLinked(Args) &&
4482 !Args.hasArg(options::OPT_nostdlib) &&
4483 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004484 // Avoid linking compatibility stubs on i386 mac.
4485 if (!getDarwinToolChain().isTargetMacOS() ||
4486 getDarwinToolChain().getArchName() != "i386") {
4487 // If we don't have ARC or subscripting runtime support, link in the
4488 // runtime stubs. We have to do this *before* adding any of the normal
4489 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004490 ObjCRuntime runtime =
4491 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004492 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004493 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004494 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004495 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004496 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004497 CmdArgs.push_back("-framework");
4498 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004499 // Link libobj.
4500 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004501 }
John McCall31168b02011-06-15 23:02:42 +00004502
Daniel Dunbarc1964212009-03-26 16:23:12 +00004503 if (LinkingOutput) {
4504 CmdArgs.push_back("-arch_multiple");
4505 CmdArgs.push_back("-final_output");
4506 CmdArgs.push_back(LinkingOutput);
4507 }
4508
Daniel Dunbarc1964212009-03-26 16:23:12 +00004509 if (Args.hasArg(options::OPT_fnested_functions))
4510 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004511
Daniel Dunbarc1964212009-03-26 16:23:12 +00004512 if (!Args.hasArg(options::OPT_nostdlib) &&
4513 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004514 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004515 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004516
Daniel Dunbarc1964212009-03-26 16:23:12 +00004517 // link_ssp spec is empty.
4518
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004519 // Let the tool chain choose which runtime library to link.
4520 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004521 }
4522
Chad Rosier06fd3c62012-05-16 23:45:12 +00004523 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004524 !Args.hasArg(options::OPT_nostartfiles)) {
4525 // endfile_spec is empty.
4526 }
4527
4528 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4529 Args.AddAllArgs(CmdArgs, options::OPT_F);
4530
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004531 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004532 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004533 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004534}
4535
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004536void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004537 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004538 const InputInfoList &Inputs,
4539 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004540 const char *LinkingOutput) const {
4541 ArgStringList CmdArgs;
4542
4543 CmdArgs.push_back("-create");
4544 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004545
4546 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004547 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004548
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004549 for (InputInfoList::const_iterator
4550 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4551 const InputInfo &II = *it;
4552 assert(II.isFilename() && "Unexpected lipo input.");
4553 CmdArgs.push_back(II.getFilename());
4554 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004555 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004556 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004557 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004558}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004559
Daniel Dunbar88299622010-06-04 18:28:36 +00004560void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004561 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004562 const InputInfoList &Inputs,
4563 const ArgList &Args,
4564 const char *LinkingOutput) const {
4565 ArgStringList CmdArgs;
4566
Daniel Dunbareb86b042011-05-09 17:23:16 +00004567 CmdArgs.push_back("-o");
4568 CmdArgs.push_back(Output.getFilename());
4569
Daniel Dunbar88299622010-06-04 18:28:36 +00004570 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4571 const InputInfo &Input = Inputs[0];
4572 assert(Input.isFilename() && "Unexpected dsymutil input.");
4573 CmdArgs.push_back(Input.getFilename());
4574
Daniel Dunbar88299622010-06-04 18:28:36 +00004575 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004576 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004577 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004578}
4579
Eric Christopher551ef452011-08-23 17:56:55 +00004580void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4581 const InputInfo &Output,
4582 const InputInfoList &Inputs,
4583 const ArgList &Args,
4584 const char *LinkingOutput) const {
4585 ArgStringList CmdArgs;
4586 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004587 CmdArgs.push_back("--debug-info");
4588 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004589 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004590
4591 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4592 const InputInfo &Input = Inputs[0];
4593 assert(Input.isFilename() && "Unexpected verify input");
4594
4595 // Grabbing the output of the earlier dsymutil run.
4596 CmdArgs.push_back(Input.getFilename());
4597
4598 const char *Exec =
4599 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4600 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4601}
4602
David Chisnallf571cde2012-02-15 13:39:01 +00004603void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4604 const InputInfo &Output,
4605 const InputInfoList &Inputs,
4606 const ArgList &Args,
4607 const char *LinkingOutput) const {
4608 ArgStringList CmdArgs;
4609
4610 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4611 options::OPT_Xassembler);
4612
4613 CmdArgs.push_back("-o");
4614 CmdArgs.push_back(Output.getFilename());
4615
4616 for (InputInfoList::const_iterator
4617 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4618 const InputInfo &II = *it;
4619 CmdArgs.push_back(II.getFilename());
4620 }
4621
4622 const char *Exec =
4623 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4624 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4625}
4626
4627
4628void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4629 const InputInfo &Output,
4630 const InputInfoList &Inputs,
4631 const ArgList &Args,
4632 const char *LinkingOutput) const {
4633 // FIXME: Find a real GCC, don't hard-code versions here
4634 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4635 const llvm::Triple &T = getToolChain().getTriple();
4636 std::string LibPath = "/usr/lib/";
4637 llvm::Triple::ArchType Arch = T.getArch();
4638 switch (Arch) {
4639 case llvm::Triple::x86:
4640 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4641 T.getOSName()).str() + "/4.5.2/";
4642 break;
4643 case llvm::Triple::x86_64:
4644 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4645 T.getOSName()).str();
4646 GCCLibPath += "/4.5.2/amd64/";
4647 LibPath += "amd64/";
4648 break;
4649 default:
4650 assert(0 && "Unsupported architecture");
4651 }
4652
4653 ArgStringList CmdArgs;
4654
David Chisnall272a0712012-02-29 15:06:12 +00004655 // Demangle C++ names in errors
4656 CmdArgs.push_back("-C");
4657
David Chisnallf571cde2012-02-15 13:39:01 +00004658 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4659 (!Args.hasArg(options::OPT_shared))) {
4660 CmdArgs.push_back("-e");
4661 CmdArgs.push_back("_start");
4662 }
4663
4664 if (Args.hasArg(options::OPT_static)) {
4665 CmdArgs.push_back("-Bstatic");
4666 CmdArgs.push_back("-dn");
4667 } else {
4668 CmdArgs.push_back("-Bdynamic");
4669 if (Args.hasArg(options::OPT_shared)) {
4670 CmdArgs.push_back("-shared");
4671 } else {
4672 CmdArgs.push_back("--dynamic-linker");
4673 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4674 }
4675 }
4676
4677 if (Output.isFilename()) {
4678 CmdArgs.push_back("-o");
4679 CmdArgs.push_back(Output.getFilename());
4680 } else {
4681 assert(Output.isNothing() && "Invalid output.");
4682 }
4683
4684 if (!Args.hasArg(options::OPT_nostdlib) &&
4685 !Args.hasArg(options::OPT_nostartfiles)) {
4686 if (!Args.hasArg(options::OPT_shared)) {
4687 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4688 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004689 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004690 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4691 } else {
4692 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004693 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4694 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004695 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004696 if (getToolChain().getDriver().CCCIsCXX)
4697 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004698 }
4699
4700 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4701
4702 Args.AddAllArgs(CmdArgs, options::OPT_L);
4703 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4704 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004705 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00004706
4707 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4708
4709 if (!Args.hasArg(options::OPT_nostdlib) &&
4710 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00004711 if (getToolChain().getDriver().CCCIsCXX)
4712 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00004713 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004714 if (!Args.hasArg(options::OPT_shared)) {
4715 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00004716 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00004717 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004718 }
David Chisnallf571cde2012-02-15 13:39:01 +00004719 }
4720
4721 if (!Args.hasArg(options::OPT_nostdlib) &&
4722 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00004723 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004724 }
David Chisnall96de9932012-02-16 16:00:47 +00004725 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004726
4727 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4728
4729 const char *Exec =
4730 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4731 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4732}
4733
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004734void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004735 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004736 const InputInfoList &Inputs,
4737 const ArgList &Args,
4738 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004739 ArgStringList CmdArgs;
4740
4741 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4742 options::OPT_Xassembler);
4743
4744 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004745 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004746
4747 for (InputInfoList::const_iterator
4748 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4749 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004750 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004751 }
4752
4753 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004754 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004755 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004756}
4757
4758void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004759 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004760 const InputInfoList &Inputs,
4761 const ArgList &Args,
4762 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004763 ArgStringList CmdArgs;
4764
4765 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004766 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004767 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004768 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004769 }
4770
4771 if (Args.hasArg(options::OPT_static)) {
4772 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004773 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004774 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004775// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004776 CmdArgs.push_back("-Bdynamic");
4777 if (Args.hasArg(options::OPT_shared)) {
4778 CmdArgs.push_back("-shared");
4779 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00004780 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004781 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4782 }
4783 }
4784
Daniel Dunbarb440f562010-08-02 02:38:21 +00004785 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004786 CmdArgs.push_back("-o");
4787 CmdArgs.push_back(Output.getFilename());
4788 } else {
4789 assert(Output.isNothing() && "Invalid output.");
4790 }
4791
4792 if (!Args.hasArg(options::OPT_nostdlib) &&
4793 !Args.hasArg(options::OPT_nostartfiles)) {
4794 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004795 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004796 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004797 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004798 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004799 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004800 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004801 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004802 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004803 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004804 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00004805 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004806 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004807 }
4808
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004809 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4810 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004811 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004812
4813 Args.AddAllArgs(CmdArgs, options::OPT_L);
4814 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4815 Args.AddAllArgs(CmdArgs, options::OPT_e);
4816
Daniel Dunbar54423b22010-09-17 00:24:54 +00004817 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004818
4819 if (!Args.hasArg(options::OPT_nostdlib) &&
4820 !Args.hasArg(options::OPT_nodefaultlibs)) {
4821 // FIXME: For some reason GCC passes -lgcc before adding
4822 // the default system libraries. Just mimic this for now.
4823 CmdArgs.push_back("-lgcc");
4824
4825 if (Args.hasArg(options::OPT_pthread))
4826 CmdArgs.push_back("-pthread");
4827 if (!Args.hasArg(options::OPT_shared))
4828 CmdArgs.push_back("-lc");
4829 CmdArgs.push_back("-lgcc");
4830 }
4831
4832 if (!Args.hasArg(options::OPT_nostdlib) &&
4833 !Args.hasArg(options::OPT_nostartfiles)) {
4834 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004835 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004836 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004837 }
4838
Bill Wendling08760582011-06-27 19:15:03 +00004839 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00004840
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004841 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004842 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004843 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004844}
4845
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004846void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004847 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004848 const InputInfoList &Inputs,
4849 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00004850 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004851 ArgStringList CmdArgs;
4852
4853 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4854 options::OPT_Xassembler);
4855
4856 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004857 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004858
4859 for (InputInfoList::const_iterator
4860 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4861 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004862 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004863 }
4864
4865 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004866 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004867 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004868}
4869
4870void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004871 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004872 const InputInfoList &Inputs,
4873 const ArgList &Args,
4874 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004875 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004876 ArgStringList CmdArgs;
4877
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004878 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004879 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004880 CmdArgs.push_back("-e");
4881 CmdArgs.push_back("__start");
4882 }
4883
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004884 if (Args.hasArg(options::OPT_static)) {
4885 CmdArgs.push_back("-Bstatic");
4886 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00004887 if (Args.hasArg(options::OPT_rdynamic))
4888 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004889 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004890 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004891 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004892 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004893 } else {
4894 CmdArgs.push_back("-dynamic-linker");
4895 CmdArgs.push_back("/usr/libexec/ld.so");
4896 }
4897 }
4898
Daniel Dunbarb440f562010-08-02 02:38:21 +00004899 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004900 CmdArgs.push_back("-o");
4901 CmdArgs.push_back(Output.getFilename());
4902 } else {
4903 assert(Output.isNothing() && "Invalid output.");
4904 }
4905
4906 if (!Args.hasArg(options::OPT_nostdlib) &&
4907 !Args.hasArg(options::OPT_nostartfiles)) {
4908 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00004909 if (Args.hasArg(options::OPT_pg))
4910 CmdArgs.push_back(Args.MakeArgString(
4911 getToolChain().GetFilePath("gcrt0.o")));
4912 else
4913 CmdArgs.push_back(Args.MakeArgString(
4914 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004915 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004916 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004917 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004918 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004919 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004920 }
4921 }
4922
Edward O'Callaghan5c521462009-10-28 15:13:08 +00004923 std::string Triple = getToolChain().getTripleString();
4924 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004925 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004926 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004927 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004928
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004929 Args.AddAllArgs(CmdArgs, options::OPT_L);
4930 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4931 Args.AddAllArgs(CmdArgs, options::OPT_e);
4932
Daniel Dunbar54423b22010-09-17 00:24:54 +00004933 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004934
4935 if (!Args.hasArg(options::OPT_nostdlib) &&
4936 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004937 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004938 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00004939 if (Args.hasArg(options::OPT_pg))
4940 CmdArgs.push_back("-lm_p");
4941 else
4942 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004943 }
4944
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004945 // FIXME: For some reason GCC passes -lgcc before adding
4946 // the default system libraries. Just mimic this for now.
4947 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004948
Eric Christopher17674ec2012-09-13 06:32:34 +00004949 if (Args.hasArg(options::OPT_pthread)) {
4950 if (!Args.hasArg(options::OPT_shared) &&
4951 Args.hasArg(options::OPT_pg))
4952 CmdArgs.push_back("-lpthread_p");
4953 else
4954 CmdArgs.push_back("-lpthread");
4955 }
4956
Chandler Carruth45661652011-12-17 22:32:42 +00004957 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00004958 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00004959 CmdArgs.push_back("-lc_p");
4960 else
4961 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00004962 }
Eric Christopher17674ec2012-09-13 06:32:34 +00004963
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004964 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004965 }
4966
4967 if (!Args.hasArg(options::OPT_nostdlib) &&
4968 !Args.hasArg(options::OPT_nostartfiles)) {
4969 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004970 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004971 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004972 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00004973 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004974 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004975 }
4976
4977 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004978 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004979 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004980}
Ed Schoutene33194b2009-04-02 19:13:12 +00004981
Eli Friedman9fa28852012-08-08 23:57:20 +00004982void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4983 const InputInfo &Output,
4984 const InputInfoList &Inputs,
4985 const ArgList &Args,
4986 const char *LinkingOutput) const {
4987 ArgStringList CmdArgs;
4988
4989 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4990 options::OPT_Xassembler);
4991
4992 CmdArgs.push_back("-o");
4993 CmdArgs.push_back(Output.getFilename());
4994
4995 for (InputInfoList::const_iterator
4996 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4997 const InputInfo &II = *it;
4998 CmdArgs.push_back(II.getFilename());
4999 }
5000
5001 const char *Exec =
5002 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5003 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5004}
5005
5006void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5007 const InputInfo &Output,
5008 const InputInfoList &Inputs,
5009 const ArgList &Args,
5010 const char *LinkingOutput) const {
5011 const Driver &D = getToolChain().getDriver();
5012 ArgStringList CmdArgs;
5013
5014 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5015 (!Args.hasArg(options::OPT_shared))) {
5016 CmdArgs.push_back("-e");
5017 CmdArgs.push_back("__start");
5018 }
5019
5020 if (Args.hasArg(options::OPT_static)) {
5021 CmdArgs.push_back("-Bstatic");
5022 } else {
5023 if (Args.hasArg(options::OPT_rdynamic))
5024 CmdArgs.push_back("-export-dynamic");
5025 CmdArgs.push_back("--eh-frame-hdr");
5026 CmdArgs.push_back("-Bdynamic");
5027 if (Args.hasArg(options::OPT_shared)) {
5028 CmdArgs.push_back("-shared");
5029 } else {
5030 CmdArgs.push_back("-dynamic-linker");
5031 CmdArgs.push_back("/usr/libexec/ld.so");
5032 }
5033 }
5034
5035 if (Output.isFilename()) {
5036 CmdArgs.push_back("-o");
5037 CmdArgs.push_back(Output.getFilename());
5038 } else {
5039 assert(Output.isNothing() && "Invalid output.");
5040 }
5041
5042 if (!Args.hasArg(options::OPT_nostdlib) &&
5043 !Args.hasArg(options::OPT_nostartfiles)) {
5044 if (!Args.hasArg(options::OPT_shared)) {
5045 if (Args.hasArg(options::OPT_pg))
5046 CmdArgs.push_back(Args.MakeArgString(
5047 getToolChain().GetFilePath("gcrt0.o")));
5048 else
5049 CmdArgs.push_back(Args.MakeArgString(
5050 getToolChain().GetFilePath("crt0.o")));
5051 CmdArgs.push_back(Args.MakeArgString(
5052 getToolChain().GetFilePath("crtbegin.o")));
5053 } else {
5054 CmdArgs.push_back(Args.MakeArgString(
5055 getToolChain().GetFilePath("crtbeginS.o")));
5056 }
5057 }
5058
5059 Args.AddAllArgs(CmdArgs, options::OPT_L);
5060 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5061 Args.AddAllArgs(CmdArgs, options::OPT_e);
5062
5063 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5064
5065 if (!Args.hasArg(options::OPT_nostdlib) &&
5066 !Args.hasArg(options::OPT_nodefaultlibs)) {
5067 if (D.CCCIsCXX) {
5068 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5069 if (Args.hasArg(options::OPT_pg))
5070 CmdArgs.push_back("-lm_p");
5071 else
5072 CmdArgs.push_back("-lm");
5073 }
5074
5075 if (Args.hasArg(options::OPT_pthread))
5076 CmdArgs.push_back("-lpthread");
5077 if (!Args.hasArg(options::OPT_shared)) {
5078 if (Args.hasArg(options::OPT_pg))
5079 CmdArgs.push_back("-lc_p");
5080 else
5081 CmdArgs.push_back("-lc");
5082 }
5083
5084 std::string myarch = "-lclang_rt.";
5085 const llvm::Triple &T = getToolChain().getTriple();
5086 llvm::Triple::ArchType Arch = T.getArch();
5087 switch (Arch) {
5088 case llvm::Triple::arm:
5089 myarch += ("arm");
5090 break;
5091 case llvm::Triple::x86:
5092 myarch += ("i386");
5093 break;
5094 case llvm::Triple::x86_64:
5095 myarch += ("amd64");
5096 break;
5097 default:
5098 assert(0 && "Unsupported architecture");
5099 }
5100 CmdArgs.push_back(Args.MakeArgString(myarch));
5101 }
5102
5103 if (!Args.hasArg(options::OPT_nostdlib) &&
5104 !Args.hasArg(options::OPT_nostartfiles)) {
5105 if (!Args.hasArg(options::OPT_shared))
5106 CmdArgs.push_back(Args.MakeArgString(
5107 getToolChain().GetFilePath("crtend.o")));
5108 else
5109 CmdArgs.push_back(Args.MakeArgString(
5110 getToolChain().GetFilePath("crtendS.o")));
5111 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005112
5113 const char *Exec =
5114 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5115 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005116}
5117
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005118void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005119 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005120 const InputInfoList &Inputs,
5121 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005122 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005123 ArgStringList CmdArgs;
5124
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005125 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5126 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005127 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005128 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005129 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005130 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005131 else if (getToolChain().getArch() == llvm::Triple::mips ||
5132 getToolChain().getArch() == llvm::Triple::mipsel ||
5133 getToolChain().getArch() == llvm::Triple::mips64 ||
5134 getToolChain().getArch() == llvm::Triple::mips64el) {
5135 StringRef CPUName;
5136 StringRef ABIName;
5137 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005138
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005139 CmdArgs.push_back("-march");
5140 CmdArgs.push_back(CPUName.data());
5141
5142 // Convert ABI name to the GNU tools acceptable variant.
5143 if (ABIName == "o32")
5144 ABIName = "32";
5145 else if (ABIName == "n64")
5146 ABIName = "64";
5147
5148 CmdArgs.push_back("-mabi");
5149 CmdArgs.push_back(ABIName.data());
5150
5151 if (getToolChain().getArch() == llvm::Triple::mips ||
5152 getToolChain().getArch() == llvm::Triple::mips64)
5153 CmdArgs.push_back("-EB");
5154 else
5155 CmdArgs.push_back("-EL");
5156
5157 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5158 options::OPT_fpic, options::OPT_fno_pic,
5159 options::OPT_fPIE, options::OPT_fno_PIE,
5160 options::OPT_fpie, options::OPT_fno_pie);
5161 if (LastPICArg &&
5162 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5163 LastPICArg->getOption().matches(options::OPT_fpic) ||
5164 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5165 LastPICArg->getOption().matches(options::OPT_fpie))) {
5166 CmdArgs.push_back("-KPIC");
5167 }
5168 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005169
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005170 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5171 options::OPT_Xassembler);
5172
5173 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005174 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005175
5176 for (InputInfoList::const_iterator
5177 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5178 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005179 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005180 }
5181
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005182 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005183 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005184 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005185}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005186
5187void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005188 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005189 const InputInfoList &Inputs,
5190 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005191 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005192 const toolchains::FreeBSD& ToolChain =
5193 static_cast<const toolchains::FreeBSD&>(getToolChain());
5194 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005195 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005196
5197 // Silence warning for "clang -g foo.o -o foo"
5198 Args.ClaimAllArgs(options::OPT_g_Group);
5199 // and "clang -emit-llvm foo.o -o foo"
5200 Args.ClaimAllArgs(options::OPT_emit_llvm);
5201 // and for "clang -w foo.o -o foo". Other warning options are already
5202 // handled somewhere else.
5203 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005204
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005205 if (!D.SysRoot.empty())
5206 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5207
Roman Divackyafe2f232012-08-28 15:09:03 +00005208 if (Args.hasArg(options::OPT_pie))
5209 CmdArgs.push_back("-pie");
5210
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005211 if (Args.hasArg(options::OPT_static)) {
5212 CmdArgs.push_back("-Bstatic");
5213 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005214 if (Args.hasArg(options::OPT_rdynamic))
5215 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005216 CmdArgs.push_back("--eh-frame-hdr");
5217 if (Args.hasArg(options::OPT_shared)) {
5218 CmdArgs.push_back("-Bshareable");
5219 } else {
5220 CmdArgs.push_back("-dynamic-linker");
5221 CmdArgs.push_back("/libexec/ld-elf.so.1");
5222 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005223 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5224 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005225 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5226 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5227 CmdArgs.push_back("--hash-style=both");
5228 }
5229 }
5230 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005231 }
5232
5233 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5234 // instruct ld in the base system to link 32-bit code.
Roman Divackyafe2f232012-08-28 15:09:03 +00005235 if (ToolChain.getArchName() == "i386") {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005236 CmdArgs.push_back("-m");
5237 CmdArgs.push_back("elf_i386_fbsd");
5238 }
5239
Roman Divackyafe2f232012-08-28 15:09:03 +00005240 if (ToolChain.getArchName() == "powerpc") {
Roman Divacky5e300b82011-06-04 07:40:24 +00005241 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005242 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005243 }
5244
Daniel Dunbarb440f562010-08-02 02:38:21 +00005245 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005246 CmdArgs.push_back("-o");
5247 CmdArgs.push_back(Output.getFilename());
5248 } else {
5249 assert(Output.isNothing() && "Invalid output.");
5250 }
5251
5252 if (!Args.hasArg(options::OPT_nostdlib) &&
5253 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005254 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005255 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005256 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005257 crt1 = "gcrt1.o";
5258 else if (Args.hasArg(options::OPT_pie))
5259 crt1 = "Scrt1.o";
5260 else
5261 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005262 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005263 if (crt1)
5264 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5265
5266 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5267
5268 const char *crtbegin = NULL;
5269 if (Args.hasArg(options::OPT_static))
5270 crtbegin = "crtbeginT.o";
5271 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5272 crtbegin = "crtbeginS.o";
5273 else
5274 crtbegin = "crtbegin.o";
5275
5276 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005277 }
5278
5279 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005280 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005281 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5282 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005283 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005284 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5285 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005286 Args.AddAllArgs(CmdArgs, options::OPT_s);
5287 Args.AddAllArgs(CmdArgs, options::OPT_t);
5288 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5289 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005290
Roman Divackyafe2f232012-08-28 15:09:03 +00005291 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005292
5293 if (!Args.hasArg(options::OPT_nostdlib) &&
5294 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005295 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005296 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005297 if (Args.hasArg(options::OPT_pg))
5298 CmdArgs.push_back("-lm_p");
5299 else
5300 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005301 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005302 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5303 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005304 if (Args.hasArg(options::OPT_pg))
5305 CmdArgs.push_back("-lgcc_p");
5306 else
5307 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005308 if (Args.hasArg(options::OPT_static)) {
5309 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005310 } else if (Args.hasArg(options::OPT_pg)) {
5311 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005312 } else {
5313 CmdArgs.push_back("--as-needed");
5314 CmdArgs.push_back("-lgcc_s");
5315 CmdArgs.push_back("--no-as-needed");
5316 }
5317
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005318 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005319 if (Args.hasArg(options::OPT_pg))
5320 CmdArgs.push_back("-lpthread_p");
5321 else
5322 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005323 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005324
Roman Divacky66f22762011-02-10 16:59:40 +00005325 if (Args.hasArg(options::OPT_pg)) {
5326 if (Args.hasArg(options::OPT_shared))
5327 CmdArgs.push_back("-lc");
5328 else
5329 CmdArgs.push_back("-lc_p");
5330 CmdArgs.push_back("-lgcc_p");
5331 } else {
5332 CmdArgs.push_back("-lc");
5333 CmdArgs.push_back("-lgcc");
5334 }
5335
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005336 if (Args.hasArg(options::OPT_static)) {
5337 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005338 } else if (Args.hasArg(options::OPT_pg)) {
5339 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005340 } else {
5341 CmdArgs.push_back("--as-needed");
5342 CmdArgs.push_back("-lgcc_s");
5343 CmdArgs.push_back("--no-as-needed");
5344 }
5345 }
5346
5347 if (!Args.hasArg(options::OPT_nostdlib) &&
5348 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005349 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005350 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005351 else
5352 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005353 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005354 }
5355
Roman Divackyafe2f232012-08-28 15:09:03 +00005356 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005357
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005358 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005359 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005360 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005361}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005362
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005363void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5364 const InputInfo &Output,
5365 const InputInfoList &Inputs,
5366 const ArgList &Args,
5367 const char *LinkingOutput) const {
5368 ArgStringList CmdArgs;
5369
5370 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5371 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005372 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005373 CmdArgs.push_back("--32");
5374
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005375 // Set byte order explicitly
5376 if (getToolChain().getArchName() == "mips")
5377 CmdArgs.push_back("-EB");
5378 else if (getToolChain().getArchName() == "mipsel")
5379 CmdArgs.push_back("-EL");
5380
5381 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5382 options::OPT_Xassembler);
5383
5384 CmdArgs.push_back("-o");
5385 CmdArgs.push_back(Output.getFilename());
5386
5387 for (InputInfoList::const_iterator
5388 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5389 const InputInfo &II = *it;
5390 CmdArgs.push_back(II.getFilename());
5391 }
5392
David Chisnallddbd68f2011-09-27 22:03:18 +00005393 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005394 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5395}
5396
5397void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5398 const InputInfo &Output,
5399 const InputInfoList &Inputs,
5400 const ArgList &Args,
5401 const char *LinkingOutput) const {
5402 const Driver &D = getToolChain().getDriver();
5403 ArgStringList CmdArgs;
5404
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005405 if (!D.SysRoot.empty())
5406 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5407
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005408 if (Args.hasArg(options::OPT_static)) {
5409 CmdArgs.push_back("-Bstatic");
5410 } else {
5411 if (Args.hasArg(options::OPT_rdynamic))
5412 CmdArgs.push_back("-export-dynamic");
5413 CmdArgs.push_back("--eh-frame-hdr");
5414 if (Args.hasArg(options::OPT_shared)) {
5415 CmdArgs.push_back("-Bshareable");
5416 } else {
5417 CmdArgs.push_back("-dynamic-linker");
5418 CmdArgs.push_back("/libexec/ld.elf_so");
5419 }
5420 }
5421
5422 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5423 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005424 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005425 CmdArgs.push_back("-m");
5426 CmdArgs.push_back("elf_i386");
5427 }
5428
5429 if (Output.isFilename()) {
5430 CmdArgs.push_back("-o");
5431 CmdArgs.push_back(Output.getFilename());
5432 } else {
5433 assert(Output.isNothing() && "Invalid output.");
5434 }
5435
5436 if (!Args.hasArg(options::OPT_nostdlib) &&
5437 !Args.hasArg(options::OPT_nostartfiles)) {
5438 if (!Args.hasArg(options::OPT_shared)) {
5439 CmdArgs.push_back(Args.MakeArgString(
5440 getToolChain().GetFilePath("crt0.o")));
5441 CmdArgs.push_back(Args.MakeArgString(
5442 getToolChain().GetFilePath("crti.o")));
5443 CmdArgs.push_back(Args.MakeArgString(
5444 getToolChain().GetFilePath("crtbegin.o")));
5445 } else {
5446 CmdArgs.push_back(Args.MakeArgString(
5447 getToolChain().GetFilePath("crti.o")));
5448 CmdArgs.push_back(Args.MakeArgString(
5449 getToolChain().GetFilePath("crtbeginS.o")));
5450 }
5451 }
5452
5453 Args.AddAllArgs(CmdArgs, options::OPT_L);
5454 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5455 Args.AddAllArgs(CmdArgs, options::OPT_e);
5456 Args.AddAllArgs(CmdArgs, options::OPT_s);
5457 Args.AddAllArgs(CmdArgs, options::OPT_t);
5458 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5459 Args.AddAllArgs(CmdArgs, options::OPT_r);
5460
5461 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5462
5463 if (!Args.hasArg(options::OPT_nostdlib) &&
5464 !Args.hasArg(options::OPT_nodefaultlibs)) {
5465 if (D.CCCIsCXX) {
5466 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5467 CmdArgs.push_back("-lm");
5468 }
5469 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5470 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005471 if (Args.hasArg(options::OPT_static)) {
5472 CmdArgs.push_back("-lgcc_eh");
5473 } else {
5474 CmdArgs.push_back("--as-needed");
5475 CmdArgs.push_back("-lgcc_s");
5476 CmdArgs.push_back("--no-as-needed");
5477 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005478 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005479
5480 if (Args.hasArg(options::OPT_pthread))
5481 CmdArgs.push_back("-lpthread");
5482 CmdArgs.push_back("-lc");
5483
5484 CmdArgs.push_back("-lgcc");
5485 if (Args.hasArg(options::OPT_static)) {
5486 CmdArgs.push_back("-lgcc_eh");
5487 } else {
5488 CmdArgs.push_back("--as-needed");
5489 CmdArgs.push_back("-lgcc_s");
5490 CmdArgs.push_back("--no-as-needed");
5491 }
5492 }
5493
5494 if (!Args.hasArg(options::OPT_nostdlib) &&
5495 !Args.hasArg(options::OPT_nostartfiles)) {
5496 if (!Args.hasArg(options::OPT_shared))
5497 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5498 "crtend.o")));
5499 else
5500 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5501 "crtendS.o")));
5502 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5503 "crtn.o")));
5504 }
5505
Bill Wendling08760582011-06-27 19:15:03 +00005506 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005507
David Chisnallddbd68f2011-09-27 22:03:18 +00005508 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005509 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5510}
5511
Rafael Espindola92b00932010-08-10 00:25:48 +00005512void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5513 const InputInfo &Output,
5514 const InputInfoList &Inputs,
5515 const ArgList &Args,
5516 const char *LinkingOutput) const {
5517 ArgStringList CmdArgs;
5518
5519 // Add --32/--64 to make sure we get the format we want.
5520 // This is incomplete
5521 if (getToolChain().getArch() == llvm::Triple::x86) {
5522 CmdArgs.push_back("--32");
5523 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5524 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005525 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5526 CmdArgs.push_back("-a32");
5527 CmdArgs.push_back("-mppc");
5528 CmdArgs.push_back("-many");
5529 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5530 CmdArgs.push_back("-a64");
5531 CmdArgs.push_back("-mppc64");
5532 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005533 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005534 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005535 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5536 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005537
5538 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5539 getToolChain().getTriple());
5540 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005541
5542 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5543 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5544 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005545 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5546 getToolChain().getArch() == llvm::Triple::mipsel ||
5547 getToolChain().getArch() == llvm::Triple::mips64 ||
5548 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005549 StringRef CPUName;
5550 StringRef ABIName;
5551 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005552
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005553 CmdArgs.push_back("-march");
5554 CmdArgs.push_back(CPUName.data());
5555
5556 // Convert ABI name to the GNU tools acceptable variant.
5557 if (ABIName == "o32")
5558 ABIName = "32";
5559 else if (ABIName == "n64")
5560 ABIName = "64";
5561
5562 CmdArgs.push_back("-mabi");
5563 CmdArgs.push_back(ABIName.data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005564
5565 if (getToolChain().getArch() == llvm::Triple::mips ||
5566 getToolChain().getArch() == llvm::Triple::mips64)
5567 CmdArgs.push_back("-EB");
5568 else
5569 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005570
5571 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5572 options::OPT_fpic, options::OPT_fno_pic,
5573 options::OPT_fPIE, options::OPT_fno_PIE,
5574 options::OPT_fpie, options::OPT_fno_pie);
5575 if (LastPICArg &&
5576 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5577 LastPICArg->getOption().matches(options::OPT_fpic) ||
5578 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5579 LastPICArg->getOption().matches(options::OPT_fpie))) {
5580 CmdArgs.push_back("-KPIC");
5581 }
Rafael Espindola92b00932010-08-10 00:25:48 +00005582 }
5583
5584 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5585 options::OPT_Xassembler);
5586
5587 CmdArgs.push_back("-o");
5588 CmdArgs.push_back(Output.getFilename());
5589
5590 for (InputInfoList::const_iterator
5591 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5592 const InputInfo &II = *it;
5593 CmdArgs.push_back(II.getFilename());
5594 }
5595
5596 const char *Exec =
5597 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5598 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5599}
5600
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005601static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5602 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00005603 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005604 bool StaticLibgcc = isAndroid || Args.hasArg(options::OPT_static) ||
Rafael Espindolacc354322011-10-17 21:39:04 +00005605 Args.hasArg(options::OPT_static_libgcc);
5606 if (!D.CCCIsCXX)
5607 CmdArgs.push_back("-lgcc");
5608
5609 if (StaticLibgcc) {
5610 if (D.CCCIsCXX)
5611 CmdArgs.push_back("-lgcc");
5612 } else {
5613 if (!D.CCCIsCXX)
5614 CmdArgs.push_back("--as-needed");
5615 CmdArgs.push_back("-lgcc_s");
5616 if (!D.CCCIsCXX)
5617 CmdArgs.push_back("--no-as-needed");
5618 }
5619
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005620 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005621 CmdArgs.push_back("-lgcc_eh");
5622 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5623 CmdArgs.push_back("-lgcc");
5624}
5625
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005626void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5627 const InputInfo &Output,
5628 const InputInfoList &Inputs,
5629 const ArgList &Args,
5630 const char *LinkingOutput) const {
5631 const toolchains::Linux& ToolChain =
5632 static_cast<const toolchains::Linux&>(getToolChain());
5633 const Driver &D = ToolChain.getDriver();
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005634 const bool isAndroid = ToolChain.getTriple().getEnvironment() ==
Logan Chienc6fd8202012-09-02 09:30:11 +00005635 llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005636
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005637 ArgStringList CmdArgs;
5638
Rafael Espindolad1002f62010-11-15 18:28:16 +00005639 // Silence warning for "clang -g foo.o -o foo"
5640 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005641 // and "clang -emit-llvm foo.o -o foo"
5642 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00005643 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005644 // handled somewhere else.
5645 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005646
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005647 if (!D.SysRoot.empty())
5648 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005649
Rafael Espindolad47ac232010-11-17 22:26:15 +00005650 if (Args.hasArg(options::OPT_pie))
5651 CmdArgs.push_back("-pie");
5652
Rafael Espindola1c76c592010-11-07 22:57:16 +00005653 if (Args.hasArg(options::OPT_rdynamic))
5654 CmdArgs.push_back("-export-dynamic");
5655
Rafael Espindola34d77dc2010-11-11 19:34:42 +00005656 if (Args.hasArg(options::OPT_s))
5657 CmdArgs.push_back("-s");
5658
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005659 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5660 e = ToolChain.ExtraOpts.end();
5661 i != e; ++i)
5662 CmdArgs.push_back(i->c_str());
5663
5664 if (!Args.hasArg(options::OPT_static)) {
5665 CmdArgs.push_back("--eh-frame-hdr");
5666 }
5667
5668 CmdArgs.push_back("-m");
5669 if (ToolChain.getArch() == llvm::Triple::x86)
5670 CmdArgs.push_back("elf_i386");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005671 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00005672 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005673 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005674 else if (ToolChain.getArch() == llvm::Triple::ppc)
5675 CmdArgs.push_back("elf32ppclinux");
5676 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5677 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005678 else if (ToolChain.getArch() == llvm::Triple::mips)
5679 CmdArgs.push_back("elf32btsmip");
5680 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5681 CmdArgs.push_back("elf32ltsmip");
5682 else if (ToolChain.getArch() == llvm::Triple::mips64)
5683 CmdArgs.push_back("elf64btsmip");
5684 else if (ToolChain.getArch() == llvm::Triple::mips64el)
5685 CmdArgs.push_back("elf64ltsmip");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005686 else
5687 CmdArgs.push_back("elf_x86_64");
5688
5689 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00005690 if (ToolChain.getArch() == llvm::Triple::arm
5691 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005692 CmdArgs.push_back("-Bstatic");
5693 else
5694 CmdArgs.push_back("-static");
5695 } else if (Args.hasArg(options::OPT_shared)) {
5696 CmdArgs.push_back("-shared");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005697 if ((ToolChain.getArch() == llvm::Triple::arm
5698 || ToolChain.getArch() == llvm::Triple::thumb) && isAndroid) {
5699 CmdArgs.push_back("-Bsymbolic");
5700 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005701 }
5702
5703 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00005704 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005705 (!Args.hasArg(options::OPT_static) &&
5706 !Args.hasArg(options::OPT_shared))) {
5707 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005708 if (isAndroid)
5709 CmdArgs.push_back("/system/bin/linker");
5710 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005711 CmdArgs.push_back("/lib/ld-linux.so.2");
Douglas Gregord9bb1522011-03-06 19:11:49 +00005712 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liueabbf922012-07-30 11:05:56 +00005713 ToolChain.getArch() == llvm::Triple::thumb) {
5714 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5715 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5716 else
5717 CmdArgs.push_back("/lib/ld-linux.so.3");
5718 }
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005719 else if (ToolChain.getArch() == llvm::Triple::mips ||
5720 ToolChain.getArch() == llvm::Triple::mipsel)
5721 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan1e1e2e22012-04-06 20:14:27 +00005722 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
5723 ToolChain.getArch() == llvm::Triple::mips64el)
5724 CmdArgs.push_back("/lib64/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005725 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner20b90d02011-04-11 21:15:37 +00005726 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005727 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner20b90d02011-04-11 21:15:37 +00005728 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005729 else
5730 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5731 }
5732
5733 CmdArgs.push_back("-o");
5734 CmdArgs.push_back(Output.getFilename());
5735
Rafael Espindola81937ec2010-12-01 01:52:43 +00005736 if (!Args.hasArg(options::OPT_nostdlib) &&
5737 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005738 if (!isAndroid) {
5739 const char *crt1 = NULL;
5740 if (!Args.hasArg(options::OPT_shared)){
5741 if (Args.hasArg(options::OPT_pie))
5742 crt1 = "Scrt1.o";
5743 else
5744 crt1 = "crt1.o";
5745 }
5746 if (crt1)
5747 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005748
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005749 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5750 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005751
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005752 const char *crtbegin;
5753 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005754 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005755 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005756 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005757 else if (Args.hasArg(options::OPT_pie))
5758 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005759 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005760 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005761 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
5762 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005763
5764 Args.AddAllArgs(CmdArgs, options::OPT_L);
5765
5766 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5767
Roman Divackyee8188a2011-03-01 17:53:14 +00005768 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5769 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005770 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005771
Rafael Espindola9446d762012-04-09 23:53:34 +00005772 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5773 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5774 // forward.
5775 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5776 CmdArgs.push_back("-plugin");
5777 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5778 CmdArgs.push_back(Args.MakeArgString(Plugin));
5779 }
5780
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00005781 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5782 CmdArgs.push_back("--no-demangle");
5783
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005784 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5785
Chandler Carruth94a32012012-05-14 18:31:18 +00005786 if (D.CCCIsCXX &&
5787 !Args.hasArg(options::OPT_nostdlib) &&
5788 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00005789 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5790 !Args.hasArg(options::OPT_static);
5791 if (OnlyLibstdcxxStatic)
5792 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005793 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00005794 if (OnlyLibstdcxxStatic)
5795 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005796 CmdArgs.push_back("-lm");
5797 }
5798
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005799 // Call this before we add the C run-time.
5800 addAsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00005801 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005802
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005803 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00005804 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5805 if (Args.hasArg(options::OPT_static))
5806 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00005807
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005808 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005809
Chandler Carruth94a32012012-05-14 18:31:18 +00005810 if (Args.hasArg(options::OPT_pthread) ||
5811 Args.hasArg(options::OPT_pthreads))
5812 CmdArgs.push_back("-lpthread");
5813
5814 CmdArgs.push_back("-lc");
5815
5816 if (Args.hasArg(options::OPT_static))
5817 CmdArgs.push_back("--end-group");
5818 else
5819 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5820 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00005821
Rafael Espindola81937ec2010-12-01 01:52:43 +00005822 if (!Args.hasArg(options::OPT_nostartfiles)) {
5823 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005824 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005825 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005826 else if (Args.hasArg(options::OPT_pie))
5827 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00005828 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005829 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005830
Rafael Espindola81937ec2010-12-01 01:52:43 +00005831 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005832 if (!isAndroid)
5833 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00005834 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005835 }
5836
Bill Wendling08760582011-06-27 19:15:03 +00005837 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005838
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005839 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5840}
Rafael Espindola92b00932010-08-10 00:25:48 +00005841
Chris Lattner3e2ee142010-07-07 16:01:42 +00005842void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005843 const InputInfo &Output,
5844 const InputInfoList &Inputs,
5845 const ArgList &Args,
5846 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005847 ArgStringList CmdArgs;
5848
5849 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5850 options::OPT_Xassembler);
5851
5852 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005853 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005854
5855 for (InputInfoList::const_iterator
5856 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5857 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005858 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005859 }
5860
5861 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00005862 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005863 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005864}
5865
5866void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005867 const InputInfo &Output,
5868 const InputInfoList &Inputs,
5869 const ArgList &Args,
5870 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005871 const Driver &D = getToolChain().getDriver();
5872 ArgStringList CmdArgs;
5873
Daniel Dunbarb440f562010-08-02 02:38:21 +00005874 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005875 CmdArgs.push_back("-o");
5876 CmdArgs.push_back(Output.getFilename());
5877 } else {
5878 assert(Output.isNothing() && "Invalid output.");
5879 }
5880
5881 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00005882 !Args.hasArg(options::OPT_nostartfiles)) {
5883 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
5884 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5885 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
5886 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
5887 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005888
5889 Args.AddAllArgs(CmdArgs, options::OPT_L);
5890 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5891 Args.AddAllArgs(CmdArgs, options::OPT_e);
5892
Daniel Dunbar54423b22010-09-17 00:24:54 +00005893 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005894
Eli Friedman83de5132011-12-08 23:54:21 +00005895 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5896
Chris Lattner3e2ee142010-07-07 16:01:42 +00005897 if (!Args.hasArg(options::OPT_nostdlib) &&
5898 !Args.hasArg(options::OPT_nodefaultlibs)) {
5899 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005900 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005901 CmdArgs.push_back("-lm");
5902 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005903 }
5904
5905 if (!Args.hasArg(options::OPT_nostdlib) &&
5906 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00005907 if (Args.hasArg(options::OPT_pthread))
5908 CmdArgs.push_back("-lpthread");
5909 CmdArgs.push_back("-lc");
5910 CmdArgs.push_back("-lCompilerRT-Generic");
5911 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
5912 CmdArgs.push_back(
5913 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005914 }
5915
Eli Friedman83de5132011-12-08 23:54:21 +00005916 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005917 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005918}
5919
Daniel Dunbarcc912342009-05-02 18:28:39 +00005920/// DragonFly Tools
5921
5922// For now, DragonFly Assemble does just about the same as for
5923// FreeBSD, but this may change soon.
5924void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005925 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005926 const InputInfoList &Inputs,
5927 const ArgList &Args,
5928 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005929 ArgStringList CmdArgs;
5930
5931 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5932 // instruct as in the base system to assemble 32-bit code.
5933 if (getToolChain().getArchName() == "i386")
5934 CmdArgs.push_back("--32");
5935
5936 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5937 options::OPT_Xassembler);
5938
5939 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005940 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005941
5942 for (InputInfoList::const_iterator
5943 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5944 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005945 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005946 }
5947
5948 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005949 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005950 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005951}
5952
5953void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005954 const InputInfo &Output,
5955 const InputInfoList &Inputs,
5956 const ArgList &Args,
5957 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005958 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00005959 ArgStringList CmdArgs;
5960
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005961 if (!D.SysRoot.empty())
5962 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5963
Daniel Dunbarcc912342009-05-02 18:28:39 +00005964 if (Args.hasArg(options::OPT_static)) {
5965 CmdArgs.push_back("-Bstatic");
5966 } else {
5967 if (Args.hasArg(options::OPT_shared))
5968 CmdArgs.push_back("-Bshareable");
5969 else {
5970 CmdArgs.push_back("-dynamic-linker");
5971 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
5972 }
5973 }
5974
5975 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5976 // instruct ld in the base system to link 32-bit code.
5977 if (getToolChain().getArchName() == "i386") {
5978 CmdArgs.push_back("-m");
5979 CmdArgs.push_back("elf_i386");
5980 }
5981
Daniel Dunbarb440f562010-08-02 02:38:21 +00005982 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005983 CmdArgs.push_back("-o");
5984 CmdArgs.push_back(Output.getFilename());
5985 } else {
5986 assert(Output.isNothing() && "Invalid output.");
5987 }
5988
5989 if (!Args.hasArg(options::OPT_nostdlib) &&
5990 !Args.hasArg(options::OPT_nostartfiles)) {
5991 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005992 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005993 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005994 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005995 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005996 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005997 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005998 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005999 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006000 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006001 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006002 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006003 }
6004 }
6005
6006 Args.AddAllArgs(CmdArgs, options::OPT_L);
6007 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6008 Args.AddAllArgs(CmdArgs, options::OPT_e);
6009
Daniel Dunbar54423b22010-09-17 00:24:54 +00006010 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006011
6012 if (!Args.hasArg(options::OPT_nostdlib) &&
6013 !Args.hasArg(options::OPT_nodefaultlibs)) {
6014 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6015 // rpaths
6016 CmdArgs.push_back("-L/usr/lib/gcc41");
6017
6018 if (!Args.hasArg(options::OPT_static)) {
6019 CmdArgs.push_back("-rpath");
6020 CmdArgs.push_back("/usr/lib/gcc41");
6021
6022 CmdArgs.push_back("-rpath-link");
6023 CmdArgs.push_back("/usr/lib/gcc41");
6024
6025 CmdArgs.push_back("-rpath");
6026 CmdArgs.push_back("/usr/lib");
6027
6028 CmdArgs.push_back("-rpath-link");
6029 CmdArgs.push_back("/usr/lib");
6030 }
6031
Rafael Espindola38360b32010-07-20 12:59:03 +00006032 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006033 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006034 CmdArgs.push_back("-lm");
6035 }
6036
Daniel Dunbarcc912342009-05-02 18:28:39 +00006037 if (Args.hasArg(options::OPT_shared)) {
6038 CmdArgs.push_back("-lgcc_pic");
6039 } else {
6040 CmdArgs.push_back("-lgcc");
6041 }
6042
6043
6044 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006045 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006046
6047 if (!Args.hasArg(options::OPT_nolibc)) {
6048 CmdArgs.push_back("-lc");
6049 }
6050
6051 if (Args.hasArg(options::OPT_shared)) {
6052 CmdArgs.push_back("-lgcc_pic");
6053 } else {
6054 CmdArgs.push_back("-lgcc");
6055 }
6056 }
6057
6058 if (!Args.hasArg(options::OPT_nostdlib) &&
6059 !Args.hasArg(options::OPT_nostartfiles)) {
6060 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006061 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006062 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006063 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006064 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006065 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006066 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006067 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006068 }
6069
Bill Wendling08760582011-06-27 19:15:03 +00006070 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006071
Daniel Dunbarcc912342009-05-02 18:28:39 +00006072 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006073 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006074 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006075}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006076
6077void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6078 const InputInfo &Output,
6079 const InputInfoList &Inputs,
6080 const ArgList &Args,
6081 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006082 ArgStringList CmdArgs;
6083
6084 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006085 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6086 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006087 } else {
6088 assert(Output.isNothing() && "Invalid output.");
6089 }
6090
6091 if (!Args.hasArg(options::OPT_nostdlib) &&
6092 !Args.hasArg(options::OPT_nostartfiles)) {
6093 CmdArgs.push_back("-defaultlib:libcmt");
6094 }
6095
6096 CmdArgs.push_back("-nologo");
6097
Michael J. Spencere2f49362012-06-18 16:56:04 +00006098 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6099
6100 // Add filenames immediately.
6101 for (InputInfoList::const_iterator
6102 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6103 if (it->isFilename())
6104 CmdArgs.push_back(it->getFilename());
6105 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006106
6107 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006108 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006109 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6110}