blob: fb5bad4f24e164ce4d03b0008f95be73f352ec13 [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
Chad Rosiera35d5a32013-04-26 20:49:50 +000010#include <sys/stat.h>
Daniel Dunbar1a093d22009-03-18 06:00:36 +000011#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "InputInfo.h"
13#include "SanitizerArgs.h"
14#include "ToolChains.h"
15#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000017#include "clang/Driver/Action.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000018#include "clang/Driver/Arg.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000019#include "clang/Driver/ArgList.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000020#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000021#include "clang/Driver/Driver.h"
22#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000023#include "clang/Driver/Job.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000024#include "clang/Driver/Option.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000025#include "clang/Driver/Options.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000026#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000027#include "clang/Driver/Util.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000029#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000030#include "llvm/ADT/Twine.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000031#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000032#include "llvm/Support/FileSystem.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000033#include "llvm/Support/Format.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000034#include "llvm/Support/Host.h"
35#include "llvm/Support/Process.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000036#include "llvm/Support/raw_ostream.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);
Chad Rosier616e8a52012-10-30 21:42:09 +000096 bool CombinedArg = false;
97
Bill Wendling281ca292012-03-12 21:22:35 +000098 if (!DirList)
99 return; // Nothing to do.
100
Chad Rosier616e8a52012-10-30 21:42:09 +0000101 StringRef Name(ArgName);
102 if (Name.equals("-I") || Name.equals("-L"))
103 CombinedArg = true;
104
Bill Wendling281ca292012-03-12 21:22:35 +0000105 StringRef Dirs(DirList);
106 if (Dirs.empty()) // Empty string should not add '.'.
107 return;
108
109 StringRef::size_type Delim;
110 while ((Delim = Dirs.find(llvm::sys::PathSeparator)) != StringRef::npos) {
111 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000112 if (CombinedArg) {
113 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
114 } else {
115 CmdArgs.push_back(ArgName);
116 CmdArgs.push_back(".");
117 }
Bill Wendling281ca292012-03-12 21:22:35 +0000118 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000119 if (CombinedArg) {
120 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
121 } else {
122 CmdArgs.push_back(ArgName);
123 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
124 }
Bill Wendling281ca292012-03-12 21:22:35 +0000125 }
Nico Weber89355782012-03-19 15:00:03 +0000126 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000127 }
128
129 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000130 if (CombinedArg) {
131 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
132 } else {
133 CmdArgs.push_back(ArgName);
134 CmdArgs.push_back(".");
135 }
Bill Wendling281ca292012-03-12 21:22:35 +0000136 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000137 if (CombinedArg) {
138 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
139 } else {
140 CmdArgs.push_back(ArgName);
141 CmdArgs.push_back(Args.MakeArgString(Dirs));
142 }
Bill Wendling281ca292012-03-12 21:22:35 +0000143 }
144}
145
Daniel Dunbar54423b22010-09-17 00:24:54 +0000146static void AddLinkerInputs(const ToolChain &TC,
147 const InputInfoList &Inputs, const ArgList &Args,
148 ArgStringList &CmdArgs) {
149 const Driver &D = TC.getDriver();
150
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000151 // Add extra linker input arguments which are not treated as inputs
152 // (constructed via -Xarch_).
153 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
154
Daniel Dunbar54423b22010-09-17 00:24:54 +0000155 for (InputInfoList::const_iterator
156 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
157 const InputInfo &II = *it;
158
159 if (!TC.HasNativeLLVMSupport()) {
160 // Don't try to pass LLVM inputs unless we have native support.
161 if (II.getType() == types::TY_LLVM_IR ||
162 II.getType() == types::TY_LTO_IR ||
163 II.getType() == types::TY_LLVM_BC ||
164 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000165 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000166 << TC.getTripleString();
167 }
168
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000169 // Add filenames immediately.
170 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000171 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000172 continue;
173 }
174
175 // Otherwise, this is a linker input argument.
176 const Arg &A = II.getInputArg();
177
178 // Handle reserved library options.
179 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000180 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Senafeb03b2010-09-17 18:39:08 +0000181 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
182 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000183 } else
184 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar54423b22010-09-17 00:24:54 +0000185 }
Bill Wendling281ca292012-03-12 21:22:35 +0000186
187 // LIBRARY_PATH - included following the user specified library paths.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000188 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000189}
190
John McCall31168b02011-06-15 23:02:42 +0000191/// \brief Determine whether Objective-C automated reference counting is
192/// enabled.
193static bool isObjCAutoRefCount(const ArgList &Args) {
194 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
195}
196
Ted Kremeneke65b0862012-03-06 20:05:56 +0000197/// \brief Determine whether we are linking the ObjC runtime.
198static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000199 if (isObjCAutoRefCount(Args)) {
200 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000201 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000202 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000203 return Args.hasArg(options::OPT_fobjc_link_runtime);
204}
205
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000206static void addProfileRT(const ToolChain &TC, const ArgList &Args,
Bill Wendling08760582011-06-27 19:15:03 +0000207 ArgStringList &CmdArgs,
208 llvm::Triple Triple) {
209 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
210 Args.hasArg(options::OPT_fprofile_generate) ||
211 Args.hasArg(options::OPT_fcreate_profile) ||
212 Args.hasArg(options::OPT_coverage)))
213 return;
214
215 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
216 // the link line. We cannot do the same thing because unlike gcov there is a
217 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
218 // not supported by old linkers.
Benjamin Kramerf5fbe432011-11-07 16:02:25 +0000219 std::string ProfileRT =
220 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
Bill Wendling08760582011-06-27 19:15:03 +0000221
Bill Wendling08760582011-06-27 19:15:03 +0000222 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000223}
224
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000225static bool forwardToGCC(const Option &O) {
226 return !O.hasFlag(options::NoForward) &&
227 !O.hasFlag(options::DriverOption) &&
228 !O.hasFlag(options::LinkerInput);
229}
230
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000231void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000232 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000233 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000234 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000235 ArgStringList &CmdArgs,
236 const InputInfo &Output,
237 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000238 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000239
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000240 CheckPreprocessingOptions(D, Args);
241
242 Args.AddLastArg(CmdArgs, options::OPT_C);
243 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000244
245 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000246 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000247 (A = Args.getLastArg(options::OPT_MD)) ||
248 (A = Args.getLastArg(options::OPT_MMD))) {
249 // Determine the output location.
250 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000251 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000252 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000253 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000254 } else if (Output.getType() == types::TY_Dependencies) {
255 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000256 } else if (A->getOption().matches(options::OPT_M) ||
257 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000258 DepFile = "-";
259 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000260 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000261 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000262 }
263 CmdArgs.push_back("-dependency-file");
264 CmdArgs.push_back(DepFile);
265
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000266 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000267 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
268 const char *DepTarget;
269
270 // If user provided -o, that is the dependency target, except
271 // when we are only generating a dependency file.
272 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
273 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000274 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000275 } else {
276 // Otherwise derive from the base input.
277 //
278 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000279 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000280 llvm::sys::path::replace_extension(P, "o");
281 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000282 }
283
284 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000285 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000286 QuoteTarget(DepTarget, Quoted);
287 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000288 }
289
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000290 if (A->getOption().matches(options::OPT_M) ||
291 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000292 CmdArgs.push_back("-sys-header-deps");
293 }
294
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000295 if (Args.hasArg(options::OPT_MG)) {
296 if (!A || A->getOption().matches(options::OPT_MD) ||
297 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000298 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000299 CmdArgs.push_back("-MG");
300 }
301
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000302 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000303
304 // Convert all -MQ <target> args to -MT <quoted target>
305 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
306 options::OPT_MQ),
307 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000308 const Arg *A = *it;
309 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000310
Daniel Dunbara442fd52010-06-11 22:00:13 +0000311 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000312 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000313 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000314 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000315 CmdArgs.push_back(Args.MakeArgString(Quoted));
316
317 // -MT flag - no change
318 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000319 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000320 }
321 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000322
Douglas Gregor111af7d2009-04-18 00:34:01 +0000323 // Add -i* options, and automatically translate to
324 // -include-pch/-include-pth for transparent PCH support. It's
325 // wonky, but we include looking for .gch so we can support seamless
326 // replacement into a build system already set up to be generating
327 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000328 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000329 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
330 ie = Args.filtered_end(); it != ie; ++it) {
331 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000332
333 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000334 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
335 RenderedImplicitInclude = true;
336
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000337 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000338 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000339
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000340 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000341 bool FoundPCH = false;
Richard Smithbd55daf2012-11-01 04:30:05 +0000342 llvm::sys::Path P(A->getValue());
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000343 bool Exists;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000344 if (UsePCH) {
Douglas Gregor111af7d2009-04-18 00:34:01 +0000345 P.appendSuffix("pch");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000346 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregor111af7d2009-04-18 00:34:01 +0000347 FoundPCH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000348 else
Douglas Gregor111af7d2009-04-18 00:34:01 +0000349 P.eraseSuffix();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000350 }
351
Douglas Gregor111af7d2009-04-18 00:34:01 +0000352 if (!FoundPCH) {
353 P.appendSuffix("pth");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000354 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregor111af7d2009-04-18 00:34:01 +0000355 FoundPTH = true;
356 else
357 P.eraseSuffix();
Mike Stump11289f42009-09-09 15:08:12 +0000358 }
359
Douglas Gregor111af7d2009-04-18 00:34:01 +0000360 if (!FoundPCH && !FoundPTH) {
361 P.appendSuffix("gch");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000362 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000363 FoundPCH = UsePCH;
364 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000365 }
Mike Stump11289f42009-09-09 15:08:12 +0000366 else
Douglas Gregor111af7d2009-04-18 00:34:01 +0000367 P.eraseSuffix();
368 }
369
370 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000371 if (IsFirstImplicitInclude) {
372 A->claim();
373 if (UsePCH)
374 CmdArgs.push_back("-include-pch");
375 else
376 CmdArgs.push_back("-include-pth");
377 CmdArgs.push_back(Args.MakeArgString(P.str()));
378 continue;
379 } else {
380 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000381 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000382 << P.str() << A->getAsString(Args);
383 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000384 }
385 }
386
387 // Not translated, render as usual.
388 A->claim();
389 A->render(Args, CmdArgs);
390 }
391
392 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000393 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
394 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000395
396 // Add -Wp, and -Xassembler if using the preprocessor.
397
398 // FIXME: There is a very unfortunate problem here, some troubled
399 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
400 // really support that we would have to parse and then translate
401 // those options. :(
402 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
403 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000404
405 // -I- is a deprecated GCC feature, reject it.
406 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000407 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000408
409 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
410 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000411 StringRef sysroot = C.getSysRoot();
412 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000413 if (!Args.hasArg(options::OPT_isysroot)) {
414 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000415 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000416 }
417 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000418
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000419 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000420 // FIXME: We should probably sink the logic for handling these from the
421 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000422 // CPATH - included following the user specified includes (but prior to
423 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000424 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000425 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000426 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000427 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000428 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000429 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000430 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000431 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000432 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000433
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000434 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000435 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000436 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000437
438 // Add system include arguments.
439 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000440}
441
Daniel Dunbarf492c922009-09-10 22:59:51 +0000442/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000443/// CPU.
444//
445// FIXME: This is redundant with -mcpu, why does LLVM use this.
446// FIXME: tblgen this, or kill it!
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000447static const char *getLLVMArchSuffixForARM(StringRef CPU) {
Chad Rosier9ac84512011-10-07 17:48:56 +0000448 return llvm::StringSwitch<const char *>(CPU)
449 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
450 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
451 .Cases("arm920", "arm920t", "arm922t", "v4t")
452 .Cases("arm940t", "ep9312","v4t")
453 .Cases("arm10tdmi", "arm1020t", "v5")
454 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
455 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
456 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
457 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
458 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
459 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Bob Wilsonf643afc2013-03-04 22:37:46 +0000460 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
461 .Cases("cortex-a9", "cortex-a15", "v7")
Quentin Colombetf5a37a32012-12-21 17:57:47 +0000462 .Case("cortex-r5", "v7r")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000463 .Case("cortex-m0", "v6m")
Bob Wilson743bf672013-03-04 22:37:49 +0000464 .Case("cortex-m3", "v7m")
465 .Case("cortex-m4", "v7em")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000466 .Case("cortex-a9-mp", "v7f")
467 .Case("swift", "v7s")
Chad Rosier9ac84512011-10-07 17:48:56 +0000468 .Default("");
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000469}
470
Benjamin Kramer09811c72012-06-26 22:20:06 +0000471/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
472//
473// FIXME: tblgen this.
474static std::string getARMTargetCPU(const ArgList &Args,
475 const llvm::Triple &Triple) {
476 // FIXME: Warn on inconsistent use of -mcpu and -march.
477
478 // If we have -mcpu=, use that.
479 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000480 StringRef MCPU = A->getValue();
Benjamin Kramer09811c72012-06-26 22:20:06 +0000481 // Handle -mcpu=native.
482 if (MCPU == "native")
483 return llvm::sys::getHostCPUName();
484 else
485 return MCPU;
486 }
487
488 StringRef MArch;
489 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
490 // Otherwise, if we have -march= choose the base CPU for that arch.
Richard Smithbd55daf2012-11-01 04:30:05 +0000491 MArch = A->getValue();
Benjamin Kramer09811c72012-06-26 22:20:06 +0000492 } else {
493 // Otherwise, use the Arch from the triple.
494 MArch = Triple.getArchName();
495 }
496
497 // Handle -march=native.
498 std::string NativeMArch;
499 if (MArch == "native") {
500 std::string CPU = llvm::sys::getHostCPUName();
501 if (CPU != "generic") {
502 // Translate the native cpu into the architecture. The switch below will
503 // then chose the minimum cpu for that arch.
504 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
505 MArch = NativeMArch;
506 }
507 }
508
509 return llvm::StringSwitch<const char *>(MArch)
510 .Cases("armv2", "armv2a","arm2")
511 .Case("armv3", "arm6")
512 .Case("armv3m", "arm7m")
513 .Cases("armv4", "armv4t", "arm7tdmi")
514 .Cases("armv5", "armv5t", "arm10tdmi")
515 .Cases("armv5e", "armv5te", "arm1022e")
516 .Case("armv5tej", "arm926ej-s")
517 .Cases("armv6", "armv6k", "arm1136jf-s")
518 .Case("armv6j", "arm1136j-s")
519 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
520 .Case("armv6t2", "arm1156t2-s")
Bob Wilson743bf672013-03-04 22:37:49 +0000521 .Cases("armv6m", "armv6-m", "cortex-m0")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000522 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Bob Wilson743bf672013-03-04 22:37:49 +0000523 .Cases("armv7em", "armv7e-m", "cortex-m4")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000524 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
525 .Cases("armv7s", "armv7-s", "swift")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000526 .Cases("armv7r", "armv7-r", "cortex-r4")
527 .Cases("armv7m", "armv7-m", "cortex-m3")
528 .Case("ep9312", "ep9312")
529 .Case("iwmmxt", "iwmmxt")
530 .Case("xscale", "xscale")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000531 // If all else failed, return the most base CPU LLVM supports.
532 .Default("arm7tdmi");
533}
534
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000535// FIXME: Move to target hook.
536static bool isSignedCharDefault(const llvm::Triple &Triple) {
537 switch (Triple.getArch()) {
538 default:
539 return true;
540
Tim Northover9bb857a2013-01-31 12:13:10 +0000541 case llvm::Triple::aarch64:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000542 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000543 case llvm::Triple::ppc:
544 case llvm::Triple::ppc64:
Bob Wilson6524dd32011-10-14 05:03:44 +0000545 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000546 return true;
547 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000548 }
549}
550
Chad Rosiercfbfc582012-04-04 20:51:35 +0000551// Handle -mfpu=.
552//
553// FIXME: Centralize feature selection, defaulting shouldn't be also in the
554// frontend target.
555static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
556 ArgStringList &CmdArgs) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000557 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000558
559 // Set the target features based on the FPU.
560 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
561 // Disable any default FPU support.
562 CmdArgs.push_back("-target-feature");
563 CmdArgs.push_back("-vfp2");
564 CmdArgs.push_back("-target-feature");
565 CmdArgs.push_back("-vfp3");
566 CmdArgs.push_back("-target-feature");
567 CmdArgs.push_back("-neon");
568 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
569 CmdArgs.push_back("-target-feature");
570 CmdArgs.push_back("+vfp3");
571 CmdArgs.push_back("-target-feature");
572 CmdArgs.push_back("+d16");
573 CmdArgs.push_back("-target-feature");
574 CmdArgs.push_back("-neon");
575 } else if (FPU == "vfp") {
576 CmdArgs.push_back("-target-feature");
577 CmdArgs.push_back("+vfp2");
578 CmdArgs.push_back("-target-feature");
579 CmdArgs.push_back("-neon");
580 } else if (FPU == "vfp3" || FPU == "vfpv3") {
581 CmdArgs.push_back("-target-feature");
582 CmdArgs.push_back("+vfp3");
583 CmdArgs.push_back("-target-feature");
584 CmdArgs.push_back("-neon");
585 } else if (FPU == "neon") {
586 CmdArgs.push_back("-target-feature");
587 CmdArgs.push_back("+neon");
588 } else
589 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
590}
591
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000592// Handle -mfpmath=.
593static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
Chad Rosier45619cb2012-04-04 22:13:40 +0000594 ArgStringList &CmdArgs, StringRef CPU) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000595 StringRef FPMath = A->getValue();
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000596
597 // Set the target features based on the FPMath.
598 if (FPMath == "neon") {
599 CmdArgs.push_back("-target-feature");
600 CmdArgs.push_back("+neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000601
Bob Wilsonf643afc2013-03-04 22:37:46 +0000602 if (CPU != "cortex-a5" && CPU != "cortex-a7" &&
603 CPU != "cortex-a8" && CPU != "cortex-a9" &&
604 CPU != "cortex-a9-mp" && CPU != "cortex-a15")
Chad Rosier45619cb2012-04-04 22:13:40 +0000605 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
606
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000607 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
608 FPMath == "vfp4") {
609 CmdArgs.push_back("-target-feature");
610 CmdArgs.push_back("-neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000611
612 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000613 } else
614 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
615}
616
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000617// Select the float ABI as determined by -msoft-float, -mhard-float, and
618// -mfloat-abi=.
619static StringRef getARMFloatABI(const Driver &D,
620 const ArgList &Args,
621 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000622 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000623 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
624 options::OPT_mhard_float,
625 options::OPT_mfloat_abi_EQ)) {
626 if (A->getOption().matches(options::OPT_msoft_float))
627 FloatABI = "soft";
628 else if (A->getOption().matches(options::OPT_mhard_float))
629 FloatABI = "hard";
630 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000631 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000632 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000633 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000634 << A->getAsString(Args);
635 FloatABI = "soft";
636 }
637 }
638 }
639
640 // If unspecified, choose the default based on the platform.
641 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000642 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000643 case llvm::Triple::Darwin:
644 case llvm::Triple::MacOSX:
645 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000646 // Darwin defaults to "softfp" for v6 and v7.
647 //
648 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000649 std::string ArchName =
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000650 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000651 if (StringRef(ArchName).startswith("v6") ||
652 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000653 FloatABI = "softfp";
654 else
655 FloatABI = "soft";
656 break;
657 }
658
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000659 case llvm::Triple::FreeBSD:
660 // FreeBSD defaults to soft float
661 FloatABI = "soft";
662 break;
663
Daniel Dunbar78485922009-09-10 23:00:09 +0000664 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000665 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000666 case llvm::Triple::GNUEABIHF:
667 FloatABI = "hard";
668 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000669 case llvm::Triple::GNUEABI:
670 FloatABI = "softfp";
671 break;
672 case llvm::Triple::EABI:
673 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
674 FloatABI = "softfp";
675 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000676 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000677 std::string ArchName =
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000678 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000679 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000680 FloatABI = "softfp";
681 else
682 FloatABI = "soft";
683 break;
684 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000685 default:
686 // Assume "soft", but warn the user we are guessing.
687 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000688 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000689 break;
690 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000691 }
692 }
693
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000694 return FloatABI;
695}
696
697
698void Clang::AddARMTargetArgs(const ArgList &Args,
699 ArgStringList &CmdArgs,
700 bool KernelOrKext) const {
701 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000702 // Get the effective triple, which takes into account the deployment target.
703 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
704 llvm::Triple Triple(TripleStr);
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000705 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000706
707 // Select the ABI to use.
708 //
709 // FIXME: Support -meabi.
710 const char *ABIName = 0;
711 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000712 ABIName = A->getValue();
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000713 } else if (Triple.isOSDarwin()) {
714 // The backend is hardwired to assume AAPCS for M-class processors, ensure
715 // the frontend matches that.
716 if (StringRef(CPUName).startswith("cortex-m")) {
717 ABIName = "aapcs";
718 } else {
719 ABIName = "apcs-gnu";
720 }
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000721 } else {
722 // Select the default based on the platform.
723 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000724 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000725 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000726 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000727 ABIName = "aapcs-linux";
728 break;
729 case llvm::Triple::EABI:
730 ABIName = "aapcs";
731 break;
732 default:
733 ABIName = "apcs-gnu";
734 }
735 }
736 CmdArgs.push_back("-target-abi");
737 CmdArgs.push_back(ABIName);
738
739 // Set the CPU based on -march= and -mcpu=.
740 CmdArgs.push_back("-target-cpu");
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000741 CmdArgs.push_back(Args.MakeArgString(CPUName));
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000742
743 // Determine floating point ABI from the options & target defaults.
744 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000745 if (FloatABI == "soft") {
746 // Floating point operations and argument passing are soft.
747 //
748 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000749 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000750 CmdArgs.push_back("-mfloat-abi");
751 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000752 } else if (FloatABI == "softfp") {
753 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000754 CmdArgs.push_back("-mfloat-abi");
755 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000756 } else {
757 // Floating point operations and argument passing are hard.
758 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000759 CmdArgs.push_back("-mfloat-abi");
760 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000761 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000762
763 // Set appropriate target features for floating point mode.
764 //
765 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
766 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
767 // stripped out by the ARM target.
768
769 // Use software floating point operations?
770 if (FloatABI == "soft") {
771 CmdArgs.push_back("-target-feature");
772 CmdArgs.push_back("+soft-float");
773 }
774
775 // Use software floating point argument passing?
776 if (FloatABI != "hard") {
777 CmdArgs.push_back("-target-feature");
778 CmdArgs.push_back("+soft-float-abi");
779 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +0000780
781 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +0000782 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +0000783 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000784
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000785 // Honor -mfpmath=.
786 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +0000787 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000788
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000789 // Setting -msoft-float effectively disables NEON because of the GCC
790 // implementation, although the same isn't true of VFP or VFP3.
791 if (FloatABI == "soft") {
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000792 CmdArgs.push_back("-target-feature");
793 CmdArgs.push_back("-neon");
794 }
795
796 // Kernel code has more strict alignment requirements.
797 if (KernelOrKext) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000798 if (Triple.getOS() != llvm::Triple::IOS || Triple.isOSVersionLT(6)) {
799 CmdArgs.push_back("-backend-option");
800 CmdArgs.push_back("-arm-long-calls");
801 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000802
Daniel Dunbar12100e22011-03-22 16:48:17 +0000803 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000804 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000805
806 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000807 CmdArgs.push_back("-backend-option");
808 CmdArgs.push_back("-arm-darwin-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000809 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000810
811 // Setting -mno-global-merge disables the codegen global merge pass. Setting
812 // -mglobal-merge has no effect as the pass is enabled by default.
813 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
814 options::OPT_mno_global_merge)) {
815 if (A->getOption().matches(options::OPT_mno_global_merge))
816 CmdArgs.push_back("-mno-global-merge");
817 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000818
Bob Wilson9c8af452013-04-11 18:53:25 +0000819 if (!Args.hasFlag(options::OPT_mimplicit_float,
820 options::OPT_mno_implicit_float,
821 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000822 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000823}
824
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000825// Translate MIPS CPU name alias option to CPU name.
826static StringRef getMipsCPUFromAlias(const Arg &A) {
827 if (A.getOption().matches(options::OPT_mips32))
828 return "mips32";
829 if (A.getOption().matches(options::OPT_mips32r2))
830 return "mips32r2";
831 if (A.getOption().matches(options::OPT_mips64))
832 return "mips64";
833 if (A.getOption().matches(options::OPT_mips64r2))
834 return "mips64r2";
835 llvm_unreachable("Unexpected option");
836 return "";
837}
838
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000839// Get CPU and ABI names. They are not independent
840// so we have to calculate them together.
841static void getMipsCPUAndABI(const ArgList &Args,
842 const ToolChain &TC,
843 StringRef &CPUName,
844 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000845 const char *DefMips32CPU = "mips32";
846 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000847
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000848 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000849 options::OPT_mcpu_EQ,
850 options::OPT_mips_CPUs_Group)) {
851 if (A->getOption().matches(options::OPT_mips_CPUs_Group))
852 CPUName = getMipsCPUFromAlias(*A);
853 else
Richard Smithbd55daf2012-11-01 04:30:05 +0000854 CPUName = A->getValue();
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000855 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000856
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000857 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000858 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000859 // Convert a GNU style Mips ABI name to the name
860 // accepted by LLVM Mips backend.
861 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
862 .Case("32", "o32")
863 .Case("64", "n64")
864 .Default(ABIName);
865 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000866
867 // Setup default CPU and ABI names.
868 if (CPUName.empty() && ABIName.empty()) {
869 switch (TC.getTriple().getArch()) {
870 default:
871 llvm_unreachable("Unexpected triple arch name");
872 case llvm::Triple::mips:
873 case llvm::Triple::mipsel:
874 CPUName = DefMips32CPU;
875 break;
876 case llvm::Triple::mips64:
877 case llvm::Triple::mips64el:
878 CPUName = DefMips64CPU;
879 break;
880 }
881 }
882
883 if (!ABIName.empty()) {
884 // Deduce CPU name from ABI name.
885 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000886 .Cases("32", "o32", "eabi", DefMips32CPU)
887 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000888 .Default("");
889 }
890 else if (!CPUName.empty()) {
891 // Deduce ABI name from CPU name.
892 ABIName = llvm::StringSwitch<const char *>(CPUName)
893 .Cases("mips32", "mips32r2", "o32")
894 .Cases("mips64", "mips64r2", "n64")
895 .Default("");
896 }
897
898 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000899}
900
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000901// Convert ABI name to the GNU tools acceptable variant.
902static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
903 return llvm::StringSwitch<llvm::StringRef>(ABI)
904 .Case("o32", "32")
905 .Case("n64", "64")
906 .Default(ABI);
907}
908
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000909// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
910// and -mfloat-abi=.
911static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000912 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000913 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000914 options::OPT_mhard_float,
915 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000916 if (A->getOption().matches(options::OPT_msoft_float))
917 FloatABI = "soft";
918 else if (A->getOption().matches(options::OPT_mhard_float))
919 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000920 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000921 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +0000922 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000923 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000924 FloatABI = "hard";
925 }
926 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000927 }
928
929 // If unspecified, choose the default based on the platform.
930 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000931 // Assume "hard", because it's a default value used by gcc.
932 // When we start to recognize specific target MIPS processors,
933 // we will be able to select the default more correctly.
934 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000935 }
936
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000937 return FloatABI;
938}
939
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000940static void AddTargetFeature(const ArgList &Args,
941 ArgStringList &CmdArgs,
942 OptSpecifier OnOpt,
943 OptSpecifier OffOpt,
944 StringRef FeatureName) {
945 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
946 CmdArgs.push_back("-target-feature");
947 if (A->getOption().matches(OnOpt))
948 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
949 else
950 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
951 }
952}
953
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000954void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +0000955 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000956 const Driver &D = getToolChain().getDriver();
957 StringRef CPUName;
958 StringRef ABIName;
959 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
960
961 CmdArgs.push_back("-target-cpu");
962 CmdArgs.push_back(CPUName.data());
963
964 CmdArgs.push_back("-target-abi");
965 CmdArgs.push_back(ABIName.data());
966
967 StringRef FloatABI = getMipsFloatABI(D, Args);
968
Simon Atanasyan81c423c2013-01-10 12:36:19 +0000969 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
970
971 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000972 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +0000973 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000974 CmdArgs.push_back("-mfloat-abi");
975 CmdArgs.push_back("soft");
976
977 // FIXME: Note, this is a hack. We need to pass the selected float
978 // mode to the MipsTargetInfoBase to define appropriate macros there.
979 // Now it is the only method.
980 CmdArgs.push_back("-target-feature");
981 CmdArgs.push_back("+soft-float");
Simon Atanasyan81c423c2013-01-10 12:36:19 +0000982
983 if (FloatABI == "hard" && IsMips16) {
984 CmdArgs.push_back("-mllvm");
985 CmdArgs.push_back("-mips16-hard-float");
986 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000987 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000988 else {
989 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +0000990 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000991 CmdArgs.push_back("-mfloat-abi");
992 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +0000993 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +0000994
Simon Atanasyan82eec3a2013-04-14 14:07:36 +0000995 AddTargetFeature(Args, CmdArgs,
996 options::OPT_msingle_float, options::OPT_mdouble_float,
997 "single-float");
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000998 AddTargetFeature(Args, CmdArgs,
999 options::OPT_mips16, options::OPT_mno_mips16,
1000 "mips16");
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +00001001 AddTargetFeature(Args, CmdArgs,
Simon Atanasyan60777612013-04-14 14:07:51 +00001002 options::OPT_mmicromips, options::OPT_mno_micromips,
1003 "micromips");
1004 AddTargetFeature(Args, CmdArgs,
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +00001005 options::OPT_mdsp, options::OPT_mno_dsp,
1006 "dsp");
1007 AddTargetFeature(Args, CmdArgs,
1008 options::OPT_mdspr2, options::OPT_mno_dspr2,
1009 "dspr2");
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001010
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001011 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1012 if (A->getOption().matches(options::OPT_mxgot)) {
1013 CmdArgs.push_back("-mllvm");
1014 CmdArgs.push_back("-mxgot");
1015 }
1016 }
1017
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001018 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001019 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001020 CmdArgs.push_back("-mllvm");
1021 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1022 A->claim();
1023 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001024}
1025
Hal Finkel8eb59282012-06-11 22:35:19 +00001026/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1027static std::string getPPCTargetCPU(const ArgList &Args) {
1028 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001029 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001030
1031 if (CPUName == "native") {
1032 std::string CPU = llvm::sys::getHostCPUName();
1033 if (!CPU.empty() && CPU != "generic")
1034 return CPU;
1035 else
1036 return "";
1037 }
1038
1039 return llvm::StringSwitch<const char *>(CPUName)
1040 .Case("common", "generic")
1041 .Case("440", "440")
1042 .Case("440fp", "440")
1043 .Case("450", "450")
1044 .Case("601", "601")
1045 .Case("602", "602")
1046 .Case("603", "603")
1047 .Case("603e", "603e")
1048 .Case("603ev", "603ev")
1049 .Case("604", "604")
1050 .Case("604e", "604e")
1051 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001052 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001053 .Case("G3", "g3")
1054 .Case("7400", "7400")
1055 .Case("G4", "g4")
1056 .Case("7450", "7450")
1057 .Case("G4+", "g4+")
1058 .Case("750", "750")
1059 .Case("970", "970")
1060 .Case("G5", "g5")
1061 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001062 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001063 .Case("e500mc", "e500mc")
1064 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001065 .Case("power3", "pwr3")
1066 .Case("power4", "pwr4")
1067 .Case("power5", "pwr5")
1068 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001069 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001070 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001071 .Case("power7", "pwr7")
Bill Schmidt38378a02013-02-01 20:23:10 +00001072 .Case("pwr3", "pwr3")
1073 .Case("pwr4", "pwr4")
1074 .Case("pwr5", "pwr5")
1075 .Case("pwr5x", "pwr5x")
1076 .Case("pwr6", "pwr6")
1077 .Case("pwr6x", "pwr6x")
1078 .Case("pwr7", "pwr7")
Hal Finkel8eb59282012-06-11 22:35:19 +00001079 .Case("powerpc", "ppc")
1080 .Case("powerpc64", "ppc64")
1081 .Default("");
1082 }
1083
1084 return "";
1085}
1086
1087void Clang::AddPPCTargetArgs(const ArgList &Args,
1088 ArgStringList &CmdArgs) const {
1089 std::string TargetCPUName = getPPCTargetCPU(Args);
1090
1091 // LLVM may default to generating code for the native CPU,
1092 // but, like gcc, we default to a more generic option for
1093 // each architecture. (except on Darwin)
1094 llvm::Triple Triple = getToolChain().getTriple();
1095 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1096 if (Triple.getArch() == llvm::Triple::ppc64)
1097 TargetCPUName = "ppc64";
1098 else
1099 TargetCPUName = "ppc";
1100 }
1101
1102 if (!TargetCPUName.empty()) {
1103 CmdArgs.push_back("-target-cpu");
1104 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1105 }
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001106
1107 // Allow override of the Altivec feature.
Hal Finkel279ca4d2013-03-28 08:38:53 +00001108 AddTargetFeature(Args, CmdArgs,
1109 options::OPT_faltivec, options::OPT_fno_altivec,
1110 "altivec");
Hal Finkelb58ce852013-02-01 18:44:19 +00001111
Hal Finkel7d458592013-03-30 13:47:44 +00001112 AddTargetFeature(Args, CmdArgs,
1113 options::OPT_mfprnd, options::OPT_mno_fprnd,
1114 "fprnd");
1115
Hal Finkel279ca4d2013-03-28 08:38:53 +00001116 // Note that gcc calls this mfcrf and LLVM calls this mfocrf.
1117 AddTargetFeature(Args, CmdArgs,
1118 options::OPT_mmfcrf, options::OPT_mno_mfcrf,
1119 "mfocrf");
1120
Hal Finkel1fe8b3d2013-03-28 13:51:36 +00001121 AddTargetFeature(Args, CmdArgs,
1122 options::OPT_mpopcntd, options::OPT_mno_popcntd,
1123 "popcntd");
1124
Hal Finkel279ca4d2013-03-28 08:38:53 +00001125 // It is really only possible to turn qpx off because turning qpx on is tied
1126 // to using the a2q CPU.
Hal Finkelb58ce852013-02-01 18:44:19 +00001127 if (Args.hasFlag(options::OPT_mno_qpx, options::OPT_mqpx, false)) {
1128 CmdArgs.push_back("-target-feature");
1129 CmdArgs.push_back("-qpx");
1130 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001131}
1132
Tom Stellard6674c702013-04-01 20:56:53 +00001133/// Get the (LLVM) name of the R600 gpu we are targeting.
1134static std::string getR600TargetGPU(const ArgList &Args) {
1135 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1136 std::string GPUName = A->getValue();
1137 return llvm::StringSwitch<const char *>(GPUName)
1138 .Cases("rv610", "rv620", "rv630", "r600")
1139 .Cases("rv635", "rs780", "rs880", "r600")
1140 .Case("rv740", "rv770")
1141 .Case("palm", "cedar")
1142 .Cases("sumo", "sumo2", "redwood")
1143 .Case("hemlock", "cypress")
1144 .Case("aruba", "cayman")
1145 .Default(GPUName.c_str());
1146 }
1147 return "";
1148}
1149
1150void Clang::AddR600TargetArgs(const ArgList &Args,
1151 ArgStringList &CmdArgs) const {
1152 std::string TargetGPUName = getR600TargetGPU(Args);
1153 CmdArgs.push_back("-target-cpu");
1154 CmdArgs.push_back(Args.MakeArgString(TargetGPUName.c_str()));
1155}
1156
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001157void Clang::AddSparcTargetArgs(const ArgList &Args,
1158 ArgStringList &CmdArgs) const {
1159 const Driver &D = getToolChain().getDriver();
1160
1161 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001162 CmdArgs.push_back("-target-cpu");
Richard Smithbd55daf2012-11-01 04:30:05 +00001163 CmdArgs.push_back(A->getValue());
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001164 }
1165
1166 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001167 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001168 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1169 options::OPT_mhard_float)) {
1170 if (A->getOption().matches(options::OPT_msoft_float))
1171 FloatABI = "soft";
1172 else if (A->getOption().matches(options::OPT_mhard_float))
1173 FloatABI = "hard";
1174 }
1175
1176 // If unspecified, choose the default based on the platform.
1177 if (FloatABI.empty()) {
1178 switch (getToolChain().getTriple().getOS()) {
1179 default:
1180 // Assume "soft", but warn the user we are guessing.
1181 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001182 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001183 break;
1184 }
1185 }
1186
1187 if (FloatABI == "soft") {
1188 // Floating point operations and argument passing are soft.
1189 //
1190 // FIXME: This changes CPP defines, we need -target-soft-float.
1191 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001192 CmdArgs.push_back("-target-feature");
1193 CmdArgs.push_back("+soft-float");
1194 } else {
1195 assert(FloatABI == "hard" && "Invalid float abi!");
1196 CmdArgs.push_back("-mhard-float");
1197 }
1198}
1199
Chandler Carruth953fb082013-01-13 11:46:33 +00001200static const char *getX86TargetCPU(const ArgList &Args,
1201 const llvm::Triple &Triple) {
1202 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1203 if (StringRef(A->getValue()) != "native")
1204 return A->getValue();
1205
1206 // FIXME: Reject attempts to use -march=native unless the target matches
1207 // the host.
1208 //
1209 // FIXME: We should also incorporate the detected target features for use
1210 // with -native.
1211 std::string CPU = llvm::sys::getHostCPUName();
1212 if (!CPU.empty() && CPU != "generic")
1213 return Args.MakeArgString(CPU);
1214 }
1215
1216 // Select the default CPU if none was given (or detection failed).
1217
1218 if (Triple.getArch() != llvm::Triple::x86_64 &&
1219 Triple.getArch() != llvm::Triple::x86)
1220 return 0; // This routine is only handling x86 targets.
1221
1222 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1223
1224 // FIXME: Need target hooks.
1225 if (Triple.isOSDarwin())
1226 return Is64Bit ? "core2" : "yonah";
1227
1228 // Everything else goes to x86-64 in 64-bit mode.
1229 if (Is64Bit)
1230 return "x86-64";
1231
1232 if (Triple.getOSName().startswith("haiku"))
1233 return "i586";
1234 if (Triple.getOSName().startswith("openbsd"))
1235 return "i486";
1236 if (Triple.getOSName().startswith("bitrig"))
1237 return "i686";
1238 if (Triple.getOSName().startswith("freebsd"))
1239 return "i486";
1240 if (Triple.getOSName().startswith("netbsd"))
1241 return "i486";
1242 // All x86 devices running Android have core2 as their common
1243 // denominator. This makes a better choice than pentium4.
1244 if (Triple.getEnvironment() == llvm::Triple::Android)
1245 return "core2";
1246
1247 // Fallback to p4.
1248 return "pentium4";
1249}
1250
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001251void Clang::AddX86TargetArgs(const ArgList &Args,
1252 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001253 if (!Args.hasFlag(options::OPT_mred_zone,
1254 options::OPT_mno_red_zone,
1255 true) ||
1256 Args.hasArg(options::OPT_mkernel) ||
1257 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001258 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001259
Bob Wilson2616e2e2013-02-10 16:01:41 +00001260 // Default to avoid implicit floating-point for kernel/kext code, but allow
1261 // that to be overridden with -mno-soft-float.
1262 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1263 Args.hasArg(options::OPT_fapple_kext));
1264 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1265 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001266 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001267 options::OPT_mno_implicit_float)) {
1268 const Option &O = A->getOption();
1269 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1270 O.matches(options::OPT_msoft_float));
1271 }
1272 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001273 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001274
Chandler Carruth953fb082013-01-13 11:46:33 +00001275 if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
Daniel Dunbara7d02312009-12-18 06:30:12 +00001276 CmdArgs.push_back("-target-cpu");
Daniel Dunbare13ada62009-11-14 22:04:54 +00001277 CmdArgs.push_back(CPUName);
1278 }
1279
Eli Friedmanad811f02011-07-02 00:34:19 +00001280 // The required algorithm here is slightly strange: the options are applied
1281 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1282 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1283 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1284 // former correctly, but not the latter; handle directly-overridden
1285 // attributes here.
1286 llvm::StringMap<unsigned> PrevFeature;
1287 std::vector<const char*> Features;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001288 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1289 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001290 StringRef Name = (*it)->getOption().getName();
Daniel Dunbara442fd52010-06-11 22:00:13 +00001291 (*it)->claim();
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001292
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001293 // Skip over "-m".
Michael J. Spencer929fccd2012-10-22 22:13:48 +00001294 assert(Name.startswith("m") && "Invalid feature name.");
1295 Name = Name.substr(1);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001296
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001297 bool IsNegative = Name.startswith("no-");
1298 if (IsNegative)
1299 Name = Name.substr(3);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001300
Eli Friedmanad811f02011-07-02 00:34:19 +00001301 unsigned& Prev = PrevFeature[Name];
1302 if (Prev)
1303 Features[Prev - 1] = 0;
1304 Prev = Features.size() + 1;
1305 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1306 }
1307 for (unsigned i = 0; i < Features.size(); i++) {
1308 if (Features[i]) {
1309 CmdArgs.push_back("-target-feature");
1310 CmdArgs.push_back(Features[i]);
1311 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001312 }
1313}
1314
Matthew Curtise8f80a12012-12-06 17:49:03 +00001315static inline bool HasPICArg(const ArgList &Args) {
1316 return Args.hasArg(options::OPT_fPIC)
1317 || Args.hasArg(options::OPT_fpic);
1318}
1319
1320static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1321 return Args.getLastArg(options::OPT_G,
1322 options::OPT_G_EQ,
1323 options::OPT_msmall_data_threshold_EQ);
1324}
1325
1326static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1327 std::string value;
1328 if (HasPICArg(Args))
1329 value = "0";
1330 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1331 value = A->getValue();
1332 A->claim();
1333 }
1334 return value;
1335}
1336
Tony Linthicum76329bf2011-12-12 21:14:55 +00001337void Clang::AddHexagonTargetArgs(const ArgList &Args,
1338 ArgStringList &CmdArgs) const {
1339 llvm::Triple Triple = getToolChain().getTriple();
1340
1341 CmdArgs.push_back("-target-cpu");
Matthew Curtisf10a5952012-12-06 14:16:43 +00001342 CmdArgs.push_back(Args.MakeArgString(
1343 "hexagon"
1344 + toolchains::Hexagon_TC::GetTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001345 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001346 CmdArgs.push_back("-mqdsp6-compat");
1347 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001348
Matthew Curtise8f80a12012-12-06 17:49:03 +00001349 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1350 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001351 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001352 CmdArgs.push_back(Args.MakeArgString(
1353 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001354 }
1355
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001356 if (!Args.hasArg(options::OPT_fno_short_enums))
1357 CmdArgs.push_back("-fshort-enums");
1358 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1359 CmdArgs.push_back ("-mllvm");
1360 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1361 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001362 CmdArgs.push_back ("-mllvm");
1363 CmdArgs.push_back ("-machine-sink-split=0");
1364}
1365
Eric Christopher84fbdb42011-08-19 00:30:14 +00001366static bool
John McCall5fb5df92012-06-20 06:18:46 +00001367shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001368 const llvm::Triple &Triple) {
1369 // We use the zero-cost exception tables for Objective-C if the non-fragile
1370 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1371 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001372 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001373 return true;
1374
Bob Wilson6524dd32011-10-14 05:03:44 +00001375 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001376 return false;
1377
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001378 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001379 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001380 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001381}
1382
Anders Carlssone96ab552011-02-28 02:27:16 +00001383/// addExceptionArgs - Adds exception related arguments to the driver command
1384/// arguments. There's a master flag, -fexceptions and also language specific
1385/// flags to enable/disable C++ and Objective-C exceptions.
1386/// This makes it possible to for example disable C++ exceptions but enable
1387/// Objective-C exceptions.
1388static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1389 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001390 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001391 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001392 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001393 if (KernelOrKext) {
1394 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1395 // arguments now to avoid warnings about unused arguments.
1396 Args.ClaimAllArgs(options::OPT_fexceptions);
1397 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1398 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1399 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1400 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1401 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001402 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001403 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001404
1405 // Exceptions are enabled by default.
1406 bool ExceptionsEnabled = true;
1407
1408 // This keeps track of whether exceptions were explicitly turned on or off.
1409 bool DidHaveExplicitExceptionFlag = false;
1410
Rafael Espindola00a66572009-10-01 13:33:33 +00001411 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1412 options::OPT_fno_exceptions)) {
1413 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001414 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001415 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001416 ExceptionsEnabled = false;
1417
1418 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001419 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001420
Anders Carlssone96ab552011-02-28 02:27:16 +00001421 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001422
Anders Carlssone96ab552011-02-28 02:27:16 +00001423 // Exception tables and cleanups can be enabled with -fexceptions even if the
1424 // language itself doesn't support exceptions.
1425 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1426 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001427
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001428 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1429 // is not necessarily sensible, but follows GCC.
1430 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001431 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001432 options::OPT_fno_objc_exceptions,
1433 true)) {
1434 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001435
Eric Christopher84fbdb42011-08-19 00:30:14 +00001436 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001437 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001438 }
1439
1440 if (types::isCXX(InputType)) {
1441 bool CXXExceptionsEnabled = ExceptionsEnabled;
1442
Eric Christopher84fbdb42011-08-19 00:30:14 +00001443 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1444 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001445 options::OPT_fexceptions,
1446 options::OPT_fno_exceptions)) {
1447 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1448 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001449 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001450 CXXExceptionsEnabled = false;
1451 }
1452
1453 if (CXXExceptionsEnabled) {
1454 CmdArgs.push_back("-fcxx-exceptions");
1455
1456 ShouldUseExceptionTables = true;
1457 }
1458 }
1459
1460 if (ShouldUseExceptionTables)
1461 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001462}
1463
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001464static bool ShouldDisableAutolink(const ArgList &Args,
1465 const ToolChain &TC) {
1466 bool Default = true;
1467 if (TC.getTriple().isOSDarwin()) {
1468 // The native darwin assembler doesn't support the linker_option directives,
1469 // so we disable them if we think the .s file will be passed to it.
1470 Default = TC.useIntegratedAs();
1471 }
1472 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1473 Default);
1474}
1475
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001476static bool ShouldDisableCFI(const ArgList &Args,
1477 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001478 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001479 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001480 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001481 // we disable them if we think the .s file will be passed to it.
Rafael Espindola84b588b2013-03-18 18:10:27 +00001482 Default = TC.useIntegratedAs();
Rafael Espindolaf934f982011-05-17 16:26:17 +00001483 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001484 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher45f2e712012-12-18 00:31:10 +00001485 options::OPT_fno_dwarf2_cfi_asm,
1486 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001487}
1488
Ted Kremenek62093662013-03-12 17:02:12 +00001489static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1490 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001491 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1492 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001493 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001494 return !UseDwarfDirectory;
1495}
1496
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001497/// \brief Check whether the given input tree contains any compilation actions.
1498static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001499 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001500 return true;
1501
1502 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1503 if (ContainsCompileAction(*it))
1504 return true;
1505
1506 return false;
1507}
1508
1509/// \brief Check if -relax-all should be passed to the internal assembler.
1510/// This is done by default when compiling non-assembler source with -O0.
1511static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1512 bool RelaxDefault = true;
1513
1514 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1515 RelaxDefault = A->getOption().matches(options::OPT_O0);
1516
1517 if (RelaxDefault) {
1518 RelaxDefault = false;
1519 for (ActionList::const_iterator it = C.getActions().begin(),
1520 ie = C.getActions().end(); it != ie; ++it) {
1521 if (ContainsCompileAction(*it)) {
1522 RelaxDefault = true;
1523 break;
1524 }
1525 }
1526 }
1527
1528 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1529 RelaxDefault);
1530}
1531
Peter Collingbourne54d770c2013-04-09 04:35:11 +00001532SanitizerArgs::SanitizerArgs(const ToolChain &TC, const ArgList &Args)
Alexey Samsonov29524a92013-01-20 13:12:12 +00001533 : Kind(0), BlacklistFile(""), MsanTrackOrigins(false),
1534 AsanZeroBaseShadow(false) {
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001535 unsigned AllKinds = 0; // All kinds of sanitizers that were turned on
1536 // at least once (possibly, disabled further).
Peter Collingbourne54d770c2013-04-09 04:35:11 +00001537 const Driver &D = TC.getDriver();
Richard Smith52be6192012-11-05 22:04:41 +00001538 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) {
Alexey Samsonov53f7e122012-11-28 17:34:24 +00001539 unsigned Add, Remove;
1540 if (!parse(D, Args, *I, Add, Remove, true))
Richard Smith52be6192012-11-05 22:04:41 +00001541 continue;
Richard Smith52be6192012-11-05 22:04:41 +00001542 (*I)->claim();
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001543 Kind |= Add;
1544 Kind &= ~Remove;
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001545 AllKinds |= Add;
Richard Smith52be6192012-11-05 22:04:41 +00001546 }
1547
Chad Rosierae229d52013-01-29 23:31:22 +00001548 UbsanTrapOnError =
1549 Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
1550 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1551 options::OPT_fno_sanitize_undefined_trap_on_error, false);
1552
1553 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) &&
1554 !Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1555 options::OPT_fno_sanitize_undefined_trap_on_error, true)) {
1556 D.Diag(diag::err_drv_argument_not_allowed_with)
1557 << "-fcatch-undefined-behavior"
1558 << "-fno-sanitize-undefined-trap-on-error";
1559 }
1560
1561 // Warn about undefined sanitizer options that require runtime support.
1562 if (UbsanTrapOnError && notAllowedWithTrap()) {
1563 if (Args.hasArg(options::OPT_fcatch_undefined_behavior))
1564 D.Diag(diag::err_drv_argument_not_allowed_with)
1565 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1566 << "-fcatch-undefined-behavior";
1567 else if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1568 options::OPT_fno_sanitize_undefined_trap_on_error,
1569 false))
1570 D.Diag(diag::err_drv_argument_not_allowed_with)
1571 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1572 << "-fsanitize-undefined-trap-on-error";
1573 }
1574
Richard Smith52be6192012-11-05 22:04:41 +00001575 // Only one runtime library can be used at once.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001576 bool NeedsAsan = needsAsanRt();
1577 bool NeedsTsan = needsTsanRt();
Evgeniy Stepanovcdc22552012-12-05 13:37:12 +00001578 bool NeedsMsan = needsMsanRt();
Richard Smith06d87f12012-12-01 01:02:45 +00001579 if (NeedsAsan && NeedsTsan)
Richard Smith52be6192012-11-05 22:04:41 +00001580 D.Diag(diag::err_drv_argument_not_allowed_with)
Richard Smith06d87f12012-12-01 01:02:45 +00001581 << lastArgumentForKind(D, Args, NeedsAsanRt)
1582 << lastArgumentForKind(D, Args, NeedsTsanRt);
Evgeniy Stepanovcdc22552012-12-05 13:37:12 +00001583 if (NeedsAsan && NeedsMsan)
1584 D.Diag(diag::err_drv_argument_not_allowed_with)
1585 << lastArgumentForKind(D, Args, NeedsAsanRt)
1586 << lastArgumentForKind(D, Args, NeedsMsanRt);
1587 if (NeedsTsan && NeedsMsan)
1588 D.Diag(diag::err_drv_argument_not_allowed_with)
1589 << lastArgumentForKind(D, Args, NeedsTsanRt)
1590 << lastArgumentForKind(D, Args, NeedsMsanRt);
Alexey Samsonov0e96bec2012-11-29 22:36:21 +00001591
1592 // If -fsanitize contains extra features of ASan, it should also
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001593 // explicitly contain -fsanitize=address (probably, turned off later in the
1594 // command line).
1595 if ((Kind & AddressFull) != 0 && (AllKinds & Address) == 0)
1596 D.Diag(diag::warn_drv_unused_sanitizer)
1597 << lastArgumentForKind(D, Args, AddressFull)
1598 << "-fsanitize=address";
Alexey Samsonov9ab73622012-12-03 19:12:58 +00001599
1600 // Parse -f(no-)sanitize-blacklist options.
1601 if (Arg *BLArg = Args.getLastArg(options::OPT_fsanitize_blacklist,
1602 options::OPT_fno_sanitize_blacklist)) {
1603 if (BLArg->getOption().matches(options::OPT_fsanitize_blacklist)) {
1604 std::string BLPath = BLArg->getValue();
1605 bool BLExists = false;
1606 if (!llvm::sys::fs::exists(BLPath, BLExists) && BLExists)
1607 BlacklistFile = BLPath;
1608 else
1609 D.Diag(diag::err_drv_no_such_file) << BLPath;
1610 }
Alexey Samsonovd26b3332013-02-19 11:25:29 +00001611 } else {
1612 // If no -fsanitize-blacklist option is specified, try to look up for
1613 // blacklist in the resource directory.
1614 std::string BLPath;
1615 bool BLExists = false;
1616 if (getDefaultBlacklistForKind(D, Kind, BLPath) &&
1617 !llvm::sys::fs::exists(BLPath, BLExists) && BLExists)
1618 BlacklistFile = BLPath;
Alexey Samsonov9ab73622012-12-03 19:12:58 +00001619 }
Evgeniy Stepanovad8ab3d2012-12-24 08:42:34 +00001620
1621 // Parse -f(no-)sanitize-memory-track-origins options.
Alexey Samsonov29524a92013-01-20 13:12:12 +00001622 if (NeedsMsan)
Evgeniy Stepanovad8ab3d2012-12-24 08:42:34 +00001623 MsanTrackOrigins =
1624 Args.hasFlag(options::OPT_fsanitize_memory_track_origins,
1625 options::OPT_fno_sanitize_memory_track_origins,
1626 /* Default */false);
Alexey Samsonov29524a92013-01-20 13:12:12 +00001627
1628 // Parse -f(no-)sanitize-address-zero-base-shadow options.
Alexey Samsonov7e434072013-04-09 07:27:44 +00001629 if (NeedsAsan) {
1630 bool IsAndroid = (TC.getTriple().getEnvironment() == llvm::Triple::Android);
1631 bool ZeroBaseShadowDefault = IsAndroid;
Alexey Samsonov29524a92013-01-20 13:12:12 +00001632 AsanZeroBaseShadow =
Alexey Samsonov7e434072013-04-09 07:27:44 +00001633 Args.hasFlag(options::OPT_fsanitize_address_zero_base_shadow,
1634 options::OPT_fno_sanitize_address_zero_base_shadow,
1635 ZeroBaseShadowDefault);
1636 // Zero-base shadow is a requirement on Android.
1637 if (IsAndroid && !AsanZeroBaseShadow) {
1638 D.Diag(diag::err_drv_argument_not_allowed_with)
1639 << "-fno-sanitize-address-zero-base-shadow"
1640 << lastArgumentForKind(D, Args, Address);
1641 }
1642 }
Richard Smith52be6192012-11-05 22:04:41 +00001643}
1644
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001645static void addSanitizerRTLinkFlagsLinux(
1646 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smithf3e624c2013-03-23 00:30:08 +00001647 const StringRef Sanitizer, bool BeforeLibStdCXX,
1648 bool ExportSymbols = true) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001649 // Sanitizer runtime is located in the Linux library directory and
1650 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1651 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1652 llvm::sys::path::append(
1653 LibSanitizer, "lib", "linux",
1654 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
Richard Smithcff3cde2013-03-20 23:49:07 +00001655
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001656 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1657 // etc.) so that the linker picks custom versions of the global 'operator
1658 // new' and 'operator delete' symbols. We take the extreme (but simple)
1659 // strategy of inserting it at the front of the link command. It also
1660 // needs to be forced to end up in the executable, so wrap it in
1661 // whole-archive.
Richard Smithcff3cde2013-03-20 23:49:07 +00001662 SmallVector<const char *, 3> LibSanitizerArgs;
1663 LibSanitizerArgs.push_back("-whole-archive");
1664 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
1665 LibSanitizerArgs.push_back("-no-whole-archive");
1666
1667 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1668 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1669
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001670 CmdArgs.push_back("-lpthread");
1671 CmdArgs.push_back("-ldl");
Richard Smithf3e624c2013-03-23 00:30:08 +00001672
1673 // If possible, use a dynamic symbols file to export the symbols from the
1674 // runtime library. If we can't do so, use -export-dynamic instead to export
1675 // all symbols from the binary.
1676 if (ExportSymbols) {
1677 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1678 CmdArgs.push_back(
1679 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1680 else
1681 CmdArgs.push_back("-export-dynamic");
1682 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001683}
1684
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001685/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1686/// This needs to be called before we add the C run-time (malloc, etc).
1687static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001688 ArgStringList &CmdArgs) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001689 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001690 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1691 llvm::sys::path::append(LibAsan, "lib", "linux",
1692 (Twine("libclang_rt.asan-") +
1693 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay35439df2012-12-04 21:18:26 +00001694 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001695 } else {
1696 if (!Args.hasArg(options::OPT_shared)) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001697 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001698 }
1699 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001700}
1701
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001702/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1703/// This needs to be called before we add the C run-time (malloc, etc).
1704static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1705 ArgStringList &CmdArgs) {
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001706 if (!Args.hasArg(options::OPT_shared)) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001707 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001708 }
1709}
1710
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001711/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1712/// This needs to be called before we add the C run-time (malloc, etc).
1713static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1714 ArgStringList &CmdArgs) {
1715 if (!Args.hasArg(options::OPT_shared)) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001716 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001717 }
1718}
1719
Richard Smithe30752c2012-10-09 19:52:38 +00001720/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1721/// (Linux).
1722static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
Richard Smithcff3cde2013-03-20 23:49:07 +00001723 ArgStringList &CmdArgs, bool IsCXX,
1724 bool HasOtherSanitizerRt) {
1725 if (Args.hasArg(options::OPT_shared))
1726 return;
1727
1728 // Need a copy of sanitizer_common. This could come from another sanitizer
1729 // runtime; if we're not including one, include our own copy.
1730 if (!HasOtherSanitizerRt)
Richard Smithf3e624c2013-03-23 00:30:08 +00001731 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
Richard Smithcff3cde2013-03-20 23:49:07 +00001732
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001733 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
Richard Smithcff3cde2013-03-20 23:49:07 +00001734
1735 // Only include the bits of the runtime which need a C++ ABI library if
1736 // we're linking in C++ mode.
1737 if (IsCXX)
1738 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smithe30752c2012-10-09 19:52:38 +00001739}
1740
Rafael Espindola224dd632011-12-14 21:02:23 +00001741static bool shouldUseFramePointer(const ArgList &Args,
1742 const llvm::Triple &Triple) {
1743 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1744 options::OPT_fomit_frame_pointer))
1745 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1746
Rafael Espindola00b29182011-12-14 21:50:24 +00001747 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001748 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1749 Triple.getArch() == llvm::Triple::x86) &&
1750 Triple.getOS() == llvm::Triple::Linux) {
1751 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1752 if (!A->getOption().matches(options::OPT_O0))
1753 return false;
1754 }
1755
1756 return true;
1757}
1758
Eric Christopherb7d97e92013-04-03 01:58:53 +00001759static bool shouldUseLeafFramePointer(const ArgList &Args,
1760 const llvm::Triple &Triple) {
1761 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1762 options::OPT_momit_leaf_frame_pointer))
1763 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1764
1765 // Don't use a leaf frame pointer on linux x86 and x86_64 if optimizing.
1766 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1767 Triple.getArch() == llvm::Triple::x86) &&
1768 Triple.getOS() == llvm::Triple::Linux) {
1769 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1770 if (!A->getOption().matches(options::OPT_O0))
1771 return false;
1772 }
1773
1774 return true;
1775}
1776
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001777/// If the PWD environment variable is set, add a CC1 option to specify the
1778/// debug compilation directory.
1779static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00001780 struct stat StatPWDBuf, StatDotBuf;
1781
Benjamin Kramer85f5aa12013-04-27 08:42:33 +00001782 const char *pwd = ::getenv("PWD");
1783 if (!pwd)
1784 return;
1785
1786 if (llvm::sys::path::is_absolute(pwd) &&
Chad Rosiera35d5a32013-04-26 20:49:50 +00001787 stat(pwd, &StatPWDBuf) == 0 &&
1788 stat(".", &StatDotBuf) == 0 &&
1789 StatPWDBuf.st_ino == StatDotBuf.st_ino &&
1790 StatPWDBuf.st_dev == StatDotBuf.st_dev) {
1791 CmdArgs.push_back("-fdebug-compilation-dir");
1792 CmdArgs.push_back(Args.MakeArgString(pwd));
1793 return;
1794 }
Benjamin Kramer698d7c82013-04-27 08:12:29 +00001795
Chad Rosiera35d5a32013-04-26 20:49:50 +00001796 // Fall back to using getcwd.
Benjamin Kramer698d7c82013-04-27 08:12:29 +00001797 SmallString<128> cwd;
1798 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00001799 CmdArgs.push_back("-fdebug-compilation-dir");
1800 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001801 }
1802}
1803
Eric Christopherd3804002013-02-22 20:12:52 +00001804static const char *SplitDebugName(const ArgList &Args,
1805 const InputInfoList &Inputs) {
1806 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1807 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1808 SmallString<128> T(FinalOutput->getValue());
1809 llvm::sys::path::replace_extension(T, "dwo");
1810 return Args.MakeArgString(T);
1811 } else {
1812 // Use the compilation dir.
1813 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1814 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1815 llvm::sys::path::replace_extension(F, "dwo");
1816 T += F;
1817 return Args.MakeArgString(F);
1818 }
1819}
1820
1821static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1822 const Tool &T, const JobAction &JA,
1823 const ArgList &Args, const InputInfo &Output,
1824 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00001825 ArgStringList ExtractArgs;
1826 ExtractArgs.push_back("--extract-dwo");
1827
1828 ArgStringList StripArgs;
1829 StripArgs.push_back("--strip-dwo");
1830
1831 // Grabbing the output of the earlier compile step.
1832 StripArgs.push_back(Output.getFilename());
1833 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00001834 ExtractArgs.push_back(OutFile);
1835
1836 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00001837 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00001838
1839 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00001840 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001841
1842 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00001843 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001844}
1845
Chad Rosierb71f6aa2013-04-24 18:09:54 +00001846static bool isOptimizationLevelFast(const ArgList &Args) {
1847 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1848 if (A->getOption().matches(options::OPT_Ofast))
1849 return true;
1850 return false;
1851}
1852
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001853void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001854 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001855 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001856 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001857 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001858 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1859 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001860 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001861 ArgStringList CmdArgs;
1862
Daniel Dunbare521a892009-03-31 20:53:55 +00001863 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1864
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001865 // Invoke ourselves in -cc1 mode.
1866 //
1867 // FIXME: Implement custom jobs for internal actions.
1868 CmdArgs.push_back("-cc1");
1869
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001870 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001871 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001872 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001873 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001874
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001875 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001876 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001877
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001878 if (isa<AnalyzeJobAction>(JA)) {
1879 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1880 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001881 } else if (isa<MigrateJobAction>(JA)) {
1882 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001883 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001884 if (Output.getType() == types::TY_Dependencies)
1885 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00001886 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001887 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00001888 if (Args.hasArg(options::OPT_rewrite_objc) &&
1889 !Args.hasArg(options::OPT_g_Group))
1890 CmdArgs.push_back("-P");
1891 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00001892 } else if (isa<AssembleJobAction>(JA)) {
1893 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001894
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001895 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001896 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001897
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001898 // When using an integrated assembler, translate -Wa, and -Xassembler
1899 // options.
1900 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1901 options::OPT_Xassembler),
1902 ie = Args.filtered_end(); it != ie; ++it) {
1903 const Arg *A = *it;
1904 A->claim();
1905
1906 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001907 StringRef Value = A->getValue(i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001908
1909 if (Value == "-force_cpusubtype_ALL") {
1910 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001911 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001912 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001913 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001914 CmdArgs.push_back("-mllvm");
1915 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001916 } else if (Value == "--noexecstack") {
1917 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001918 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001919 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001920 << A->getOption().getName() << Value;
1921 }
1922 }
1923 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001924
1925 // Also ignore explicit -force_cpusubtype_ALL option.
1926 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001927 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001928 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001929 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001930
Aaron Ballman1f10cc52012-07-31 01:21:00 +00001931 if (JA.getType() == types::TY_Nothing)
1932 CmdArgs.push_back("-fsyntax-only");
1933 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001934 CmdArgs.push_back("-emit-pch");
1935 else
1936 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001937 } else {
1938 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001939
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001940 if (JA.getType() == types::TY_Nothing) {
1941 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001942 } else if (JA.getType() == types::TY_LLVM_IR ||
1943 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001944 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001945 } else if (JA.getType() == types::TY_LLVM_BC ||
1946 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001947 CmdArgs.push_back("-emit-llvm-bc");
1948 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00001949 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00001950 } else if (JA.getType() == types::TY_AST) {
1951 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00001952 } else if (JA.getType() == types::TY_ModuleFile) {
1953 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001954 } else if (JA.getType() == types::TY_RewrittenObjC) {
1955 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001956 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00001957 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1958 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001959 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001960 } else {
1961 assert(JA.getType() == types::TY_PP_Asm &&
1962 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001963 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00001964 }
1965
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001966 // The make clang go fast button.
1967 CmdArgs.push_back("-disable-free");
1968
John McCallbb79b5f2010-02-13 03:50:24 +00001969 // Disable the verification pass in -asserts builds.
1970#ifdef NDEBUG
1971 CmdArgs.push_back("-disable-llvm-verifier");
1972#endif
1973
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001974 // Set the main file name, so that debug info works even with
1975 // -save-temps.
1976 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00001977 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001978
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001979 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00001980 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001981 if (Args.hasArg(options::OPT_static))
1982 CmdArgs.push_back("-static-define");
1983
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001984 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00001985 // Enable region store model by default.
1986 CmdArgs.push_back("-analyzer-store=region");
1987
Ted Kremenek7bea9a12009-12-07 22:26:14 +00001988 // Treat blocks as analysis entry points.
1989 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1990
Ted Kremenek49c79792011-03-24 00:28:47 +00001991 CmdArgs.push_back("-analyzer-eagerly-assume");
1992
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001993 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001994 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001995 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00001996
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001997 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1998 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00001999
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002000 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002001 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002002
2003 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002004
Jordan Rose10ad0812013-04-05 17:55:07 +00002005 if (types::isCXX(Inputs[0].getType()))
2006 CmdArgs.push_back("-analyzer-checker=cplusplus");
2007
Ted Kremenek37e96522012-01-26 02:27:38 +00002008 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00002009 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2010 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2011 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2012 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2013 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2014 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002015 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002016
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002017 // Set the output format. The default is plist, for (lame) historical
2018 // reasons.
2019 CmdArgs.push_back("-analyzer-output");
2020 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002021 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002022 else
2023 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002024
Ted Kremenekfe449a22010-03-22 22:32:05 +00002025 // Disable the presentation of standard compiler warnings when
2026 // using --analyze. We only want to show static analyzer diagnostics
2027 // or frontend errors.
2028 CmdArgs.push_back("-w");
2029
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002030 // Add -Xanalyzer arguments when running as analyzer.
2031 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002032 }
2033
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002034 CheckCodeGenerationOptions(D, Args);
2035
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002036 bool PIE = getToolChain().isPIEDefault();
2037 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002038 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002039
Alexey Samsonov090301e2013-04-09 12:28:19 +00002040 // For the PIC and PIE flag options, this logic is different from the
2041 // legacy logic in very old versions of GCC, as that logic was just
2042 // a bug no one had ever fixed. This logic is both more rational and
2043 // consistent with GCC's new logic now that the bugs are fixed. The last
2044 // argument relating to either PIC or PIE wins, and no other argument is
2045 // used. If the last argument is any flavor of the '-fno-...' arguments,
2046 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2047 // at the same level.
2048 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2049 options::OPT_fpic, options::OPT_fno_pic,
2050 options::OPT_fPIE, options::OPT_fno_PIE,
2051 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002052 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2053 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002054 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002055 if (LastPICArg) {
2056 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002057 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2058 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2059 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2060 PIC = PIE || O.matches(options::OPT_fPIC) ||
2061 O.matches(options::OPT_fpic);
2062 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2063 O.matches(options::OPT_fPIC);
2064 } else {
2065 PIE = PIC = false;
2066 }
2067 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002068 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002069
2070 // Inroduce a Darwin-specific hack. If the default is PIC but the flags
2071 // specified while enabling PIC enabled level 1 PIC, just force it back to
2072 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2073 // informal testing).
2074 if (PIC && getToolChain().getTriple().isOSDarwin())
2075 IsPICLevelTwo |= getToolChain().isPICDefault();
2076
Chandler Carruthc0c04552012-04-08 16:40:35 +00002077 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2078 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002079 llvm::Triple Triple(TripleStr);
Eric Christopher8d56caa2013-02-18 01:16:37 +00002080 if (KernelOrKext &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002081 (Triple.getOS() != llvm::Triple::IOS ||
2082 Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002083 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002084 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002085 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002086
Chandler Carruth76a943b2012-11-19 03:52:03 +00002087 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2088 // This is a very special mode. It trumps the other modes, almost no one
2089 // uses it, and it isn't even valid on any OS but Darwin.
2090 if (!getToolChain().getTriple().isOSDarwin())
2091 D.Diag(diag::err_drv_unsupported_opt_for_target)
2092 << A->getSpelling() << getToolChain().getTriple().str();
2093
2094 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2095
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002096 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002097 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002098
Chandler Carruth76a943b2012-11-19 03:52:03 +00002099 // Only a forced PIC mode can cause the actual compile to have PIC defines
2100 // etc., no flags are sufficient. This behavior was selected to closely
2101 // match that of llvm-gcc and Apple GCC before that.
2102 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2103 CmdArgs.push_back("-pic-level");
2104 CmdArgs.push_back("2");
2105 }
2106 } else {
2107 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2108 // handled in Clang's IRGen by the -pie-level flag.
2109 CmdArgs.push_back("-mrelocation-model");
2110 CmdArgs.push_back(PIC ? "pic" : "static");
2111
2112 if (PIC) {
2113 CmdArgs.push_back("-pic-level");
2114 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2115 if (PIE) {
2116 CmdArgs.push_back("-pie-level");
2117 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2118 }
2119 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002120 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002121
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002122 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2123 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002124 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002125
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002126 // LLVM Code Generator Options.
2127
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002128 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2129 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002130 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002131 }
2132
Roman Divacky65b88cd2011-03-01 17:40:53 +00002133 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2134 CmdArgs.push_back("-mrtd");
2135
Rafael Espindola224dd632011-12-14 21:02:23 +00002136 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002137 CmdArgs.push_back("-mdisable-fp-elim");
2138 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2139 options::OPT_fno_zero_initialized_in_bss))
2140 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002141
2142 bool OFastEnabled = isOptimizationLevelFast(Args);
2143 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2144 // enabled. This alias option is being used to simplify the hasFlag logic.
2145 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2146 options::OPT_fstrict_aliasing;
2147 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00002148 options::OPT_fno_strict_aliasing,
2149 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00002150 CmdArgs.push_back("-relaxed-aliasing");
Manman Renc451e572013-04-04 21:53:22 +00002151 if (Args.hasArg(options::OPT_fstruct_path_tbaa))
2152 CmdArgs.push_back("-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002153 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2154 false))
2155 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002156 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2157 options::OPT_fno_optimize_sibling_calls))
2158 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002159
Eric Christopher006208c2013-04-04 06:29:47 +00002160 // Handle segmented stacks.
2161 if (Args.hasArg(options::OPT_fsplit_stack))
2162 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002163
2164 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2165 // This alias option is being used to simplify the getLastArg logic.
2166 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2167 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002168
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002169 // Handle various floating point optimization flags, mapping them to the
2170 // appropriate LLVM code generation flags. The pattern for all of these is to
2171 // default off the codegen optimizations, and if any flag enables them and no
2172 // flag disables them after the flag enabling them, enable the codegen
2173 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002174 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002175 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002176 options::OPT_ffinite_math_only,
2177 options::OPT_fno_finite_math_only,
2178 options::OPT_fhonor_infinities,
2179 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002180 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2181 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002182 A->getOption().getID() != options::OPT_fhonor_infinities)
2183 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002184 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002185 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002186 options::OPT_ffinite_math_only,
2187 options::OPT_fno_finite_math_only,
2188 options::OPT_fhonor_nans,
2189 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002190 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2191 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002192 A->getOption().getID() != options::OPT_fhonor_nans)
2193 CmdArgs.push_back("-menable-no-nans");
2194
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002195 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2196 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002197 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002198 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002199 options::OPT_fmath_errno,
Chandler Carruth3634c662012-04-26 02:10:51 +00002200 options::OPT_fno_math_errno))
2201 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
2202 if (MathErrno)
2203 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002204
2205 // There are several flags which require disabling very specific
2206 // optimizations. Any of these being disabled forces us to turn off the
2207 // entire set of LLVM optimizations, so collect them through all the flag
2208 // madness.
2209 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002210 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002211 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002212 options::OPT_funsafe_math_optimizations,
2213 options::OPT_fno_unsafe_math_optimizations,
2214 options::OPT_fassociative_math,
2215 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002216 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2217 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002218 A->getOption().getID() != options::OPT_fno_associative_math)
2219 AssociativeMath = true;
2220 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002221 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002222 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002223 options::OPT_funsafe_math_optimizations,
2224 options::OPT_fno_unsafe_math_optimizations,
2225 options::OPT_freciprocal_math,
2226 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002227 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2228 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002229 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2230 ReciprocalMath = true;
2231 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002232 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002233 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002234 options::OPT_funsafe_math_optimizations,
2235 options::OPT_fno_unsafe_math_optimizations,
2236 options::OPT_fsigned_zeros,
2237 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002238 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2239 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002240 A->getOption().getID() != options::OPT_fsigned_zeros)
2241 SignedZeros = false;
2242 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002243 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002244 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002245 options::OPT_funsafe_math_optimizations,
2246 options::OPT_fno_unsafe_math_optimizations,
2247 options::OPT_ftrapping_math,
2248 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002249 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2250 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002251 A->getOption().getID() != options::OPT_ftrapping_math)
2252 TrappingMath = false;
2253 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2254 !TrappingMath)
2255 CmdArgs.push_back("-menable-unsafe-fp-math");
2256
Lang Hamesaa53b932012-07-06 00:59:19 +00002257
2258 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002259 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002260 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002261 options::OPT_ffp_contract)) {
2262 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002263 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002264 if (Val == "fast" || Val == "on" || Val == "off") {
2265 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2266 } else {
2267 D.Diag(diag::err_drv_unsupported_option_argument)
2268 << A->getOption().getName() << Val;
2269 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002270 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2271 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002272 // If fast-math is set then set the fp-contract mode to fast.
2273 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2274 }
2275 }
2276
Bob Wilson6a039162012-07-19 03:52:53 +00002277 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2278 // and if we find them, tell the frontend to provide the appropriate
2279 // preprocessor macros. This is distinct from enabling any optimizations as
2280 // these options induce language changes which must survive serialization
2281 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002282 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2283 options::OPT_fno_fast_math))
2284 if (!A->getOption().matches(options::OPT_fno_fast_math))
2285 CmdArgs.push_back("-ffast-math");
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002286 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2287 if (A->getOption().matches(options::OPT_ffinite_math_only))
2288 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002289
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002290 // Decide whether to use verbose asm. Verbose assembly is the default on
2291 // toolchains which have the integrated assembler on by default.
2292 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2293 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002294 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002295 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002296 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002297
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002298 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2299 CmdArgs.push_back("-mdebug-pass");
2300 CmdArgs.push_back("Structure");
2301 }
2302 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2303 CmdArgs.push_back("-mdebug-pass");
2304 CmdArgs.push_back("Arguments");
2305 }
2306
John McCall8517abc2010-02-19 02:45:38 +00002307 // Enable -mconstructor-aliases except on darwin, where we have to
2308 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002309 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002310 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002311
John McCall7ef5cb32011-03-18 02:56:14 +00002312 // Darwin's kernel doesn't support guard variables; just die if we
2313 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002314 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002315 CmdArgs.push_back("-fforbid-guard-variables");
2316
Douglas Gregordbe39272011-02-01 15:15:22 +00002317 if (Args.hasArg(options::OPT_mms_bitfields)) {
2318 CmdArgs.push_back("-mms-bitfields");
2319 }
John McCall8517abc2010-02-19 02:45:38 +00002320
Daniel Dunbar306945d2009-09-16 06:17:29 +00002321 // This is a coarse approximation of what llvm-gcc actually does, both
2322 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2323 // complicated ways.
2324 bool AsynchronousUnwindTables =
2325 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2326 options::OPT_fno_asynchronous_unwind_tables,
2327 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002328 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002329 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2330 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002331 CmdArgs.push_back("-munwind-tables");
2332
Chandler Carruth05fb5852012-11-21 23:40:23 +00002333 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002334
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002335 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2336 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002337 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002338 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002339
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002340 // FIXME: Handle -mtune=.
2341 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002342
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002343 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002344 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002345 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002346 }
2347
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002348 // Add target specific cpu and features flags.
2349 switch(getToolChain().getTriple().getArch()) {
2350 default:
2351 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002352
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002353 case llvm::Triple::arm:
2354 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002355 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002356 break;
2357
Eric Christopher0b26a612010-03-02 02:41:08 +00002358 case llvm::Triple::mips:
2359 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002360 case llvm::Triple::mips64:
2361 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002362 AddMIPSTargetArgs(Args, CmdArgs);
2363 break;
2364
Hal Finkel8eb59282012-06-11 22:35:19 +00002365 case llvm::Triple::ppc:
2366 case llvm::Triple::ppc64:
2367 AddPPCTargetArgs(Args, CmdArgs);
2368 break;
2369
Tom Stellard6674c702013-04-01 20:56:53 +00002370 case llvm::Triple::r600:
2371 AddR600TargetArgs(Args, CmdArgs);
2372 break;
2373
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002374 case llvm::Triple::sparc:
2375 AddSparcTargetArgs(Args, CmdArgs);
2376 break;
2377
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002378 case llvm::Triple::x86:
2379 case llvm::Triple::x86_64:
2380 AddX86TargetArgs(Args, CmdArgs);
2381 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002382
2383 case llvm::Triple::hexagon:
2384 AddHexagonTargetArgs(Args, CmdArgs);
2385 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002386 }
2387
Tony Linthicum76329bf2011-12-12 21:14:55 +00002388
2389
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002390 // Pass the linker version in use.
2391 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2392 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002393 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002394 }
2395
Eric Christopherb7d97e92013-04-03 01:58:53 +00002396 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002397 CmdArgs.push_back("-momit-leaf-frame-pointer");
2398
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002399 // Explicitly error on some things we know we don't support and can't just
2400 // ignore.
2401 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002402 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2403 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002404 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002405 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002406 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002407 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2408 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002409 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002410 << Unsupported->getOption().getName();
2411 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002412 }
2413
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002414 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002415 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002416 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002417 CmdArgs.push_back("-header-include-file");
2418 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2419 D.CCPrintHeadersFilename : "-");
2420 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002421 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002422 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002423
Chad Rosierbe10f982011-08-02 17:58:04 +00002424 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002425 CmdArgs.push_back("-diagnostic-log-file");
2426 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2427 D.CCLogDiagnosticsFilename : "-");
2428 }
2429
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002430 // Use the last option from "-g" group. "-gline-tables-only"
2431 // is preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002432 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002433 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002434 if (A->getOption().matches(options::OPT_gline_tables_only))
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002435 CmdArgs.push_back("-gline-tables-only");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002436 else if (!A->getOption().matches(options::OPT_g0) &&
2437 !A->getOption().matches(options::OPT_ggdb0))
Chad Rosier8fe3b112011-11-07 19:52:29 +00002438 CmdArgs.push_back("-g");
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002439 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002440
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002441 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2442 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002443 if (Args.hasArg(options::OPT_gcolumn_info))
2444 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002445
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002446 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2447 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00002448 // FIXME: Currently only works on Linux.
2449 if (getToolChain().getTriple().getOS() == llvm::Triple::Linux &&
2450 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002451 CmdArgs.push_back("-g");
2452 CmdArgs.push_back("-backend-option");
2453 CmdArgs.push_back("-split-dwarf=Enable");
2454 }
2455
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002456 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2457 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2458
Chris Lattner3c77a352010-06-22 00:03:40 +00002459 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2460
Nick Lewycky207bce32011-04-21 23:44:07 +00002461 if (Args.hasArg(options::OPT_ftest_coverage) ||
2462 Args.hasArg(options::OPT_coverage))
2463 CmdArgs.push_back("-femit-coverage-notes");
2464 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2465 Args.hasArg(options::OPT_coverage))
2466 CmdArgs.push_back("-femit-coverage-data");
2467
Nick Lewycky480cb992011-05-04 20:46:58 +00002468 if (C.getArgs().hasArg(options::OPT_c) ||
2469 C.getArgs().hasArg(options::OPT_S)) {
2470 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002471 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00002472 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00002473 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
2474 if (const char *pwd = ::getenv("PWD")) {
2475 if (llvm::sys::path::is_absolute(pwd)) {
2476 SmallString<128> Pwd(pwd);
2477 llvm::sys::path::append(Pwd, CoverageFilename.str());
2478 CoverageFilename.swap(Pwd);
2479 }
2480 }
2481 }
Eric Christophere30f61c2013-02-22 00:24:40 +00002482 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002483 }
2484 }
2485
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002486 // Pass options for controlling the default header search paths.
2487 if (Args.hasArg(options::OPT_nostdinc)) {
2488 CmdArgs.push_back("-nostdsysteminc");
2489 CmdArgs.push_back("-nobuiltininc");
2490 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002491 if (Args.hasArg(options::OPT_nostdlibinc))
2492 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002493 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2494 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2495 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002496
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002497 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002498 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002499 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002500
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002501 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2502
Ted Kremenekf7639e12012-03-06 20:06:33 +00002503 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002504 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002505 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002506 options::OPT_ccc_arcmt_modify,
2507 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002508 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002509 switch (A->getOption().getID()) {
2510 default:
2511 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002512 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002513 CmdArgs.push_back("-arcmt-check");
2514 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002515 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002516 CmdArgs.push_back("-arcmt-modify");
2517 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002518 case options::OPT_ccc_arcmt_migrate:
2519 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002520 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002521 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002522
2523 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2524 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002525 break;
John McCalld70fb982011-06-15 23:25:17 +00002526 }
2527 }
2528 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002529
Ted Kremenekf7639e12012-03-06 20:06:33 +00002530 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2531 if (ARCMTEnabled) {
2532 D.Diag(diag::err_drv_argument_not_allowed_with)
2533 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2534 }
2535 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002536 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002537
2538 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2539 options::OPT_objcmt_migrate_subscripting)) {
2540 // None specified, means enable them all.
2541 CmdArgs.push_back("-objcmt-migrate-literals");
2542 CmdArgs.push_back("-objcmt-migrate-subscripting");
2543 } else {
2544 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2545 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2546 }
2547 }
2548
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002549 // Add preprocessing options like -I, -D, etc. if we are using the
2550 // preprocessor.
2551 //
2552 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002553 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00002554 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002555
Rafael Espindolaa7431922011-07-21 23:40:37 +00002556 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2557 // that "The compiler can only warn and ignore the option if not recognized".
2558 // When building with ccache, it will pass -D options to clang even on
2559 // preprocessed inputs and configure concludes that -fPIC is not supported.
2560 Args.ClaimAllArgs(options::OPT_D);
2561
Daniel Dunbar58f78332009-09-17 06:53:36 +00002562 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002563 // others.
2564 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002565 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002566 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002567 else if (A->getOption().matches(options::OPT_O) &&
Richard Smithbd55daf2012-11-01 04:30:05 +00002568 A->getValue()[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002569 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002570 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002571 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002572 }
2573
Chad Rosier86b82082012-12-12 20:06:31 +00002574 // Don't warn about unused -flto. This can happen when we're preprocessing or
2575 // precompiling.
2576 Args.ClaimAllArgs(options::OPT_flto);
2577
Daniel Dunbar945577c2009-10-29 02:24:45 +00002578 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002579 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2580 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002581 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002582 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002583
2584 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2585 // (-ansi is equivalent to -std=c89).
2586 //
2587 // If a std is supplied, only add -trigraphs if it follows the
2588 // option.
2589 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2590 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002591 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002592 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002593 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002594 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002595 else
2596 Std->render(Args, CmdArgs);
2597
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002598 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2599 options::OPT_trigraphs))
2600 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002601 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002602 } else {
2603 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002604 //
2605 // FIXME: Clang doesn't correctly handle -std= when the input language
2606 // doesn't match. For the time being just ignore this for C++ inputs;
2607 // eventually we want to do all the standard defaulting here instead of
2608 // splitting it between the driver and clang -cc1.
2609 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002610 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2611 "-std=", /*Joined=*/true);
2612 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2613 CmdArgs.push_back("-std=c++11");
2614
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002615 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002616 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002617
Chandler Carruthb009b142011-04-23 06:30:43 +00002618 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2619 // '-fconst-strings'; this better indicates its actual behavior.
2620 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2621 false)) {
2622 // For perfect compatibility with GCC, we do this even in the presence of
2623 // '-w'. This flag names something other than a warning for GCC.
2624 CmdArgs.push_back("-fconst-strings");
2625 }
2626
Chandler Carruth61fbf622011-04-23 09:27:53 +00002627 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002628 // during C++ compilation, which it is by default. GCC keeps this define even
2629 // in the presence of '-w', match this behavior bug-for-bug.
2630 if (types::isCXX(InputType) &&
2631 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2632 true)) {
2633 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002634 }
2635
Chandler Carruthe0391482010-05-22 02:21:53 +00002636 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2637 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2638 if (Asm->getOption().matches(options::OPT_fasm))
2639 CmdArgs.push_back("-fgnu-keywords");
2640 else
2641 CmdArgs.push_back("-fno-gnu-keywords");
2642 }
2643
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002644 if (ShouldDisableCFI(Args, getToolChain()))
2645 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002646
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002647 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2648 CmdArgs.push_back("-fno-dwarf-directory-asm");
2649
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002650 if (ShouldDisableAutolink(Args, getToolChain()))
2651 CmdArgs.push_back("-fno-autolink");
2652
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002653 // Add in -fdebug-compilation-dir if necessary.
2654 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00002655
Richard Smith9a568822011-11-21 19:36:32 +00002656 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2657 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002658 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002659 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002660 }
2661
Richard Smith9a568822011-11-21 19:36:32 +00002662 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2663 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002664 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00002665 }
2666
Richard Smithb3a14522013-02-22 01:59:51 +00002667 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2668 CmdArgs.push_back("-fbracket-depth");
2669 CmdArgs.push_back(A->getValue());
2670 }
2671
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002672 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2673 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002674 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002675 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002676 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2677 } else
2678 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002679 }
2680
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002681
Michael J. Spencer929fccd2012-10-22 22:13:48 +00002682 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002683 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002684
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002685 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2686 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00002687 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002688 }
David Chisnall5778fce2009-08-31 16:41:57 +00002689
Chris Lattnere23003d2010-01-09 21:54:33 +00002690 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2691 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00002692 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00002693 }
2694
Chris Lattnerb35583d2010-04-07 20:49:23 +00002695 CmdArgs.push_back("-ferror-limit");
2696 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00002697 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00002698 else
2699 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002700
Chandler Carrutha77a7272010-05-06 04:55:18 +00002701 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2702 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002703 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002704 }
2705
2706 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2707 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002708 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002709 }
2710
Richard Smithf6f003a2011-12-16 19:06:07 +00002711 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2712 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002713 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00002714 }
2715
Daniel Dunbar2c978472009-11-04 06:24:47 +00002716 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002717 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002718 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002719 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00002720 } else {
2721 // If -fmessage-length=N was not specified, determine whether this is a
2722 // terminal and, if so, implicitly define -fmessage-length appropriately.
2723 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002724 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002725 }
2726
John McCallb4a99d32013-02-19 01:57:35 +00002727 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2728 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2729 options::OPT_fvisibility_ms_compat)) {
2730 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2731 CmdArgs.push_back("-fvisibility");
2732 CmdArgs.push_back(A->getValue());
2733 } else {
2734 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2735 CmdArgs.push_back("-fvisibility");
2736 CmdArgs.push_back("hidden");
2737 CmdArgs.push_back("-ftype-visibility");
2738 CmdArgs.push_back("default");
2739 }
Daniel Dunbare357d562009-12-03 18:42:11 +00002740 }
2741
Douglas Gregor08329632010-06-15 17:05:35 +00002742 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002743
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002744 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2745
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002746 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002747 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2748 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002749 CmdArgs.push_back("-ffreestanding");
2750
Daniel Dunbare357d562009-12-03 18:42:11 +00002751 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002752 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002753 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002754 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002755 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002756 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002757 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002758 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2759 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002760
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002761 SanitizerArgs Sanitize(getToolChain(), Args);
Richard Smith52be6192012-11-05 22:04:41 +00002762 Sanitize.addArgs(Args, CmdArgs);
2763
Will Dietz3676d562012-12-30 20:53:28 +00002764 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2765 options::OPT_fno_sanitize_recover,
2766 true))
2767 CmdArgs.push_back("-fno-sanitize-recover");
2768
Chad Rosierae229d52013-01-29 23:31:22 +00002769 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2770 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2771 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2772 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2773
Eric Christopher459d2712013-02-19 06:16:53 +00002774 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00002775 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2776 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2777 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2778 D.Diag(diag::err_drv_argument_only_allowed_with)
2779 << A->getAsString(Args) << "ppc/ppc64";
2780
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002781 if (getToolChain().SupportsProfiling())
2782 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002783
2784 // -flax-vector-conversions is default.
2785 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2786 options::OPT_fno_lax_vector_conversions))
2787 CmdArgs.push_back("-fno-lax-vector-conversions");
2788
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002789 if (Args.getLastArg(options::OPT_fapple_kext))
2790 CmdArgs.push_back("-fapple-kext");
2791
David Blaikie690f21e2012-06-14 18:55:27 +00002792 if (Args.hasFlag(options::OPT_frewrite_includes,
2793 options::OPT_fno_rewrite_includes, false))
2794 CmdArgs.push_back("-frewrite-includes");
2795
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002796 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002797 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002798 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002799 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2800 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002801
2802 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2803 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00002804 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00002805 }
2806
Bob Wilson14adb362012-02-03 06:27:22 +00002807 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002808
Chandler Carruth6e501032011-03-27 00:04:55 +00002809 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2810 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2811 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2812 options::OPT_fno_wrapv)) {
2813 if (A->getOption().matches(options::OPT_fwrapv))
2814 CmdArgs.push_back("-fwrapv");
2815 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2816 options::OPT_fno_strict_overflow)) {
2817 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2818 CmdArgs.push_back("-fwrapv");
2819 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002820 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002821 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002822
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002823 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2824
Mahesha S6a682be42012-10-27 07:47:56 +00002825
Daniel Dunbar4930e332009-11-17 08:07:36 +00002826 // -stack-protector=0 is default.
2827 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002828 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2829 options::OPT_fstack_protector_all,
2830 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002831 if (A->getOption().matches(options::OPT_fstack_protector))
2832 StackProtectorLevel = 1;
2833 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2834 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002835 } else {
2836 StackProtectorLevel =
2837 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2838 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002839 if (StackProtectorLevel) {
2840 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002841 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002842 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002843
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002844 // --param ssp-buffer-size=
2845 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2846 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002847 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002848 if (Str.startswith("ssp-buffer-size=")) {
2849 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00002850 CmdArgs.push_back("-stack-protector-buffer-size");
2851 // FIXME: Verify the argument is a valid integer.
2852 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002853 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002854 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00002855 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002856 }
2857
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002858 // Translate -mstackrealign
2859 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2860 false)) {
2861 CmdArgs.push_back("-backend-option");
2862 CmdArgs.push_back("-force-align-stack");
2863 }
2864 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2865 false)) {
2866 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2867 }
2868
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002869 if (Args.hasArg(options::OPT_mstack_alignment)) {
2870 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2871 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002872 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00002873 // -mkernel implies -mstrict-align; don't add the redundant option.
2874 if (Args.hasArg(options::OPT_mstrict_align) && !KernelOrKext) {
Chad Rosierd87e4f72012-11-09 18:27:01 +00002875 CmdArgs.push_back("-backend-option");
2876 CmdArgs.push_back("-arm-strict-align");
Chad Rosier60027022012-11-09 17:29:19 +00002877 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002878
Daniel Dunbard18049a2009-04-07 21:16:11 +00002879 // Forward -f options with positive and negative forms; we translate
2880 // these by hand.
2881
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002882 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002883 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002884 CmdArgs.push_back("-fapple-kext");
2885 if (!Args.hasArg(options::OPT_fbuiltin))
2886 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002887 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002888 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002889 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002890 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002891 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002892
Nuno Lopes13c88c72009-12-16 16:59:22 +00002893 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2894 options::OPT_fno_assume_sane_operator_new))
2895 CmdArgs.push_back("-fno-assume-sane-operator-new");
2896
Daniel Dunbar4930e332009-11-17 08:07:36 +00002897 // -fblocks=0 is default.
2898 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002899 getToolChain().IsBlocksDefault()) ||
2900 (Args.hasArg(options::OPT_fgnu_runtime) &&
2901 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2902 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002903 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002904
2905 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2906 !getToolChain().hasBlocksRuntime())
2907 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002908 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002909
Douglas Gregor226173a2012-01-18 15:19:58 +00002910 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2911 // users must also pass -fcxx-modules. The latter flag will disappear once the
2912 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00002913 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00002914 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2915 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2916 options::OPT_fno_cxx_modules,
2917 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00002918 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00002919 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00002920 HaveModules = true;
2921 }
2922 }
2923
Douglas Gregor35b04d62013-02-07 19:01:24 +00002924 // If a module path was provided, pass it along. Otherwise, use a temporary
2925 // directory.
2926 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
2927 A->claim();
2928 if (HaveModules) {
2929 A->render(Args, CmdArgs);
2930 }
2931 } else if (HaveModules) {
2932 SmallString<128> DefaultModuleCache;
2933 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
2934 DefaultModuleCache);
Douglas Gregor23c7d672013-03-21 21:48:48 +00002935 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
2936 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor4bedb492013-02-07 22:59:12 +00002937 const char Arg[] = "-fmodules-cache-path=";
2938 DefaultModuleCache.insert(DefaultModuleCache.begin(),
2939 Arg, Arg + strlen(Arg));
Douglas Gregor35b04d62013-02-07 19:01:24 +00002940 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
2941 }
2942
2943 // Pass through all -fmodules-ignore-macro arguments.
2944 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00002945 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
2946 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00002947
John McCalldfea9982010-04-09 19:12:06 +00002948 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002949 if (Args.hasFlag(options::OPT_fno_access_control,
2950 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002951 false))
John McCall3155f572010-04-09 19:03:51 +00002952 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00002953
Anders Carlssond470fef2010-11-21 00:09:52 +00002954 // -felide-constructors is the default.
2955 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2956 options::OPT_felide_constructors,
2957 false))
2958 CmdArgs.push_back("-fno-elide-constructors");
2959
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002960 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002961 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00002962 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00002963 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00002964
Richard Smith52be6192012-11-05 22:04:41 +00002965 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00002966 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00002967 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00002968 Args.getLastArg(options::OPT_mkernel,
2969 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00002970 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00002971 D.Diag(diag::err_drv_argument_not_allowed_with)
2972 << "-fsanitize=vptr" << NoRttiArg;
2973 }
2974 }
2975
Tony Linthicum76329bf2011-12-12 21:14:55 +00002976 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002977 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00002978 options::OPT_fno_short_enums,
2979 getToolChain().getTriple().getArch() ==
2980 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002981 CmdArgs.push_back("-fshort-enums");
2982
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002983 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002984 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002985 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00002986 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00002987
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002988 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002989 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002990 options::OPT_fno_threadsafe_statics))
2991 CmdArgs.push_back("-fno-threadsafe-statics");
2992
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002993 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002994 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2995 options::OPT_fno_use_cxa_atexit,
2996 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00002997 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00002998 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2999 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003000 CmdArgs.push_back("-fno-use-cxa-atexit");
3001
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003002 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003003 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003004 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3005 CmdArgs.push_back("-fms-extensions");
3006
Francois Pichet1b4f1632011-09-17 04:32:15 +00003007 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003008 if (Args.hasFlag(options::OPT_fms_compatibility,
3009 options::OPT_fno_ms_compatibility,
3010 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3011 Args.hasFlag(options::OPT_fms_extensions,
3012 options::OPT_fno_ms_extensions,
3013 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003014 CmdArgs.push_back("-fms-compatibility");
3015
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003016 // -fmsc-version=1300 is default.
3017 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3018 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3019 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003020 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003021 if (msc_ver.empty())
3022 CmdArgs.push_back("-fmsc-version=1300");
3023 else
3024 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3025 }
3026
3027
Eric Christopher5ecce122013-02-18 00:38:31 +00003028 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00003029 if (Args.hasFlag(options::OPT_fborland_extensions,
3030 options::OPT_fno_borland_extensions, false))
3031 CmdArgs.push_back("-fborland-extensions");
3032
Francois Pichet02744872011-09-01 16:38:08 +00003033 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3034 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003035 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3036 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00003037 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003038 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003039
Chandler Carruthe03aa552010-04-17 20:17:31 +00003040 // -fgnu-keywords default varies depending on language; only pass if
3041 // specified.
3042 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003043 options::OPT_fno_gnu_keywords))
3044 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00003045
Rafael Espindola922a6242011-06-02 17:30:53 +00003046 if (Args.hasFlag(options::OPT_fgnu89_inline,
3047 options::OPT_fno_gnu89_inline,
3048 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00003049 CmdArgs.push_back("-fgnu89-inline");
3050
Chad Rosier9c76d242012-03-15 22:31:42 +00003051 if (Args.hasArg(options::OPT_fno_inline))
3052 CmdArgs.push_back("-fno-inline");
3053
Chad Rosier64d6be92012-03-06 21:17:19 +00003054 if (Args.hasArg(options::OPT_fno_inline_functions))
3055 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00003056
John McCall5fb5df92012-06-20 06:18:46 +00003057 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00003058
John McCall5fb5df92012-06-20 06:18:46 +00003059 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
3060 // legacy is the default.
3061 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00003062 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3063 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00003064 objcRuntime.isLegacyDispatchDefaultForArch(
3065 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00003066 if (getToolChain().UseObjCMixedDispatch())
3067 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3068 else
3069 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3070 }
3071 }
3072
Nico Weber97bd94b2012-03-09 21:19:44 +00003073 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
3074 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00003075 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00003076 CmdArgs.push_back("-fobjc-default-synthesize-properties");
3077 }
3078
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00003079 // -fencode-extended-block-signature=1 is default.
3080 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3081 CmdArgs.push_back("-fencode-extended-block-signature");
3082 }
3083
John McCall24fc0de2011-07-06 00:26:06 +00003084 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3085 // NOTE: This logic is duplicated in ToolChains.cpp.
3086 bool ARC = isObjCAutoRefCount(Args);
3087 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00003088 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00003089
John McCall24fc0de2011-07-06 00:26:06 +00003090 CmdArgs.push_back("-fobjc-arc");
3091
Chandler Carruth491db322011-11-04 07:34:47 +00003092 // FIXME: It seems like this entire block, and several around it should be
3093 // wrapped in isObjC, but for now we just use it here as this is where it
3094 // was being used previously.
3095 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3096 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3097 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3098 else
3099 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3100 }
3101
John McCall24fc0de2011-07-06 00:26:06 +00003102 // Allow the user to enable full exceptions code emission.
3103 // We define off for Objective-CC, on for Objective-C++.
3104 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3105 options::OPT_fno_objc_arc_exceptions,
3106 /*default*/ types::isCXX(InputType)))
3107 CmdArgs.push_back("-fobjc-arc-exceptions");
3108 }
3109
3110 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3111 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00003112 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00003113 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003114
John McCall24fc0de2011-07-06 00:26:06 +00003115 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3116 // takes precedence.
3117 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3118 if (!GCArg)
3119 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3120 if (GCArg) {
3121 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003122 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00003123 << GCArg->getAsString(Args);
3124 } else if (getToolChain().SupportsObjCGC()) {
3125 GCArg->render(Args, CmdArgs);
3126 } else {
3127 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003128 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00003129 << GCArg->getAsString(Args);
3130 }
3131 }
3132
John McCallb5f652e2011-06-22 00:53:57 +00003133 // Add exception args.
3134 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00003135 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00003136
3137 if (getToolChain().UseSjLjExceptions())
3138 CmdArgs.push_back("-fsjlj-exceptions");
3139
3140 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00003141 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3142 options::OPT_fno_assume_sane_operator_new))
3143 CmdArgs.push_back("-fno-assume-sane-operator-new");
3144
Daniel Dunbar34d7a992010-04-27 15:34:57 +00003145 // -fconstant-cfstrings is default, and may be subject to argument translation
3146 // on Darwin.
3147 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3148 options::OPT_fno_constant_cfstrings) ||
3149 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3150 options::OPT_mno_constant_cfstrings))
3151 CmdArgs.push_back("-fno-constant-cfstrings");
3152
John Thompsoned4e2952009-11-05 20:14:16 +00003153 // -fshort-wchar default varies depending on platform; only
3154 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00003155 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3156 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00003157
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00003158 // -fno-pascal-strings is default, only pass non-default. If the tool chain
3159 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00003160 //
3161 // FIXME: This is gross; that translation should be pulled from the
3162 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003163 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003164 options::OPT_fno_pascal_strings,
3165 false) ||
3166 Args.hasFlag(options::OPT_mpascal_strings,
3167 options::OPT_mno_pascal_strings,
3168 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003169 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003170
Daniel Dunbar096ed292011-10-05 21:04:55 +00003171 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3172 // -fno-pack-struct doesn't apply to -fpack-struct=.
3173 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00003174 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00003175 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00003176 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00003177 } else if (Args.hasFlag(options::OPT_fpack_struct,
3178 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00003179 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00003180 }
3181
Eric Christopher8d56caa2013-02-18 01:16:37 +00003182 if (KernelOrKext) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003183 if (!Args.hasArg(options::OPT_fcommon))
3184 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00003185 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003186 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00003187
Daniel Dunbard18049a2009-04-07 21:16:11 +00003188 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003189 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003190 CmdArgs.push_back("-fno-common");
3191
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003192 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00003193 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00003194 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003195 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003196 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003197 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3198
Daniel Dunbar6358d682010-10-15 22:30:42 +00003199 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3200 if (!Args.hasFlag(options::OPT_ffor_scope,
3201 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003202 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00003203 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3204
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00003205 // -fcaret-diagnostics is default.
3206 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3207 options::OPT_fno_caret_diagnostics, true))
3208 CmdArgs.push_back("-fno-caret-diagnostics");
3209
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003210 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00003211 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003212 options::OPT_fno_diagnostics_fixit_info))
3213 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003214
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003215 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00003216 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003217 options::OPT_fno_diagnostics_show_option))
3218 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003219
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003220 if (const Arg *A =
3221 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3222 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00003223 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003224 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003225
Douglas Gregor643c9222011-05-21 17:07:29 +00003226 if (const Arg *A =
3227 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3228 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003229 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003230 }
3231
Chandler Carruthb6766f02011-03-27 01:50:55 +00003232 if (Arg *A = Args.getLastArg(
3233 options::OPT_fdiagnostics_show_note_include_stack,
3234 options::OPT_fno_diagnostics_show_note_include_stack)) {
3235 if (A->getOption().matches(
3236 options::OPT_fdiagnostics_show_note_include_stack))
3237 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3238 else
3239 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3240 }
3241
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003242 // Color diagnostics are the default, unless the terminal doesn't support
3243 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00003244 // Support both clang's -f[no-]color-diagnostics and gcc's
3245 // -f[no-]diagnostics-colors[=never|always|auto].
3246 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3247 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3248 it != ie; ++it) {
3249 const Option &O = (*it)->getOption();
3250 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3251 !O.matches(options::OPT_fdiagnostics_color) &&
3252 !O.matches(options::OPT_fno_color_diagnostics) &&
3253 !O.matches(options::OPT_fno_diagnostics_color) &&
3254 !O.matches(options::OPT_fdiagnostics_color_EQ))
3255 continue;
3256
3257 (*it)->claim();
3258 if (O.matches(options::OPT_fcolor_diagnostics) ||
3259 O.matches(options::OPT_fdiagnostics_color)) {
3260 ShowColors = Colors_On;
3261 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3262 O.matches(options::OPT_fno_diagnostics_color)) {
3263 ShowColors = Colors_Off;
3264 } else {
3265 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3266 StringRef value((*it)->getValue());
3267 if (value == "always")
3268 ShowColors = Colors_On;
3269 else if (value == "never")
3270 ShowColors = Colors_Off;
3271 else if (value == "auto")
3272 ShowColors = Colors_Auto;
3273 else
3274 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3275 << ("-fdiagnostics-color=" + value).str();
3276 }
3277 }
3278 if (ShowColors == Colors_On ||
3279 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003280 CmdArgs.push_back("-fcolor-diagnostics");
3281
Daniel Dunbardb097022009-06-08 21:13:54 +00003282 if (!Args.hasFlag(options::OPT_fshow_source_location,
3283 options::OPT_fno_show_source_location))
3284 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003285
Douglas Gregor643c9222011-05-21 17:07:29 +00003286 if (!Args.hasFlag(options::OPT_fshow_column,
3287 options::OPT_fno_show_column,
3288 true))
3289 CmdArgs.push_back("-fno-show-column");
3290
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00003291 if (!Args.hasFlag(options::OPT_fspell_checking,
3292 options::OPT_fno_spell_checking))
3293 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003294
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003295
Chad Rosierc8e56e82012-12-05 21:08:21 +00003296 // -fno-asm-blocks is default.
3297 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3298 false))
3299 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003300
Chad Rosier679b0752013-04-24 18:29:59 +00003301 // If -Ofast is the optimization level, then -fvectorize should be enabled.
3302 // This alias option is being used to simplify the hasFlag logic.
3303 OptSpecifier VectorizeAliasOption = OFastEnabled ? options::OPT_Ofast :
3304 options::OPT_fvectorize;
3305
Nadav Rotem1cd71a72012-12-18 23:10:16 +00003306 // -fvectorize is default.
Chad Rosier679b0752013-04-24 18:29:59 +00003307 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Nadav Rotem1cd71a72012-12-18 23:10:16 +00003308 options::OPT_fno_vectorize, true)) {
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003309 CmdArgs.push_back("-backend-option");
3310 CmdArgs.push_back("-vectorize-loops");
3311 }
3312
Hal Finkel061f1652012-12-11 19:59:32 +00003313 // -fno-slp-vectorize is default.
3314 if (Args.hasFlag(options::OPT_fslp_vectorize,
3315 options::OPT_fno_slp_vectorize, false)) {
3316 CmdArgs.push_back("-backend-option");
Nadav Rotem0a2604d2013-04-15 04:57:18 +00003317 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00003318 }
3319
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003320 // -fno-slp-vectorize-aggressive is default.
3321 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
3322 options::OPT_fno_slp_vectorize_aggressive, false)) {
3323 CmdArgs.push_back("-backend-option");
3324 CmdArgs.push_back("-vectorize-slp-aggressive");
3325 }
3326
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00003327 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3328 A->render(Args, CmdArgs);
3329
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003330 // -fdollars-in-identifiers default varies depending on platform and
3331 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00003332 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003333 options::OPT_fno_dollars_in_identifiers)) {
3334 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003335 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003336 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003337 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003338 }
3339
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003340 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3341 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00003342 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003343 options::OPT_fno_unit_at_a_time)) {
3344 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003345 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003346 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003347
Eli Friedman055c9702011-11-02 01:53:16 +00003348 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3349 options::OPT_fno_apple_pragma_pack, false))
3350 CmdArgs.push_back("-fapple-pragma-pack");
3351
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003352 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003353 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003354 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003355#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003356 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003357 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3358 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
3359 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3360 CmdArgs.push_back("-fno-builtin-strcat");
3361 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3362 CmdArgs.push_back("-fno-builtin-strcpy");
3363 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003364#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003365
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003366 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003367 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003368 options::OPT_traditional_cpp)) {
3369 if (isa<PreprocessJobAction>(JA))
3370 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003371 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003372 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003373 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003374
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003375 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003376 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003377
3378 // Handle serialized diagnostics.
3379 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3380 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003381 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003382 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003383
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003384 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3385 CmdArgs.push_back("-fretain-comments-from-system-headers");
3386
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003387 // Forward -fcomment-block-commands to -cc1.
3388 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00003389 // Forward -fparse-all-comments to -cc1.
3390 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003391
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003392 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3393 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003394 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003395 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3396 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003397 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003398
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003399 // We translate this by hand to the -cc1 argument, since nightly test uses
3400 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003401 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003402 CmdArgs.push_back("-disable-llvm-optzns");
3403 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003404 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003405 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003406
Daniel Dunbard67a3222009-03-30 06:36:42 +00003407 if (Output.getType() == types::TY_Dependencies) {
3408 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003409 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003410 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003411 CmdArgs.push_back(Output.getFilename());
3412 } else {
3413 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003414 }
3415
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003416 for (InputInfoList::const_iterator
3417 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3418 const InputInfo &II = *it;
3419 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00003420 if (Args.hasArg(options::OPT_rewrite_objc))
3421 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3422 else
3423 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00003424 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003425 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003426 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003427 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003428 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003429
Chris Lattnere9d7d782009-11-03 19:50:27 +00003430 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3431
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003432 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003433
3434 // Optionally embed the -cc1 level arguments into the debug info, for build
3435 // analysis.
3436 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003437 ArgStringList OriginalArgs;
3438 for (ArgList::const_iterator it = Args.begin(),
3439 ie = Args.end(); it != ie; ++it)
3440 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003441
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003442 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003443 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003444 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003445 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003446 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003447 }
3448 CmdArgs.push_back("-dwarf-debug-flags");
3449 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3450 }
3451
Eric Christopherd3804002013-02-22 20:12:52 +00003452 // Add the split debug info name to the command lines here so we
3453 // can propagate it to the backend.
3454 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
3455 (getToolChain().getTriple().getOS() == llvm::Triple::Linux) &&
Eric Christopherf1545832013-02-22 23:50:16 +00003456 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00003457 const char *SplitDwarfOut;
3458 if (SplitDwarf) {
3459 CmdArgs.push_back("-split-dwarf-file");
3460 SplitDwarfOut = SplitDebugName(Args, Inputs);
3461 CmdArgs.push_back(SplitDwarfOut);
3462 }
3463
3464 // Finally add the compile command to the compilation.
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003465 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00003466
Eric Christopherf1545832013-02-22 23:50:16 +00003467 // Handle the debug info splitting at object creation time if we're
3468 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00003469 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00003470 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00003471 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00003472
Roman Divacky178e01602011-02-10 16:52:03 +00003473 if (Arg *A = Args.getLastArg(options::OPT_pg))
3474 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003475 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00003476 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003477
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003478 // Claim some arguments which clang supports automatically.
3479
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00003480 // -fpch-preprocess is used with gcc to add a special marker in the output to
3481 // include the PCH file. Clang's PTH solution is completely transparent, so we
3482 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003483 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003484
Daniel Dunbar17731772009-03-23 19:03:36 +00003485 // Claim some arguments which clang doesn't support, but we don't
3486 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003487 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3488 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00003489
Rafael Espindolad95a8122011-03-01 05:25:27 +00003490 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00003491 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003492 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003493}
3494
Jim Grosbach576452b2012-02-10 20:37:10 +00003495void ClangAs::AddARMTargetArgs(const ArgList &Args,
3496 ArgStringList &CmdArgs) const {
3497 const Driver &D = getToolChain().getDriver();
3498 llvm::Triple Triple = getToolChain().getTriple();
3499
3500 // Set the CPU based on -march= and -mcpu=.
3501 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00003502 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00003503
3504 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00003505 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00003506 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00003507
3508 // Honor -mfpmath=.
3509 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00003510 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00003511}
3512
Benjamin Kramerb164d672013-02-22 20:55:17 +00003513void ClangAs::AddX86TargetArgs(const ArgList &Args,
3514 ArgStringList &CmdArgs) const {
3515 // Set the CPU based on -march=.
3516 if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
3517 CmdArgs.push_back("-target-cpu");
3518 CmdArgs.push_back(CPUName);
3519 }
3520}
3521
John McCall5fb5df92012-06-20 06:18:46 +00003522/// Add options related to the Objective-C runtime/ABI.
3523///
3524/// Returns true if the runtime is non-fragile.
3525ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3526 ArgStringList &cmdArgs,
3527 RewriteKind rewriteKind) const {
3528 // Look for the controlling runtime option.
3529 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3530 options::OPT_fgnu_runtime,
3531 options::OPT_fobjc_runtime_EQ);
3532
3533 // Just forward -fobjc-runtime= to the frontend. This supercedes
3534 // options about fragility.
3535 if (runtimeArg &&
3536 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3537 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003538 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003539 if (runtime.tryParse(value)) {
3540 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3541 << value;
3542 }
3543
3544 runtimeArg->render(args, cmdArgs);
3545 return runtime;
3546 }
3547
3548 // Otherwise, we'll need the ABI "version". Version numbers are
3549 // slightly confusing for historical reasons:
3550 // 1 - Traditional "fragile" ABI
3551 // 2 - Non-fragile ABI, version 1
3552 // 3 - Non-fragile ABI, version 2
3553 unsigned objcABIVersion = 1;
3554 // If -fobjc-abi-version= is present, use that to set the version.
3555 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003556 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003557 if (value == "1")
3558 objcABIVersion = 1;
3559 else if (value == "2")
3560 objcABIVersion = 2;
3561 else if (value == "3")
3562 objcABIVersion = 3;
3563 else
3564 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3565 << value;
3566 } else {
3567 // Otherwise, determine if we are using the non-fragile ABI.
3568 bool nonFragileABIIsDefault =
3569 (rewriteKind == RK_NonFragile ||
3570 (rewriteKind == RK_None &&
3571 getToolChain().IsObjCNonFragileABIDefault()));
3572 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3573 options::OPT_fno_objc_nonfragile_abi,
3574 nonFragileABIIsDefault)) {
3575 // Determine the non-fragile ABI version to use.
3576#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3577 unsigned nonFragileABIVersion = 1;
3578#else
3579 unsigned nonFragileABIVersion = 2;
3580#endif
3581
3582 if (Arg *abiArg = args.getLastArg(
3583 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003584 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003585 if (value == "1")
3586 nonFragileABIVersion = 1;
3587 else if (value == "2")
3588 nonFragileABIVersion = 2;
3589 else
3590 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3591 << value;
3592 }
3593
3594 objcABIVersion = 1 + nonFragileABIVersion;
3595 } else {
3596 objcABIVersion = 1;
3597 }
3598 }
3599
3600 // We don't actually care about the ABI version other than whether
3601 // it's non-fragile.
3602 bool isNonFragile = objcABIVersion != 1;
3603
3604 // If we have no runtime argument, ask the toolchain for its default runtime.
3605 // However, the rewriter only really supports the Mac runtime, so assume that.
3606 ObjCRuntime runtime;
3607 if (!runtimeArg) {
3608 switch (rewriteKind) {
3609 case RK_None:
3610 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3611 break;
3612 case RK_Fragile:
3613 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3614 break;
3615 case RK_NonFragile:
3616 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3617 break;
3618 }
3619
3620 // -fnext-runtime
3621 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3622 // On Darwin, make this use the default behavior for the toolchain.
3623 if (getToolChain().getTriple().isOSDarwin()) {
3624 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3625
3626 // Otherwise, build for a generic macosx port.
3627 } else {
3628 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3629 }
3630
3631 // -fgnu-runtime
3632 } else {
3633 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003634 // Legacy behaviour is to target the gnustep runtime if we are i
3635 // non-fragile mode or the GCC runtime in fragile mode.
3636 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003637 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003638 else
3639 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003640 }
3641
3642 cmdArgs.push_back(args.MakeArgString(
3643 "-fobjc-runtime=" + runtime.getAsString()));
3644 return runtime;
3645}
3646
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003647void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003648 const InputInfo &Output,
3649 const InputInfoList &Inputs,
3650 const ArgList &Args,
3651 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003652 ArgStringList CmdArgs;
3653
3654 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3655 const InputInfo &Input = Inputs[0];
3656
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003657 // Don't warn about "clang -w -c foo.s"
3658 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003659 // and "clang -emit-llvm -c foo.s"
3660 Args.ClaimAllArgs(options::OPT_emit_llvm);
3661 // and "clang -use-gold-plugin -c foo.s"
3662 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003663
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003664 // Invoke ourselves in -cc1as mode.
3665 //
3666 // FIXME: Implement custom jobs for internal actions.
3667 CmdArgs.push_back("-cc1as");
3668
3669 // Add the "effective" target triple.
3670 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003671 std::string TripleStr =
3672 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003673 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3674
3675 // Set the output mode, we currently only expect to be used as a real
3676 // assembler.
3677 CmdArgs.push_back("-filetype");
3678 CmdArgs.push_back("obj");
3679
Eric Christopher45f2e712012-12-18 00:31:10 +00003680 // Set the main file name, so that debug info works even with
3681 // -save-temps or preprocessed assembly.
3682 CmdArgs.push_back("-main-file-name");
3683 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3684
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003685 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003686 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003687
Jim Grosbach576452b2012-02-10 20:37:10 +00003688 // Add target specific cpu and features flags.
3689 switch(getToolChain().getTriple().getArch()) {
3690 default:
3691 break;
3692
3693 case llvm::Triple::arm:
3694 case llvm::Triple::thumb:
3695 AddARMTargetArgs(Args, CmdArgs);
3696 break;
Benjamin Kramerb164d672013-02-22 20:55:17 +00003697
3698 case llvm::Triple::x86:
3699 case llvm::Triple::x86_64:
3700 AddX86TargetArgs(Args, CmdArgs);
3701 break;
Jim Grosbach576452b2012-02-10 20:37:10 +00003702 }
3703
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003704 // Ignore explicit -force_cpusubtype_ALL option.
3705 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003706
Eric Christopherfc3ee562012-01-10 00:38:01 +00003707 // Determine the original source input.
3708 const Action *SourceAction = &JA;
3709 while (SourceAction->getKind() != Action::InputClass) {
3710 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3711 SourceAction = SourceAction->getInputs()[0];
3712 }
3713
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003714 // Forward -g and handle debug info related flags, assuming we are dealing
3715 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00003716 if (SourceAction->getType() == types::TY_Asm ||
3717 SourceAction->getType() == types::TY_PP_Asm) {
3718 Args.ClaimAllArgs(options::OPT_g_Group);
3719 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3720 if (!A->getOption().matches(options::OPT_g0))
3721 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003722
3723 // Add the -fdebug-compilation-dir flag if needed.
3724 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00003725
3726 // Set the AT_producer to the clang version when using the integrated
3727 // assembler on assembly source files.
3728 CmdArgs.push_back("-dwarf-debug-producer");
3729 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00003730 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003731
3732 // Optionally embed the -cc1as level arguments into the debug info, for build
3733 // analysis.
3734 if (getToolChain().UseDwarfDebugFlags()) {
3735 ArgStringList OriginalArgs;
3736 for (ArgList::const_iterator it = Args.begin(),
3737 ie = Args.end(); it != ie; ++it)
3738 (*it)->render(Args, OriginalArgs);
3739
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003740 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003741 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3742 Flags += Exec;
3743 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3744 Flags += " ";
3745 Flags += OriginalArgs[i];
3746 }
3747 CmdArgs.push_back("-dwarf-debug-flags");
3748 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3749 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003750
3751 // FIXME: Add -static support, once we have it.
3752
3753 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3754 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003755 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003756
3757 assert(Output.isFilename() && "Unexpected lipo output.");
3758 CmdArgs.push_back("-o");
3759 CmdArgs.push_back(Output.getFilename());
3760
Daniel Dunbarb440f562010-08-02 02:38:21 +00003761 assert(Input.isFilename() && "Invalid input.");
3762 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003763
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003764 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003765 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00003766
3767 // Handle the debug info splitting at object creation time if we're
3768 // creating an object.
3769 // TODO: Currently only works on linux with newer objcopy.
3770 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
3771 (getToolChain().getTriple().getOS() == llvm::Triple::Linux))
3772 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
3773 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003774}
3775
Daniel Dunbara3246a02009-03-18 08:07:30 +00003776void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003777 const InputInfo &Output,
3778 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003779 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003780 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003781 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003782 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003783
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003784 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003785 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003786 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00003787 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003788 // Don't forward any -g arguments to assembly steps.
3789 if (isa<AssembleJobAction>(JA) &&
3790 A->getOption().matches(options::OPT_g_Group))
3791 continue;
3792
Daniel Dunbar2da02722009-03-19 07:55:12 +00003793 // It is unfortunate that we have to claim here, as this means
3794 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003795 // platforms using a generic gcc, even if we are just using gcc
3796 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003797 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003798 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003799 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003800 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003801
Daniel Dunbar4e295052010-01-25 22:35:08 +00003802 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003803
3804 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003805 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00003806 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003807 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003808
3809 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003810 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003811 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003812 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003813 CmdArgs.push_back("ppc64");
3814 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003815 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003816 }
3817
Daniel Dunbar5716d872009-05-02 21:41:52 +00003818 // Try to force gcc to match the tool chain we want, if we recognize
3819 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003820 //
3821 // FIXME: The triple class should directly provide the information we want
3822 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003823 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003824 CmdArgs.push_back("-m32");
Hans Wennborgc5f4c362013-03-20 07:34:27 +00003825 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003826 CmdArgs.push_back("-m64");
3827
Daniel Dunbarb440f562010-08-02 02:38:21 +00003828 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003829 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003830 CmdArgs.push_back(Output.getFilename());
3831 } else {
3832 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003833 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003834 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003835
Tony Linthicum76329bf2011-12-12 21:14:55 +00003836 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3837 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003838
3839 // Only pass -x if gcc will understand it; otherwise hope gcc
3840 // understands the suffix correctly. The main use case this would go
3841 // wrong in is for linker inputs if they happened to have an odd
3842 // suffix; really the only way to get this to happen is a command
3843 // like '-x foobar a.c' which will treat a.c like a linker input.
3844 //
3845 // FIXME: For the linker case specifically, can we safely convert
3846 // inputs into '-Wl,' options?
3847 for (InputInfoList::const_iterator
3848 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3849 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003850
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003851 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003852 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3853 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003854 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003855 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003856 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003857 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003858 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003859 else if (II.getType() == types::TY_ModuleFile)
3860 D.Diag(diag::err_drv_no_module_support)
3861 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003862
Daniel Dunbara3246a02009-03-18 08:07:30 +00003863 if (types::canTypeBeUserSpecified(II.getType())) {
3864 CmdArgs.push_back("-x");
3865 CmdArgs.push_back(types::getTypeName(II.getType()));
3866 }
3867
Daniel Dunbarb440f562010-08-02 02:38:21 +00003868 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003869 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003870 else {
3871 const Arg &A = II.getInputArg();
3872
3873 // Reverse translate some rewritten options.
3874 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3875 CmdArgs.push_back("-lstdc++");
3876 continue;
3877 }
3878
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003879 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003880 A.render(Args, CmdArgs);
3881 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003882 }
3883
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003884 const std::string customGCCName = D.getCCCGenericGCCName();
3885 const char *GCCName;
3886 if (!customGCCName.empty())
3887 GCCName = customGCCName.c_str();
3888 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003889 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003890 } else
3891 GCCName = "gcc";
3892
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003893 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003894 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003895 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003896}
3897
Daniel Dunbar4e295052010-01-25 22:35:08 +00003898void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3899 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003900 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003901}
3902
Daniel Dunbar4e295052010-01-25 22:35:08 +00003903void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3904 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003905 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003906}
3907
Daniel Dunbar4e295052010-01-25 22:35:08 +00003908void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3909 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003910 const Driver &D = getToolChain().getDriver();
3911
Daniel Dunbar4e295052010-01-25 22:35:08 +00003912 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003913 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3914 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003915 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003916 else {
3917 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003918 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003919 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003920
Daniel Dunbar4e295052010-01-25 22:35:08 +00003921 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003922 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003923}
3924
Daniel Dunbar4e295052010-01-25 22:35:08 +00003925void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3926 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003927 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003928}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003929
Daniel Dunbar4e295052010-01-25 22:35:08 +00003930void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3931 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003932 // The types are (hopefully) good enough.
3933}
3934
Tony Linthicum76329bf2011-12-12 21:14:55 +00003935// Hexagon tools start.
3936void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3937 ArgStringList &CmdArgs) const {
3938
3939}
3940void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3941 const InputInfo &Output,
3942 const InputInfoList &Inputs,
3943 const ArgList &Args,
3944 const char *LinkingOutput) const {
3945
3946 const Driver &D = getToolChain().getDriver();
3947 ArgStringList CmdArgs;
3948
3949 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00003950 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003951 CmdArgs.push_back(Args.MakeArgString(MarchString));
3952
3953 RenderExtraToolArgs(JA, CmdArgs);
3954
3955 if (Output.isFilename()) {
3956 CmdArgs.push_back("-o");
3957 CmdArgs.push_back(Output.getFilename());
3958 } else {
3959 assert(Output.isNothing() && "Unexpected output");
3960 CmdArgs.push_back("-fsyntax-only");
3961 }
3962
Matthew Curtise8f80a12012-12-06 17:49:03 +00003963 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
3964 if (!SmallDataThreshold.empty())
3965 CmdArgs.push_back(
3966 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003967
Matthew Curtise5df3812012-12-07 17:23:04 +00003968 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3969 options::OPT_Xassembler);
3970
Tony Linthicum76329bf2011-12-12 21:14:55 +00003971 // Only pass -x if gcc will understand it; otherwise hope gcc
3972 // understands the suffix correctly. The main use case this would go
3973 // wrong in is for linker inputs if they happened to have an odd
3974 // suffix; really the only way to get this to happen is a command
3975 // like '-x foobar a.c' which will treat a.c like a linker input.
3976 //
3977 // FIXME: For the linker case specifically, can we safely convert
3978 // inputs into '-Wl,' options?
3979 for (InputInfoList::const_iterator
3980 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3981 const InputInfo &II = *it;
3982
3983 // Don't try to pass LLVM or AST inputs to a generic gcc.
3984 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3985 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3986 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3987 << getToolChain().getTripleString();
3988 else if (II.getType() == types::TY_AST)
3989 D.Diag(clang::diag::err_drv_no_ast_support)
3990 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003991 else if (II.getType() == types::TY_ModuleFile)
3992 D.Diag(diag::err_drv_no_module_support)
3993 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00003994
3995 if (II.isFilename())
3996 CmdArgs.push_back(II.getFilename());
3997 else
3998 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3999 II.getInputArg().render(Args, CmdArgs);
4000 }
4001
4002 const char *GCCName = "hexagon-as";
4003 const char *Exec =
4004 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4005 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4006
4007}
4008void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4009 ArgStringList &CmdArgs) const {
4010 // The types are (hopefully) good enough.
4011}
4012
4013void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4014 const InputInfo &Output,
4015 const InputInfoList &Inputs,
4016 const ArgList &Args,
4017 const char *LinkingOutput) const {
4018
Matthew Curtise689b052012-12-06 15:46:07 +00004019 const toolchains::Hexagon_TC& ToolChain =
4020 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4021 const Driver &D = ToolChain.getDriver();
4022
Tony Linthicum76329bf2011-12-12 21:14:55 +00004023 ArgStringList CmdArgs;
4024
Matthew Curtise689b052012-12-06 15:46:07 +00004025 //----------------------------------------------------------------------------
4026 //
4027 //----------------------------------------------------------------------------
4028 bool hasStaticArg = Args.hasArg(options::OPT_static);
4029 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00004030 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00004031 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4032 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4033 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4034 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004035
Matthew Curtise689b052012-12-06 15:46:07 +00004036 //----------------------------------------------------------------------------
4037 // Silence warnings for various options
4038 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00004039
Matthew Curtise689b052012-12-06 15:46:07 +00004040 Args.ClaimAllArgs(options::OPT_g_Group);
4041 Args.ClaimAllArgs(options::OPT_emit_llvm);
4042 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4043 // handled somewhere else.
4044 Args.ClaimAllArgs(options::OPT_static_libgcc);
4045
4046 //----------------------------------------------------------------------------
4047 //
4048 //----------------------------------------------------------------------------
4049 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4050 e = ToolChain.ExtraOpts.end();
4051 i != e; ++i)
4052 CmdArgs.push_back(i->c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004053
Matthew Curtisf10a5952012-12-06 14:16:43 +00004054 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4055 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00004056
Matthew Curtise689b052012-12-06 15:46:07 +00004057 if (buildingLib) {
4058 CmdArgs.push_back("-shared");
4059 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4060 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00004061 }
4062
Matthew Curtise689b052012-12-06 15:46:07 +00004063 if (hasStaticArg)
4064 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004065
Matthew Curtise8f80a12012-12-06 17:49:03 +00004066 if (buildPIE && !buildingLib)
4067 CmdArgs.push_back("-pie");
4068
4069 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4070 if (!SmallDataThreshold.empty()) {
4071 CmdArgs.push_back(
4072 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4073 }
4074
Matthew Curtise689b052012-12-06 15:46:07 +00004075 //----------------------------------------------------------------------------
4076 //
4077 //----------------------------------------------------------------------------
4078 CmdArgs.push_back("-o");
4079 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004080
Matthew Curtise689b052012-12-06 15:46:07 +00004081 const std::string MarchSuffix = "/" + MarchString;
4082 const std::string G0Suffix = "/G0";
4083 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4084 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4085 + "/";
4086 const std::string StartFilesDir = RootDir
4087 + "hexagon/lib"
4088 + (buildingLib
4089 ? MarchG0Suffix : MarchSuffix);
4090
4091 //----------------------------------------------------------------------------
4092 // moslib
4093 //----------------------------------------------------------------------------
4094 std::vector<std::string> oslibs;
4095 bool hasStandalone= false;
4096
4097 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4098 ie = Args.filtered_end(); it != ie; ++it) {
4099 (*it)->claim();
4100 oslibs.push_back((*it)->getValue());
4101 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004102 }
Matthew Curtise689b052012-12-06 15:46:07 +00004103 if (oslibs.empty()) {
4104 oslibs.push_back("standalone");
4105 hasStandalone = true;
4106 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004107
Matthew Curtise689b052012-12-06 15:46:07 +00004108 //----------------------------------------------------------------------------
4109 // Start Files
4110 //----------------------------------------------------------------------------
4111 if (incStdLib && incStartFiles) {
4112
4113 if (!buildingLib) {
4114 if (hasStandalone) {
4115 CmdArgs.push_back(
4116 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4117 }
4118 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4119 }
4120 std::string initObj = useShared ? "/initS.o" : "/init.o";
4121 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4122 }
4123
4124 //----------------------------------------------------------------------------
4125 // Library Search Paths
4126 //----------------------------------------------------------------------------
4127 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4128 for (ToolChain::path_list::const_iterator
4129 i = LibPaths.begin(),
4130 e = LibPaths.end();
4131 i != e;
4132 ++i)
4133 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4134
4135 //----------------------------------------------------------------------------
4136 //
4137 //----------------------------------------------------------------------------
4138 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4139 Args.AddAllArgs(CmdArgs, options::OPT_e);
4140 Args.AddAllArgs(CmdArgs, options::OPT_s);
4141 Args.AddAllArgs(CmdArgs, options::OPT_t);
4142 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4143
4144 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4145
4146 //----------------------------------------------------------------------------
4147 // Libraries
4148 //----------------------------------------------------------------------------
4149 if (incStdLib && incDefLibs) {
4150 if (D.CCCIsCXX) {
4151 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4152 CmdArgs.push_back("-lm");
4153 }
4154
4155 CmdArgs.push_back("--start-group");
4156
4157 if (!buildingLib) {
4158 for(std::vector<std::string>::iterator i = oslibs.begin(),
4159 e = oslibs.end(); i != e; ++i)
4160 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4161 CmdArgs.push_back("-lc");
4162 }
4163 CmdArgs.push_back("-lgcc");
4164
4165 CmdArgs.push_back("--end-group");
4166 }
4167
4168 //----------------------------------------------------------------------------
4169 // End files
4170 //----------------------------------------------------------------------------
4171 if (incStdLib && incStartFiles) {
4172 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4173 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4174 }
4175
4176 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
4177 C.addCommand(
4178 new Command(
4179 JA, *this,
4180 Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004181}
4182// Hexagon tools end.
4183
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004184llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4185 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4186 // archs which Darwin doesn't use.
4187
4188 // The matching this routine does is fairly pointless, since it is neither the
4189 // complete architecture list, nor a reasonable subset. The problem is that
4190 // historically the driver driver accepts this and also ties its -march=
4191 // handling to the architecture name, so we need to be careful before removing
4192 // support for it.
4193
4194 // This code must be kept in sync with Clang's Darwin specific argument
4195 // translation.
4196
4197 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4198 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4199 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4200 .Case("ppc64", llvm::Triple::ppc64)
4201 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4202 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4203 llvm::Triple::x86)
4204 .Case("x86_64", llvm::Triple::x86_64)
4205 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00004206 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4207 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4208 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004209 .Case("r600", llvm::Triple::r600)
4210 .Case("nvptx", llvm::Triple::nvptx)
4211 .Case("nvptx64", llvm::Triple::nvptx64)
4212 .Case("amdil", llvm::Triple::amdil)
4213 .Case("spir", llvm::Triple::spir)
4214 .Default(llvm::Triple::UnknownArch);
4215}
Tony Linthicum76329bf2011-12-12 21:14:55 +00004216
Bob Wilsondecc03e2012-11-23 06:14:39 +00004217const char *Clang::getBaseInputName(const ArgList &Args,
4218 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00004219 return Args.MakeArgString(
4220 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004221}
4222
Bob Wilsondecc03e2012-11-23 06:14:39 +00004223const char *Clang::getBaseInputStem(const ArgList &Args,
4224 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004225 const char *Str = getBaseInputName(Args, Inputs);
4226
Chris Lattner906bb902011-01-16 08:14:11 +00004227 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004228 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004229
4230 return Str;
4231}
4232
Bob Wilsondecc03e2012-11-23 06:14:39 +00004233const char *Clang::getDependencyFileName(const ArgList &Args,
4234 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004235 // FIXME: Think about this more.
4236 std::string Res;
4237
4238 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004239 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004240 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004241 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00004242 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004243 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004244 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004245}
4246
Daniel Dunbarbe220842009-03-20 16:06:39 +00004247void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004248 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004249 const InputInfoList &Inputs,
4250 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004251 const char *LinkingOutput) const {
4252 ArgStringList CmdArgs;
4253
4254 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4255 const InputInfo &Input = Inputs[0];
4256
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004257 // Determine the original source input.
4258 const Action *SourceAction = &JA;
4259 while (SourceAction->getKind() != Action::InputClass) {
4260 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4261 SourceAction = SourceAction->getInputs()[0];
4262 }
4263
4264 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004265 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004266 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004267 if (Args.hasArg(options::OPT_gstabs))
4268 CmdArgs.push_back("--gstabs");
4269 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004270 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004271 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004272
Daniel Dunbarbe220842009-03-20 16:06:39 +00004273 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004274 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004275
Daniel Dunbar6d484762010-07-22 01:47:22 +00004276 // Use -force_cpusubtype_ALL on x86 by default.
4277 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4278 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004279 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4280 CmdArgs.push_back("-force_cpusubtype_ALL");
4281
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004282 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004283 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00004284 Args.hasArg(options::OPT_fapple_kext)) &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004285 (!getDarwinToolChain().isTargetIPhoneOS() ||
4286 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4287 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004288 CmdArgs.push_back("-static");
4289
Daniel Dunbarbe220842009-03-20 16:06:39 +00004290 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4291 options::OPT_Xassembler);
4292
4293 assert(Output.isFilename() && "Unexpected lipo output.");
4294 CmdArgs.push_back("-o");
4295 CmdArgs.push_back(Output.getFilename());
4296
Daniel Dunbarb440f562010-08-02 02:38:21 +00004297 assert(Input.isFilename() && "Invalid input.");
4298 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004299
4300 // asm_final spec is empty.
4301
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004302 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004303 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004304 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004305}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004306
David Blaikie68e081d2011-12-20 02:48:34 +00004307void darwin::DarwinTool::anchor() {}
4308
Daniel Dunbare9ded432009-09-09 18:36:20 +00004309void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4310 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004311 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004312
Daniel Dunbarc1964212009-03-26 16:23:12 +00004313 // Derived from darwin_arch spec.
4314 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004315 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004316
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004317 // FIXME: Is this needed anymore?
4318 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004319 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004320}
4321
Bill Wendling3b2000f2012-10-02 18:02:50 +00004322bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4323 // We only need to generate a temp path for LTO if we aren't compiling object
4324 // files. When compiling source files, we run 'dsymutil' after linking. We
4325 // don't run 'dsymutil' when compiling object files.
4326 for (InputInfoList::const_iterator
4327 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4328 if (it->getType() != types::TY_Object)
4329 return true;
4330
4331 return false;
4332}
4333
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004334void darwin::Link::AddLinkArgs(Compilation &C,
4335 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004336 ArgStringList &CmdArgs,
4337 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004338 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004339 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004340
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004341 unsigned Version[3] = { 0, 0, 0 };
4342 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4343 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00004344 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004345 Version[1], Version[2], HadExtra) ||
4346 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004347 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004348 << A->getAsString(Args);
4349 }
4350
4351 // Newer linkers support -demangle, pass it if supported and not disabled by
4352 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004353 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004354 // Don't pass -demangle to ld_classic.
4355 //
4356 // FIXME: This is a temporary workaround, ld should be handling this.
4357 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4358 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004359 if (getToolChain().getArch() == llvm::Triple::x86) {
4360 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4361 options::OPT_Wl_COMMA),
4362 ie = Args.filtered_end(); it != ie; ++it) {
4363 const Arg *A = *it;
4364 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smithbd55daf2012-11-01 04:30:05 +00004365 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004366 UsesLdClassic = true;
4367 }
4368 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004369 if (!UsesLdClassic)
4370 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004371 }
4372
Bill Wendling313b6bf2012-11-16 23:03:00 +00004373 // If we are using LTO, then automatically create a temporary file path for
4374 // the linker to use, so that it's lifetime will extend past a possible
4375 // dsymutil step.
4376 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4377 const char *TmpPath = C.getArgs().MakeArgString(
4378 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4379 C.addTempFile(TmpPath);
4380 CmdArgs.push_back("-object_path_lto");
4381 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00004382 }
4383
Daniel Dunbarc1964212009-03-26 16:23:12 +00004384 // Derived from the "link" spec.
4385 Args.AddAllArgs(CmdArgs, options::OPT_static);
4386 if (!Args.hasArg(options::OPT_static))
4387 CmdArgs.push_back("-dynamic");
4388 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4389 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4390 // here. How do we wish to handle such things?
4391 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004392
Daniel Dunbarc1964212009-03-26 16:23:12 +00004393 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004394 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004395 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004396 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004397
4398 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4399 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4400 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4401
4402 Arg *A;
4403 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4404 (A = Args.getLastArg(options::OPT_current__version)) ||
4405 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004406 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004407 << A->getAsString(Args) << "-dynamiclib";
4408
4409 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4410 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4411 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4412 } else {
4413 CmdArgs.push_back("-dylib");
4414
4415 Arg *A;
4416 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4417 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4418 (A = Args.getLastArg(options::OPT_client__name)) ||
4419 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4420 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4421 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004422 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004423 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004424
Daniel Dunbarc1964212009-03-26 16:23:12 +00004425 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4426 "-dylib_compatibility_version");
4427 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4428 "-dylib_current_version");
4429
Daniel Dunbara48823f2010-01-22 02:04:52 +00004430 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004431
4432 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4433 "-dylib_install_name");
4434 }
4435
4436 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4437 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4438 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004439 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004440 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004441 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4442 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4443 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4444 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4445 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4446 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004447 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004448 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4449 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4450 Args.AddAllArgs(CmdArgs, options::OPT_init);
4451
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004452 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004453 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004454
4455 // If we had an explicit -mios-simulator-version-min argument, honor that,
4456 // otherwise use the traditional deployment targets. We can't just check the
4457 // is-sim attribute because existing code follows this path, and the linker
4458 // may not handle the argument.
4459 //
4460 // FIXME: We may be able to remove this, once we can verify no one depends on
4461 // it.
4462 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4463 CmdArgs.push_back("-ios_simulator_version_min");
4464 else if (DarwinTC.isTargetIPhoneOS())
4465 CmdArgs.push_back("-iphoneos_version_min");
4466 else
4467 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004468 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004469
Daniel Dunbarc1964212009-03-26 16:23:12 +00004470 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4471 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4472 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4473 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4474 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004475
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004476 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4477 options::OPT_fno_pie,
4478 options::OPT_fno_PIE)) {
4479 if (A->getOption().matches(options::OPT_fpie) ||
4480 A->getOption().matches(options::OPT_fPIE))
4481 CmdArgs.push_back("-pie");
4482 else
4483 CmdArgs.push_back("-no_pie");
4484 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004485
4486 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4487 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4488 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4489 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4490 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4491 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4492 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4493 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4494 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4495 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4496 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4497 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4498 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4499 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4500 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4501 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004502
Daniel Dunbar84384642011-05-02 21:03:47 +00004503 // Give --sysroot= preference, over the Apple specific behavior to also use
4504 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004505 StringRef sysroot = C.getSysRoot();
4506 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004507 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004508 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004509 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4510 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00004511 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004512 }
4513
Daniel Dunbarc1964212009-03-26 16:23:12 +00004514 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4515 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4516 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4517 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4518 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004519 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004520 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4521 Args.AddAllArgs(CmdArgs, options::OPT_y);
4522 Args.AddLastArg(CmdArgs, options::OPT_w);
4523 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4524 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4525 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4526 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4527 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4528 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4529 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4530 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4531 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4532 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4533 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4534 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4535}
4536
4537void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004538 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004539 const InputInfoList &Inputs,
4540 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004541 const char *LinkingOutput) const {
4542 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004543
Daniel Dunbarc1964212009-03-26 16:23:12 +00004544 // The logic here is derived from gcc's behavior; most of which
4545 // comes from specs (starting with link_command). Consult gcc for
4546 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004547 ArgStringList CmdArgs;
4548
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004549 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4550 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4551 options::OPT_ccc_arcmt_migrate)) {
4552 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4553 (*I)->claim();
4554 const char *Exec =
4555 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4556 CmdArgs.push_back(Output.getFilename());
4557 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4558 return;
4559 }
4560
Daniel Dunbarc1964212009-03-26 16:23:12 +00004561 // I'm not sure why this particular decomposition exists in gcc, but
4562 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004563 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004564
Daniel Dunbarc1964212009-03-26 16:23:12 +00004565 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4566 Args.AddAllArgs(CmdArgs, options::OPT_s);
4567 Args.AddAllArgs(CmdArgs, options::OPT_t);
4568 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4569 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004570 Args.AddLastArg(CmdArgs, options::OPT_e);
4571 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4572 Args.AddAllArgs(CmdArgs, options::OPT_r);
4573
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004574 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4575 // members of static archive libraries which implement Objective-C classes or
4576 // categories.
4577 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4578 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004579
Bill Wendling58979742012-12-10 21:48:41 +00004580 if (Args.hasArg(options::OPT_rdynamic))
4581 CmdArgs.push_back("-export_dynamic");
4582
Daniel Dunbarc1964212009-03-26 16:23:12 +00004583 CmdArgs.push_back("-o");
4584 CmdArgs.push_back(Output.getFilename());
4585
Chad Rosier06fd3c62012-05-16 23:45:12 +00004586 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004587 !Args.hasArg(options::OPT_nostartfiles)) {
4588 // Derived from startfile spec.
4589 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004590 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004591 if (getDarwinToolChain().isTargetIOSSimulator()) {
4592 // The simulator doesn't have a versioned crt1 file.
4593 CmdArgs.push_back("-ldylib1.o");
4594 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004595 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4596 CmdArgs.push_back("-ldylib1.o");
4597 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004598 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004599 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004600 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004601 CmdArgs.push_back("-ldylib1.10.5.o");
4602 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004603 } else {
4604 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004605 if (!Args.hasArg(options::OPT_static)) {
4606 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004607 if (getDarwinToolChain().isTargetIOSSimulator()) {
4608 // The simulator doesn't have a versioned crt1 file.
4609 CmdArgs.push_back("-lbundle1.o");
4610 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004611 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4612 CmdArgs.push_back("-lbundle1.o");
4613 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004614 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004615 CmdArgs.push_back("-lbundle1.o");
4616 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004617 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004618 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004619 if (Args.hasArg(options::OPT_pg) &&
4620 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004621 if (Args.hasArg(options::OPT_static) ||
4622 Args.hasArg(options::OPT_object) ||
4623 Args.hasArg(options::OPT_preload)) {
4624 CmdArgs.push_back("-lgcrt0.o");
4625 } else {
4626 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004627
Daniel Dunbarc1964212009-03-26 16:23:12 +00004628 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004629 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004630 // By default on OS X 10.8 and later, we don't link with a crt1.o
4631 // file and the linker knows to use _main as the entry point. But,
4632 // when compiling with -pg, we need to link with the gcrt1.o file,
4633 // so pass the -no_new_main option to tell the linker to use the
4634 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004635 if (getDarwinToolChain().isTargetMacOS() &&
4636 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4637 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004638 } else {
4639 if (Args.hasArg(options::OPT_static) ||
4640 Args.hasArg(options::OPT_object) ||
4641 Args.hasArg(options::OPT_preload)) {
4642 CmdArgs.push_back("-lcrt0.o");
4643 } else {
4644 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004645 if (getDarwinToolChain().isTargetIOSSimulator()) {
4646 // The simulator doesn't have a versioned crt1 file.
4647 CmdArgs.push_back("-lcrt1.o");
4648 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004649 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4650 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004651 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00004652 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004653 } else {
4654 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4655 CmdArgs.push_back("-lcrt1.o");
4656 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4657 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004658 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004659 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004660
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004661 // darwin_crt2 spec is empty.
4662 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004663 }
4664 }
4665 }
4666 }
4667
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004668 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4669 Args.hasArg(options::OPT_shared_libgcc) &&
4670 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004671 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004672 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004673 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004674 }
4675 }
4676
4677 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004678
Peter Collingbourne54d770c2013-04-09 04:35:11 +00004679 SanitizerArgs Sanitize(getToolChain(), Args);
Alexey Samsonov969be242013-01-21 08:45:02 +00004680 // If we're building a dynamic lib with -fsanitize=address,
4681 // unresolved symbols may appear. Mark all
Alexey Samsonovcc429802012-11-16 12:53:14 +00004682 // of them as dynamic_lookup. Linking executables is handled in
4683 // lib/Driver/ToolChains.cpp.
Alexey Samsonov969be242013-01-21 08:45:02 +00004684 if (Sanitize.needsAsanRt()) {
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004685 if (Args.hasArg(options::OPT_dynamiclib) ||
4686 Args.hasArg(options::OPT_bundle)) {
4687 CmdArgs.push_back("-undefined");
4688 CmdArgs.push_back("dynamic_lookup");
4689 }
4690 }
4691
Daniel Dunbarc1964212009-03-26 16:23:12 +00004692 if (Args.hasArg(options::OPT_fopenmp))
4693 // This is more complicated in gcc...
4694 CmdArgs.push_back("-lgomp");
4695
Douglas Gregor9295df02012-05-15 21:00:27 +00004696 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4697
Bob Wilson16d93952012-05-15 18:57:39 +00004698 if (isObjCRuntimeLinked(Args) &&
4699 !Args.hasArg(options::OPT_nostdlib) &&
4700 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004701 // Avoid linking compatibility stubs on i386 mac.
4702 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004703 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004704 // If we don't have ARC or subscripting runtime support, link in the
4705 // runtime stubs. We have to do this *before* adding any of the normal
4706 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004707 ObjCRuntime runtime =
4708 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004709 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004710 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004711 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004712 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004713 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004714 CmdArgs.push_back("-framework");
4715 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004716 // Link libobj.
4717 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004718 }
John McCall31168b02011-06-15 23:02:42 +00004719
Daniel Dunbarc1964212009-03-26 16:23:12 +00004720 if (LinkingOutput) {
4721 CmdArgs.push_back("-arch_multiple");
4722 CmdArgs.push_back("-final_output");
4723 CmdArgs.push_back(LinkingOutput);
4724 }
4725
Daniel Dunbarc1964212009-03-26 16:23:12 +00004726 if (Args.hasArg(options::OPT_fnested_functions))
4727 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004728
Daniel Dunbarc1964212009-03-26 16:23:12 +00004729 if (!Args.hasArg(options::OPT_nostdlib) &&
4730 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004731 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004732 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004733
Daniel Dunbarc1964212009-03-26 16:23:12 +00004734 // link_ssp spec is empty.
4735
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004736 // Let the tool chain choose which runtime library to link.
4737 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004738 }
4739
Chad Rosier06fd3c62012-05-16 23:45:12 +00004740 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004741 !Args.hasArg(options::OPT_nostartfiles)) {
4742 // endfile_spec is empty.
4743 }
4744
4745 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4746 Args.AddAllArgs(CmdArgs, options::OPT_F);
4747
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004748 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004749 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004750 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004751}
4752
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004753void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004754 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004755 const InputInfoList &Inputs,
4756 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004757 const char *LinkingOutput) const {
4758 ArgStringList CmdArgs;
4759
4760 CmdArgs.push_back("-create");
4761 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004762
4763 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004764 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004765
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004766 for (InputInfoList::const_iterator
4767 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4768 const InputInfo &II = *it;
4769 assert(II.isFilename() && "Unexpected lipo input.");
4770 CmdArgs.push_back(II.getFilename());
4771 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004772 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004773 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004774 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004775}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004776
Daniel Dunbar88299622010-06-04 18:28:36 +00004777void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004778 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004779 const InputInfoList &Inputs,
4780 const ArgList &Args,
4781 const char *LinkingOutput) const {
4782 ArgStringList CmdArgs;
4783
Daniel Dunbareb86b042011-05-09 17:23:16 +00004784 CmdArgs.push_back("-o");
4785 CmdArgs.push_back(Output.getFilename());
4786
Daniel Dunbar88299622010-06-04 18:28:36 +00004787 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4788 const InputInfo &Input = Inputs[0];
4789 assert(Input.isFilename() && "Unexpected dsymutil input.");
4790 CmdArgs.push_back(Input.getFilename());
4791
Daniel Dunbar88299622010-06-04 18:28:36 +00004792 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004793 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004794 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004795}
4796
Eric Christopher551ef452011-08-23 17:56:55 +00004797void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00004798 const InputInfo &Output,
4799 const InputInfoList &Inputs,
4800 const ArgList &Args,
4801 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00004802 ArgStringList CmdArgs;
4803 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004804 CmdArgs.push_back("--debug-info");
4805 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004806 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004807
4808 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4809 const InputInfo &Input = Inputs[0];
4810 assert(Input.isFilename() && "Unexpected verify input");
4811
4812 // Grabbing the output of the earlier dsymutil run.
4813 CmdArgs.push_back(Input.getFilename());
4814
4815 const char *Exec =
4816 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4817 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4818}
4819
David Chisnallf571cde2012-02-15 13:39:01 +00004820void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4821 const InputInfo &Output,
4822 const InputInfoList &Inputs,
4823 const ArgList &Args,
4824 const char *LinkingOutput) const {
4825 ArgStringList CmdArgs;
4826
4827 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4828 options::OPT_Xassembler);
4829
4830 CmdArgs.push_back("-o");
4831 CmdArgs.push_back(Output.getFilename());
4832
4833 for (InputInfoList::const_iterator
4834 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4835 const InputInfo &II = *it;
4836 CmdArgs.push_back(II.getFilename());
4837 }
4838
4839 const char *Exec =
4840 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4841 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4842}
4843
4844
4845void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4846 const InputInfo &Output,
4847 const InputInfoList &Inputs,
4848 const ArgList &Args,
4849 const char *LinkingOutput) const {
4850 // FIXME: Find a real GCC, don't hard-code versions here
4851 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4852 const llvm::Triple &T = getToolChain().getTriple();
4853 std::string LibPath = "/usr/lib/";
4854 llvm::Triple::ArchType Arch = T.getArch();
4855 switch (Arch) {
4856 case llvm::Triple::x86:
4857 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4858 T.getOSName()).str() + "/4.5.2/";
4859 break;
4860 case llvm::Triple::x86_64:
4861 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4862 T.getOSName()).str();
4863 GCCLibPath += "/4.5.2/amd64/";
4864 LibPath += "amd64/";
4865 break;
4866 default:
4867 assert(0 && "Unsupported architecture");
4868 }
4869
4870 ArgStringList CmdArgs;
4871
David Chisnall272a0712012-02-29 15:06:12 +00004872 // Demangle C++ names in errors
4873 CmdArgs.push_back("-C");
4874
David Chisnallf571cde2012-02-15 13:39:01 +00004875 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4876 (!Args.hasArg(options::OPT_shared))) {
4877 CmdArgs.push_back("-e");
4878 CmdArgs.push_back("_start");
4879 }
4880
4881 if (Args.hasArg(options::OPT_static)) {
4882 CmdArgs.push_back("-Bstatic");
4883 CmdArgs.push_back("-dn");
4884 } else {
4885 CmdArgs.push_back("-Bdynamic");
4886 if (Args.hasArg(options::OPT_shared)) {
4887 CmdArgs.push_back("-shared");
4888 } else {
4889 CmdArgs.push_back("--dynamic-linker");
4890 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4891 }
4892 }
4893
4894 if (Output.isFilename()) {
4895 CmdArgs.push_back("-o");
4896 CmdArgs.push_back(Output.getFilename());
4897 } else {
4898 assert(Output.isNothing() && "Invalid output.");
4899 }
4900
4901 if (!Args.hasArg(options::OPT_nostdlib) &&
4902 !Args.hasArg(options::OPT_nostartfiles)) {
4903 if (!Args.hasArg(options::OPT_shared)) {
4904 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4905 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004906 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004907 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4908 } else {
4909 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004910 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4911 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004912 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004913 if (getToolChain().getDriver().CCCIsCXX)
4914 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004915 }
4916
4917 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4918
4919 Args.AddAllArgs(CmdArgs, options::OPT_L);
4920 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4921 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004922 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00004923
4924 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4925
4926 if (!Args.hasArg(options::OPT_nostdlib) &&
4927 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00004928 if (getToolChain().getDriver().CCCIsCXX)
4929 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00004930 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004931 if (!Args.hasArg(options::OPT_shared)) {
4932 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00004933 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00004934 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004935 }
David Chisnallf571cde2012-02-15 13:39:01 +00004936 }
4937
4938 if (!Args.hasArg(options::OPT_nostdlib) &&
4939 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00004940 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004941 }
David Chisnall96de9932012-02-16 16:00:47 +00004942 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004943
4944 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4945
4946 const char *Exec =
4947 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4948 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4949}
4950
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004951void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004952 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004953 const InputInfoList &Inputs,
4954 const ArgList &Args,
4955 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004956 ArgStringList CmdArgs;
4957
4958 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4959 options::OPT_Xassembler);
4960
4961 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004962 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004963
4964 for (InputInfoList::const_iterator
4965 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4966 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004967 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004968 }
4969
4970 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004971 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004972 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004973}
4974
4975void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004976 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004977 const InputInfoList &Inputs,
4978 const ArgList &Args,
4979 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004980 ArgStringList CmdArgs;
4981
4982 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004983 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004984 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004985 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004986 }
4987
4988 if (Args.hasArg(options::OPT_static)) {
4989 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004990 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004991 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004992// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004993 CmdArgs.push_back("-Bdynamic");
4994 if (Args.hasArg(options::OPT_shared)) {
4995 CmdArgs.push_back("-shared");
4996 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00004997 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004998 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4999 }
5000 }
5001
Daniel Dunbarb440f562010-08-02 02:38:21 +00005002 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005003 CmdArgs.push_back("-o");
5004 CmdArgs.push_back(Output.getFilename());
5005 } else {
5006 assert(Output.isNothing() && "Invalid output.");
5007 }
5008
5009 if (!Args.hasArg(options::OPT_nostdlib) &&
5010 !Args.hasArg(options::OPT_nostartfiles)) {
5011 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005012 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005013 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005014 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005015 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005016 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005017 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005018 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005019 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005020 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005021 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005022 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005023 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005024 }
5025
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005026 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5027 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005028 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005029
5030 Args.AddAllArgs(CmdArgs, options::OPT_L);
5031 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5032 Args.AddAllArgs(CmdArgs, options::OPT_e);
5033
Daniel Dunbar54423b22010-09-17 00:24:54 +00005034 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005035
5036 if (!Args.hasArg(options::OPT_nostdlib) &&
5037 !Args.hasArg(options::OPT_nodefaultlibs)) {
5038 // FIXME: For some reason GCC passes -lgcc before adding
5039 // the default system libraries. Just mimic this for now.
5040 CmdArgs.push_back("-lgcc");
5041
5042 if (Args.hasArg(options::OPT_pthread))
5043 CmdArgs.push_back("-pthread");
5044 if (!Args.hasArg(options::OPT_shared))
5045 CmdArgs.push_back("-lc");
5046 CmdArgs.push_back("-lgcc");
5047 }
5048
5049 if (!Args.hasArg(options::OPT_nostdlib) &&
5050 !Args.hasArg(options::OPT_nostartfiles)) {
5051 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005052 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005053 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005054 }
5055
Bill Wendling08760582011-06-27 19:15:03 +00005056 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005057
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005058 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005059 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005060 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005061}
5062
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005063void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005064 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005065 const InputInfoList &Inputs,
5066 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005067 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005068 ArgStringList CmdArgs;
5069
5070 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5071 options::OPT_Xassembler);
5072
5073 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005074 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005075
5076 for (InputInfoList::const_iterator
5077 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5078 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005079 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005080 }
5081
5082 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005083 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005084 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005085}
5086
5087void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005088 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005089 const InputInfoList &Inputs,
5090 const ArgList &Args,
5091 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005092 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005093 ArgStringList CmdArgs;
5094
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005095 // Silence warning for "clang -g foo.o -o foo"
5096 Args.ClaimAllArgs(options::OPT_g_Group);
5097 // and "clang -emit-llvm foo.o -o foo"
5098 Args.ClaimAllArgs(options::OPT_emit_llvm);
5099 // and for "clang -w foo.o -o foo". Other warning options are already
5100 // handled somewhere else.
5101 Args.ClaimAllArgs(options::OPT_w);
5102
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005103 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005104 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005105 CmdArgs.push_back("-e");
5106 CmdArgs.push_back("__start");
5107 }
5108
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005109 if (Args.hasArg(options::OPT_static)) {
5110 CmdArgs.push_back("-Bstatic");
5111 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005112 if (Args.hasArg(options::OPT_rdynamic))
5113 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005114 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005115 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005116 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005117 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005118 } else {
5119 CmdArgs.push_back("-dynamic-linker");
5120 CmdArgs.push_back("/usr/libexec/ld.so");
5121 }
5122 }
5123
Daniel Dunbarb440f562010-08-02 02:38:21 +00005124 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005125 CmdArgs.push_back("-o");
5126 CmdArgs.push_back(Output.getFilename());
5127 } else {
5128 assert(Output.isNothing() && "Invalid output.");
5129 }
5130
5131 if (!Args.hasArg(options::OPT_nostdlib) &&
5132 !Args.hasArg(options::OPT_nostartfiles)) {
5133 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00005134 if (Args.hasArg(options::OPT_pg))
5135 CmdArgs.push_back(Args.MakeArgString(
5136 getToolChain().GetFilePath("gcrt0.o")));
5137 else
5138 CmdArgs.push_back(Args.MakeArgString(
5139 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005140 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005141 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005142 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005143 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005144 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005145 }
5146 }
5147
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005148 std::string Triple = getToolChain().getTripleString();
5149 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005150 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005151 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005152 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005153
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005154 Args.AddAllArgs(CmdArgs, options::OPT_L);
5155 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5156 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005157 Args.AddAllArgs(CmdArgs, options::OPT_s);
5158 Args.AddAllArgs(CmdArgs, options::OPT_t);
5159 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5160 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005161
Daniel Dunbar54423b22010-09-17 00:24:54 +00005162 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005163
5164 if (!Args.hasArg(options::OPT_nostdlib) &&
5165 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005166 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005167 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005168 if (Args.hasArg(options::OPT_pg))
5169 CmdArgs.push_back("-lm_p");
5170 else
5171 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005172 }
5173
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005174 // FIXME: For some reason GCC passes -lgcc before adding
5175 // the default system libraries. Just mimic this for now.
5176 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005177
Eric Christopher17674ec2012-09-13 06:32:34 +00005178 if (Args.hasArg(options::OPT_pthread)) {
5179 if (!Args.hasArg(options::OPT_shared) &&
5180 Args.hasArg(options::OPT_pg))
5181 CmdArgs.push_back("-lpthread_p");
5182 else
5183 CmdArgs.push_back("-lpthread");
5184 }
5185
Chandler Carruth45661652011-12-17 22:32:42 +00005186 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005187 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005188 CmdArgs.push_back("-lc_p");
5189 else
5190 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005191 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005192
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005193 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005194 }
5195
5196 if (!Args.hasArg(options::OPT_nostdlib) &&
5197 !Args.hasArg(options::OPT_nostartfiles)) {
5198 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005199 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005200 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005201 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005202 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005203 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005204 }
5205
5206 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005207 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005208 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005209}
Ed Schoutene33194b2009-04-02 19:13:12 +00005210
Eli Friedman9fa28852012-08-08 23:57:20 +00005211void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5212 const InputInfo &Output,
5213 const InputInfoList &Inputs,
5214 const ArgList &Args,
5215 const char *LinkingOutput) const {
5216 ArgStringList CmdArgs;
5217
5218 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5219 options::OPT_Xassembler);
5220
5221 CmdArgs.push_back("-o");
5222 CmdArgs.push_back(Output.getFilename());
5223
5224 for (InputInfoList::const_iterator
5225 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5226 const InputInfo &II = *it;
5227 CmdArgs.push_back(II.getFilename());
5228 }
5229
5230 const char *Exec =
5231 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5232 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5233}
5234
5235void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5236 const InputInfo &Output,
5237 const InputInfoList &Inputs,
5238 const ArgList &Args,
5239 const char *LinkingOutput) const {
5240 const Driver &D = getToolChain().getDriver();
5241 ArgStringList CmdArgs;
5242
5243 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5244 (!Args.hasArg(options::OPT_shared))) {
5245 CmdArgs.push_back("-e");
5246 CmdArgs.push_back("__start");
5247 }
5248
5249 if (Args.hasArg(options::OPT_static)) {
5250 CmdArgs.push_back("-Bstatic");
5251 } else {
5252 if (Args.hasArg(options::OPT_rdynamic))
5253 CmdArgs.push_back("-export-dynamic");
5254 CmdArgs.push_back("--eh-frame-hdr");
5255 CmdArgs.push_back("-Bdynamic");
5256 if (Args.hasArg(options::OPT_shared)) {
5257 CmdArgs.push_back("-shared");
5258 } else {
5259 CmdArgs.push_back("-dynamic-linker");
5260 CmdArgs.push_back("/usr/libexec/ld.so");
5261 }
5262 }
5263
5264 if (Output.isFilename()) {
5265 CmdArgs.push_back("-o");
5266 CmdArgs.push_back(Output.getFilename());
5267 } else {
5268 assert(Output.isNothing() && "Invalid output.");
5269 }
5270
5271 if (!Args.hasArg(options::OPT_nostdlib) &&
5272 !Args.hasArg(options::OPT_nostartfiles)) {
5273 if (!Args.hasArg(options::OPT_shared)) {
5274 if (Args.hasArg(options::OPT_pg))
5275 CmdArgs.push_back(Args.MakeArgString(
5276 getToolChain().GetFilePath("gcrt0.o")));
5277 else
5278 CmdArgs.push_back(Args.MakeArgString(
5279 getToolChain().GetFilePath("crt0.o")));
5280 CmdArgs.push_back(Args.MakeArgString(
5281 getToolChain().GetFilePath("crtbegin.o")));
5282 } else {
5283 CmdArgs.push_back(Args.MakeArgString(
5284 getToolChain().GetFilePath("crtbeginS.o")));
5285 }
5286 }
5287
5288 Args.AddAllArgs(CmdArgs, options::OPT_L);
5289 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5290 Args.AddAllArgs(CmdArgs, options::OPT_e);
5291
5292 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5293
5294 if (!Args.hasArg(options::OPT_nostdlib) &&
5295 !Args.hasArg(options::OPT_nodefaultlibs)) {
5296 if (D.CCCIsCXX) {
5297 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5298 if (Args.hasArg(options::OPT_pg))
5299 CmdArgs.push_back("-lm_p");
5300 else
5301 CmdArgs.push_back("-lm");
5302 }
5303
Rafael Espindola1ad26f02012-10-23 17:07:31 +00005304 if (Args.hasArg(options::OPT_pthread)) {
5305 if (!Args.hasArg(options::OPT_shared) &&
5306 Args.hasArg(options::OPT_pg))
5307 CmdArgs.push_back("-lpthread_p");
5308 else
5309 CmdArgs.push_back("-lpthread");
5310 }
5311
Eli Friedman9fa28852012-08-08 23:57:20 +00005312 if (!Args.hasArg(options::OPT_shared)) {
5313 if (Args.hasArg(options::OPT_pg))
5314 CmdArgs.push_back("-lc_p");
5315 else
5316 CmdArgs.push_back("-lc");
5317 }
5318
5319 std::string myarch = "-lclang_rt.";
5320 const llvm::Triple &T = getToolChain().getTriple();
5321 llvm::Triple::ArchType Arch = T.getArch();
5322 switch (Arch) {
5323 case llvm::Triple::arm:
5324 myarch += ("arm");
5325 break;
5326 case llvm::Triple::x86:
5327 myarch += ("i386");
5328 break;
5329 case llvm::Triple::x86_64:
5330 myarch += ("amd64");
5331 break;
5332 default:
5333 assert(0 && "Unsupported architecture");
5334 }
5335 CmdArgs.push_back(Args.MakeArgString(myarch));
5336 }
5337
5338 if (!Args.hasArg(options::OPT_nostdlib) &&
5339 !Args.hasArg(options::OPT_nostartfiles)) {
5340 if (!Args.hasArg(options::OPT_shared))
5341 CmdArgs.push_back(Args.MakeArgString(
5342 getToolChain().GetFilePath("crtend.o")));
5343 else
5344 CmdArgs.push_back(Args.MakeArgString(
5345 getToolChain().GetFilePath("crtendS.o")));
5346 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005347
5348 const char *Exec =
5349 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5350 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005351}
5352
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005353void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005354 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005355 const InputInfoList &Inputs,
5356 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005357 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005358 ArgStringList CmdArgs;
5359
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005360 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5361 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005362 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005363 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005364 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005365 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005366 else if (getToolChain().getArch() == llvm::Triple::mips ||
5367 getToolChain().getArch() == llvm::Triple::mipsel ||
5368 getToolChain().getArch() == llvm::Triple::mips64 ||
5369 getToolChain().getArch() == llvm::Triple::mips64el) {
5370 StringRef CPUName;
5371 StringRef ABIName;
5372 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005373
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005374 CmdArgs.push_back("-march");
5375 CmdArgs.push_back(CPUName.data());
5376
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005377 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005378 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005379
5380 if (getToolChain().getArch() == llvm::Triple::mips ||
5381 getToolChain().getArch() == llvm::Triple::mips64)
5382 CmdArgs.push_back("-EB");
5383 else
5384 CmdArgs.push_back("-EL");
5385
5386 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5387 options::OPT_fpic, options::OPT_fno_pic,
5388 options::OPT_fPIE, options::OPT_fno_PIE,
5389 options::OPT_fpie, options::OPT_fno_pie);
5390 if (LastPICArg &&
5391 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5392 LastPICArg->getOption().matches(options::OPT_fpic) ||
5393 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5394 LastPICArg->getOption().matches(options::OPT_fpie))) {
5395 CmdArgs.push_back("-KPIC");
5396 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005397 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5398 getToolChain().getArch() == llvm::Triple::thumb) {
5399 CmdArgs.push_back("-mfpu=softvfp");
5400 switch(getToolChain().getTriple().getEnvironment()) {
5401 case llvm::Triple::GNUEABI:
5402 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00005403 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005404 break;
5405
5406 default:
5407 CmdArgs.push_back("-matpcs");
5408 }
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005409 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005410
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005411 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5412 options::OPT_Xassembler);
5413
5414 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005415 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005416
5417 for (InputInfoList::const_iterator
5418 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5419 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005420 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005421 }
5422
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005423 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005424 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005425 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005426}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005427
5428void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005429 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005430 const InputInfoList &Inputs,
5431 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005432 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005433 const toolchains::FreeBSD& ToolChain =
5434 static_cast<const toolchains::FreeBSD&>(getToolChain());
5435 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005436 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005437
5438 // Silence warning for "clang -g foo.o -o foo"
5439 Args.ClaimAllArgs(options::OPT_g_Group);
5440 // and "clang -emit-llvm foo.o -o foo"
5441 Args.ClaimAllArgs(options::OPT_emit_llvm);
5442 // and for "clang -w foo.o -o foo". Other warning options are already
5443 // handled somewhere else.
5444 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005445
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005446 if (!D.SysRoot.empty())
5447 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5448
Roman Divackyafe2f232012-08-28 15:09:03 +00005449 if (Args.hasArg(options::OPT_pie))
5450 CmdArgs.push_back("-pie");
5451
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005452 if (Args.hasArg(options::OPT_static)) {
5453 CmdArgs.push_back("-Bstatic");
5454 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005455 if (Args.hasArg(options::OPT_rdynamic))
5456 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005457 CmdArgs.push_back("--eh-frame-hdr");
5458 if (Args.hasArg(options::OPT_shared)) {
5459 CmdArgs.push_back("-Bshareable");
5460 } else {
5461 CmdArgs.push_back("-dynamic-linker");
5462 CmdArgs.push_back("/libexec/ld-elf.so.1");
5463 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005464 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5465 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005466 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5467 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5468 CmdArgs.push_back("--hash-style=both");
5469 }
5470 }
5471 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005472 }
5473
5474 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5475 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005476 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005477 CmdArgs.push_back("-m");
5478 CmdArgs.push_back("elf_i386_fbsd");
5479 }
5480
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005481 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005482 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005483 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005484 }
5485
Daniel Dunbarb440f562010-08-02 02:38:21 +00005486 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005487 CmdArgs.push_back("-o");
5488 CmdArgs.push_back(Output.getFilename());
5489 } else {
5490 assert(Output.isNothing() && "Invalid output.");
5491 }
5492
5493 if (!Args.hasArg(options::OPT_nostdlib) &&
5494 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005495 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005496 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005497 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005498 crt1 = "gcrt1.o";
5499 else if (Args.hasArg(options::OPT_pie))
5500 crt1 = "Scrt1.o";
5501 else
5502 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005503 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005504 if (crt1)
5505 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5506
5507 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5508
5509 const char *crtbegin = NULL;
5510 if (Args.hasArg(options::OPT_static))
5511 crtbegin = "crtbeginT.o";
5512 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5513 crtbegin = "crtbeginS.o";
5514 else
5515 crtbegin = "crtbegin.o";
5516
5517 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005518 }
5519
5520 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005521 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005522 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5523 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005524 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005525 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5526 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005527 Args.AddAllArgs(CmdArgs, options::OPT_s);
5528 Args.AddAllArgs(CmdArgs, options::OPT_t);
5529 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5530 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005531
Roman Divackyafe2f232012-08-28 15:09:03 +00005532 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005533
5534 if (!Args.hasArg(options::OPT_nostdlib) &&
5535 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005536 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005537 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005538 if (Args.hasArg(options::OPT_pg))
5539 CmdArgs.push_back("-lm_p");
5540 else
5541 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005542 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005543 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5544 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005545 if (Args.hasArg(options::OPT_pg))
5546 CmdArgs.push_back("-lgcc_p");
5547 else
5548 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005549 if (Args.hasArg(options::OPT_static)) {
5550 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005551 } else if (Args.hasArg(options::OPT_pg)) {
5552 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005553 } else {
5554 CmdArgs.push_back("--as-needed");
5555 CmdArgs.push_back("-lgcc_s");
5556 CmdArgs.push_back("--no-as-needed");
5557 }
5558
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005559 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005560 if (Args.hasArg(options::OPT_pg))
5561 CmdArgs.push_back("-lpthread_p");
5562 else
5563 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005564 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005565
Roman Divacky66f22762011-02-10 16:59:40 +00005566 if (Args.hasArg(options::OPT_pg)) {
5567 if (Args.hasArg(options::OPT_shared))
5568 CmdArgs.push_back("-lc");
5569 else
5570 CmdArgs.push_back("-lc_p");
5571 CmdArgs.push_back("-lgcc_p");
5572 } else {
5573 CmdArgs.push_back("-lc");
5574 CmdArgs.push_back("-lgcc");
5575 }
5576
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005577 if (Args.hasArg(options::OPT_static)) {
5578 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005579 } else if (Args.hasArg(options::OPT_pg)) {
5580 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005581 } else {
5582 CmdArgs.push_back("--as-needed");
5583 CmdArgs.push_back("-lgcc_s");
5584 CmdArgs.push_back("--no-as-needed");
5585 }
5586 }
5587
5588 if (!Args.hasArg(options::OPT_nostdlib) &&
5589 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005590 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005591 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005592 else
5593 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005594 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005595 }
5596
Roman Divackyafe2f232012-08-28 15:09:03 +00005597 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005598
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005599 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005600 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005601 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005602}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005603
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005604void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5605 const InputInfo &Output,
5606 const InputInfoList &Inputs,
5607 const ArgList &Args,
5608 const char *LinkingOutput) const {
5609 ArgStringList CmdArgs;
5610
5611 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5612 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005613 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005614 CmdArgs.push_back("--32");
5615
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005616 // Set byte order explicitly
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005617 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005618 CmdArgs.push_back("-EB");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005619 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005620 CmdArgs.push_back("-EL");
5621
5622 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5623 options::OPT_Xassembler);
5624
5625 CmdArgs.push_back("-o");
5626 CmdArgs.push_back(Output.getFilename());
5627
5628 for (InputInfoList::const_iterator
5629 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5630 const InputInfo &II = *it;
5631 CmdArgs.push_back(II.getFilename());
5632 }
5633
David Chisnallddbd68f2011-09-27 22:03:18 +00005634 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005635 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5636}
5637
5638void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5639 const InputInfo &Output,
5640 const InputInfoList &Inputs,
5641 const ArgList &Args,
5642 const char *LinkingOutput) const {
5643 const Driver &D = getToolChain().getDriver();
5644 ArgStringList CmdArgs;
5645
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005646 if (!D.SysRoot.empty())
5647 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5648
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005649 if (Args.hasArg(options::OPT_static)) {
5650 CmdArgs.push_back("-Bstatic");
5651 } else {
5652 if (Args.hasArg(options::OPT_rdynamic))
5653 CmdArgs.push_back("-export-dynamic");
5654 CmdArgs.push_back("--eh-frame-hdr");
5655 if (Args.hasArg(options::OPT_shared)) {
5656 CmdArgs.push_back("-Bshareable");
5657 } else {
5658 CmdArgs.push_back("-dynamic-linker");
5659 CmdArgs.push_back("/libexec/ld.elf_so");
5660 }
5661 }
5662
5663 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5664 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005665 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005666 CmdArgs.push_back("-m");
5667 CmdArgs.push_back("elf_i386");
5668 }
5669
5670 if (Output.isFilename()) {
5671 CmdArgs.push_back("-o");
5672 CmdArgs.push_back(Output.getFilename());
5673 } else {
5674 assert(Output.isNothing() && "Invalid output.");
5675 }
5676
5677 if (!Args.hasArg(options::OPT_nostdlib) &&
5678 !Args.hasArg(options::OPT_nostartfiles)) {
5679 if (!Args.hasArg(options::OPT_shared)) {
5680 CmdArgs.push_back(Args.MakeArgString(
5681 getToolChain().GetFilePath("crt0.o")));
5682 CmdArgs.push_back(Args.MakeArgString(
5683 getToolChain().GetFilePath("crti.o")));
5684 CmdArgs.push_back(Args.MakeArgString(
5685 getToolChain().GetFilePath("crtbegin.o")));
5686 } else {
5687 CmdArgs.push_back(Args.MakeArgString(
5688 getToolChain().GetFilePath("crti.o")));
5689 CmdArgs.push_back(Args.MakeArgString(
5690 getToolChain().GetFilePath("crtbeginS.o")));
5691 }
5692 }
5693
5694 Args.AddAllArgs(CmdArgs, options::OPT_L);
5695 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5696 Args.AddAllArgs(CmdArgs, options::OPT_e);
5697 Args.AddAllArgs(CmdArgs, options::OPT_s);
5698 Args.AddAllArgs(CmdArgs, options::OPT_t);
5699 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5700 Args.AddAllArgs(CmdArgs, options::OPT_r);
5701
5702 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5703
5704 if (!Args.hasArg(options::OPT_nostdlib) &&
5705 !Args.hasArg(options::OPT_nodefaultlibs)) {
5706 if (D.CCCIsCXX) {
5707 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5708 CmdArgs.push_back("-lm");
5709 }
5710 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5711 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005712 if (Args.hasArg(options::OPT_static)) {
5713 CmdArgs.push_back("-lgcc_eh");
5714 } else {
5715 CmdArgs.push_back("--as-needed");
5716 CmdArgs.push_back("-lgcc_s");
5717 CmdArgs.push_back("--no-as-needed");
5718 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005719 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005720
5721 if (Args.hasArg(options::OPT_pthread))
5722 CmdArgs.push_back("-lpthread");
5723 CmdArgs.push_back("-lc");
5724
5725 CmdArgs.push_back("-lgcc");
5726 if (Args.hasArg(options::OPT_static)) {
5727 CmdArgs.push_back("-lgcc_eh");
5728 } else {
5729 CmdArgs.push_back("--as-needed");
5730 CmdArgs.push_back("-lgcc_s");
5731 CmdArgs.push_back("--no-as-needed");
5732 }
5733 }
5734
5735 if (!Args.hasArg(options::OPT_nostdlib) &&
5736 !Args.hasArg(options::OPT_nostartfiles)) {
5737 if (!Args.hasArg(options::OPT_shared))
5738 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5739 "crtend.o")));
5740 else
5741 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5742 "crtendS.o")));
5743 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5744 "crtn.o")));
5745 }
5746
Bill Wendling08760582011-06-27 19:15:03 +00005747 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005748
David Chisnallddbd68f2011-09-27 22:03:18 +00005749 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005750 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5751}
5752
Thomas Schwinge4e555262013-03-28 19:04:25 +00005753void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5754 const InputInfo &Output,
5755 const InputInfoList &Inputs,
5756 const ArgList &Args,
5757 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00005758 ArgStringList CmdArgs;
5759
5760 // Add --32/--64 to make sure we get the format we want.
5761 // This is incomplete
5762 if (getToolChain().getArch() == llvm::Triple::x86) {
5763 CmdArgs.push_back("--32");
5764 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5765 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005766 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5767 CmdArgs.push_back("-a32");
5768 CmdArgs.push_back("-mppc");
5769 CmdArgs.push_back("-many");
5770 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5771 CmdArgs.push_back("-a64");
5772 CmdArgs.push_back("-mppc64");
5773 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005774 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005775 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005776 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5777 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005778
5779 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5780 getToolChain().getTriple());
5781 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005782
5783 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5784 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5785 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005786 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5787 getToolChain().getArch() == llvm::Triple::mipsel ||
5788 getToolChain().getArch() == llvm::Triple::mips64 ||
5789 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005790 StringRef CPUName;
5791 StringRef ABIName;
5792 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005793
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005794 CmdArgs.push_back("-march");
5795 CmdArgs.push_back(CPUName.data());
5796
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005797 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005798 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005799
5800 if (getToolChain().getArch() == llvm::Triple::mips ||
5801 getToolChain().getArch() == llvm::Triple::mips64)
5802 CmdArgs.push_back("-EB");
5803 else
5804 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005805
5806 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5807 options::OPT_fpic, options::OPT_fno_pic,
5808 options::OPT_fPIE, options::OPT_fno_PIE,
5809 options::OPT_fpie, options::OPT_fno_pie);
5810 if (LastPICArg &&
5811 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5812 LastPICArg->getOption().matches(options::OPT_fpic) ||
5813 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5814 LastPICArg->getOption().matches(options::OPT_fpie))) {
5815 CmdArgs.push_back("-KPIC");
5816 }
Rafael Espindola92b00932010-08-10 00:25:48 +00005817 }
5818
5819 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5820 options::OPT_Xassembler);
5821
5822 CmdArgs.push_back("-o");
5823 CmdArgs.push_back(Output.getFilename());
5824
5825 for (InputInfoList::const_iterator
5826 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5827 const InputInfo &II = *it;
5828 CmdArgs.push_back(II.getFilename());
5829 }
5830
5831 const char *Exec =
5832 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5833 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5834}
5835
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005836static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5837 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00005838 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00005839 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
5840 Args.hasArg(options::OPT_static);
Rafael Espindolacc354322011-10-17 21:39:04 +00005841 if (!D.CCCIsCXX)
5842 CmdArgs.push_back("-lgcc");
5843
Logan Chien3d3373c2012-11-19 12:04:11 +00005844 if (StaticLibgcc || isAndroid) {
Rafael Espindolacc354322011-10-17 21:39:04 +00005845 if (D.CCCIsCXX)
5846 CmdArgs.push_back("-lgcc");
5847 } else {
5848 if (!D.CCCIsCXX)
5849 CmdArgs.push_back("--as-needed");
5850 CmdArgs.push_back("-lgcc_s");
5851 if (!D.CCCIsCXX)
5852 CmdArgs.push_back("--no-as-needed");
5853 }
5854
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005855 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005856 CmdArgs.push_back("-lgcc_eh");
5857 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5858 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00005859
5860 // According to Android ABI, we have to link with libdl if we are
5861 // linking with non-static libgcc.
5862 //
5863 // NOTE: This fixes a link error on Android MIPS as well. The non-static
5864 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
5865 if (isAndroid && !StaticLibgcc)
5866 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00005867}
5868
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005869static bool hasMipsN32ABIArg(const ArgList &Args) {
5870 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smithbd55daf2012-11-01 04:30:05 +00005871 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005872}
5873
Thomas Schwinge4e555262013-03-28 19:04:25 +00005874void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5875 const InputInfo &Output,
5876 const InputInfoList &Inputs,
5877 const ArgList &Args,
5878 const char *LinkingOutput) const {
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005879 const toolchains::Linux& ToolChain =
5880 static_cast<const toolchains::Linux&>(getToolChain());
5881 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00005882 const bool isAndroid =
5883 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00005884 SanitizerArgs Sanitize(getToolChain(), Args);
5885 const bool IsPIE =
5886 !Args.hasArg(options::OPT_shared) &&
5887 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005888
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005889 ArgStringList CmdArgs;
5890
Rafael Espindolad1002f62010-11-15 18:28:16 +00005891 // Silence warning for "clang -g foo.o -o foo"
5892 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005893 // and "clang -emit-llvm foo.o -o foo"
5894 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00005895 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005896 // handled somewhere else.
5897 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005898
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005899 if (!D.SysRoot.empty())
5900 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005901
Peter Collingbourne54d770c2013-04-09 04:35:11 +00005902 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00005903 CmdArgs.push_back("-pie");
5904
Rafael Espindola1c76c592010-11-07 22:57:16 +00005905 if (Args.hasArg(options::OPT_rdynamic))
5906 CmdArgs.push_back("-export-dynamic");
5907
Rafael Espindola34d77dc2010-11-11 19:34:42 +00005908 if (Args.hasArg(options::OPT_s))
5909 CmdArgs.push_back("-s");
5910
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005911 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5912 e = ToolChain.ExtraOpts.end();
5913 i != e; ++i)
5914 CmdArgs.push_back(i->c_str());
5915
5916 if (!Args.hasArg(options::OPT_static)) {
5917 CmdArgs.push_back("--eh-frame-hdr");
5918 }
5919
5920 CmdArgs.push_back("-m");
5921 if (ToolChain.getArch() == llvm::Triple::x86)
5922 CmdArgs.push_back("elf_i386");
Tim Northover9bb857a2013-01-31 12:13:10 +00005923 else if (ToolChain.getArch() == llvm::Triple::aarch64)
5924 CmdArgs.push_back("aarch64linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005925 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00005926 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005927 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005928 else if (ToolChain.getArch() == llvm::Triple::ppc)
5929 CmdArgs.push_back("elf32ppclinux");
5930 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5931 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005932 else if (ToolChain.getArch() == llvm::Triple::mips)
5933 CmdArgs.push_back("elf32btsmip");
5934 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5935 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005936 else if (ToolChain.getArch() == llvm::Triple::mips64) {
5937 if (hasMipsN32ABIArg(Args))
5938 CmdArgs.push_back("elf32btsmipn32");
5939 else
5940 CmdArgs.push_back("elf64btsmip");
5941 }
5942 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
5943 if (hasMipsN32ABIArg(Args))
5944 CmdArgs.push_back("elf32ltsmipn32");
5945 else
5946 CmdArgs.push_back("elf64ltsmip");
5947 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005948 else
5949 CmdArgs.push_back("elf_x86_64");
5950
5951 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00005952 if (ToolChain.getArch() == llvm::Triple::arm
5953 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005954 CmdArgs.push_back("-Bstatic");
5955 else
5956 CmdArgs.push_back("-static");
5957 } else if (Args.hasArg(options::OPT_shared)) {
5958 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00005959 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005960 CmdArgs.push_back("-Bsymbolic");
5961 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005962 }
5963
5964 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00005965 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005966 (!Args.hasArg(options::OPT_static) &&
5967 !Args.hasArg(options::OPT_shared))) {
5968 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005969 if (isAndroid)
5970 CmdArgs.push_back("/system/bin/linker");
5971 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005972 CmdArgs.push_back("/lib/ld-linux.so.2");
Tim Northover9bb857a2013-01-31 12:13:10 +00005973 else if (ToolChain.getArch() == llvm::Triple::aarch64)
5974 CmdArgs.push_back("/lib/ld-linux-aarch64.so.1");
Douglas Gregord9bb1522011-03-06 19:11:49 +00005975 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liueabbf922012-07-30 11:05:56 +00005976 ToolChain.getArch() == llvm::Triple::thumb) {
5977 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5978 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5979 else
5980 CmdArgs.push_back("/lib/ld-linux.so.3");
5981 }
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005982 else if (ToolChain.getArch() == llvm::Triple::mips ||
5983 ToolChain.getArch() == llvm::Triple::mipsel)
5984 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan1e1e2e22012-04-06 20:14:27 +00005985 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005986 ToolChain.getArch() == llvm::Triple::mips64el) {
5987 if (hasMipsN32ABIArg(Args))
5988 CmdArgs.push_back("/lib32/ld.so.1");
5989 else
5990 CmdArgs.push_back("/lib64/ld.so.1");
5991 }
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005992 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner20b90d02011-04-11 21:15:37 +00005993 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005994 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner20b90d02011-04-11 21:15:37 +00005995 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005996 else
5997 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5998 }
5999
6000 CmdArgs.push_back("-o");
6001 CmdArgs.push_back(Output.getFilename());
6002
Rafael Espindola81937ec2010-12-01 01:52:43 +00006003 if (!Args.hasArg(options::OPT_nostdlib) &&
6004 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006005 if (!isAndroid) {
6006 const char *crt1 = NULL;
6007 if (!Args.hasArg(options::OPT_shared)){
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006008 if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006009 crt1 = "Scrt1.o";
6010 else
6011 crt1 = "crt1.o";
6012 }
6013 if (crt1)
6014 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006015
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006016 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6017 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006018
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006019 const char *crtbegin;
6020 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006021 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006022 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006023 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006024 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006025 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006026 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006027 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006028 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00006029
6030 // Add crtfastmath.o if available and fast math is enabled.
6031 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006032 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006033
6034 Args.AddAllArgs(CmdArgs, options::OPT_L);
6035
6036 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6037
Roman Divackyee8188a2011-03-01 17:53:14 +00006038 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6039 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006040 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006041
Rafael Espindola9446d762012-04-09 23:53:34 +00006042 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
6043 // as gold requires -plugin to come before any -plugin-opt that -Wl might
6044 // forward.
6045 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
6046 CmdArgs.push_back("-plugin");
6047 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
6048 CmdArgs.push_back(Args.MakeArgString(Plugin));
Chandler Carruth953fb082013-01-13 11:46:33 +00006049
6050 // Try to pass driver level flags relevant to LTO code generation down to
6051 // the plugin.
6052
6053 // Handle architecture-specific flags for selecting CPU variants.
6054 if (ToolChain.getArch() == llvm::Triple::x86 ||
6055 ToolChain.getArch() == llvm::Triple::x86_64)
6056 CmdArgs.push_back(
6057 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6058 getX86TargetCPU(Args, ToolChain.getTriple())));
6059 else if (ToolChain.getArch() == llvm::Triple::arm ||
6060 ToolChain.getArch() == llvm::Triple::thumb)
6061 CmdArgs.push_back(
6062 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6063 getARMTargetCPU(Args, ToolChain.getTriple())));
6064
6065 // FIXME: Factor out logic for MIPS, PPC, and other targets to support this
6066 // as well.
Rafael Espindola9446d762012-04-09 23:53:34 +00006067 }
6068
Chandler Carruth953fb082013-01-13 11:46:33 +00006069
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00006070 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6071 CmdArgs.push_back("--no-demangle");
6072
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006073 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6074
Eric Christopher04997782012-11-29 18:51:05 +00006075 // Call these before we add the C++ ABI library.
Richard Smith52be6192012-11-05 22:04:41 +00006076 if (Sanitize.needsUbsanRt())
Richard Smithcff3cde2013-03-20 23:49:07 +00006077 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX,
6078 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
6079 Sanitize.needsMsanRt());
Eric Christopher04997782012-11-29 18:51:05 +00006080 if (Sanitize.needsAsanRt())
6081 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6082 if (Sanitize.needsTsanRt())
6083 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00006084 if (Sanitize.needsMsanRt())
6085 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith4d3110a2012-10-25 02:14:12 +00006086
Chandler Carruth94a32012012-05-14 18:31:18 +00006087 if (D.CCCIsCXX &&
6088 !Args.hasArg(options::OPT_nostdlib) &&
6089 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00006090 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6091 !Args.hasArg(options::OPT_static);
6092 if (OnlyLibstdcxxStatic)
6093 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006094 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00006095 if (OnlyLibstdcxxStatic)
6096 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006097 CmdArgs.push_back("-lm");
6098 }
6099
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006100 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00006101 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6102 if (Args.hasArg(options::OPT_static))
6103 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00006104
Chandler Carruth01538002013-01-17 13:19:29 +00006105 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6106 if (OpenMP) {
6107 CmdArgs.push_back("-lgomp");
6108
6109 // FIXME: Exclude this for platforms whith libgomp that doesn't require
6110 // librt. Most modern Linux platfroms require it, but some may not.
6111 CmdArgs.push_back("-lrt");
6112 }
6113
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006114 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006115
Chandler Carruth94a32012012-05-14 18:31:18 +00006116 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruth01538002013-01-17 13:19:29 +00006117 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth94a32012012-05-14 18:31:18 +00006118 CmdArgs.push_back("-lpthread");
6119
6120 CmdArgs.push_back("-lc");
6121
6122 if (Args.hasArg(options::OPT_static))
6123 CmdArgs.push_back("--end-group");
6124 else
6125 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6126 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00006127
Rafael Espindola81937ec2010-12-01 01:52:43 +00006128 if (!Args.hasArg(options::OPT_nostartfiles)) {
6129 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006130 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006131 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006132 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006133 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00006134 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006135 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006136
Rafael Espindola81937ec2010-12-01 01:52:43 +00006137 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006138 if (!isAndroid)
6139 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00006140 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006141 }
6142
Bill Wendling08760582011-06-27 19:15:03 +00006143 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006144
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006145 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6146}
Rafael Espindola92b00932010-08-10 00:25:48 +00006147
Chris Lattner3e2ee142010-07-07 16:01:42 +00006148void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006149 const InputInfo &Output,
6150 const InputInfoList &Inputs,
6151 const ArgList &Args,
6152 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006153 ArgStringList CmdArgs;
6154
6155 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6156 options::OPT_Xassembler);
6157
6158 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006159 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006160
6161 for (InputInfoList::const_iterator
6162 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6163 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006164 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006165 }
6166
6167 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00006168 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006169 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006170}
6171
6172void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006173 const InputInfo &Output,
6174 const InputInfoList &Inputs,
6175 const ArgList &Args,
6176 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006177 const Driver &D = getToolChain().getDriver();
6178 ArgStringList CmdArgs;
6179
Daniel Dunbarb440f562010-08-02 02:38:21 +00006180 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006181 CmdArgs.push_back("-o");
6182 CmdArgs.push_back(Output.getFilename());
6183 } else {
6184 assert(Output.isNothing() && "Invalid output.");
6185 }
6186
6187 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00006188 !Args.hasArg(options::OPT_nostartfiles)) {
6189 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6190 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6191 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6192 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6193 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006194
6195 Args.AddAllArgs(CmdArgs, options::OPT_L);
6196 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6197 Args.AddAllArgs(CmdArgs, options::OPT_e);
6198
Daniel Dunbar54423b22010-09-17 00:24:54 +00006199 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006200
Eli Friedman83de5132011-12-08 23:54:21 +00006201 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6202
Chris Lattner3e2ee142010-07-07 16:01:42 +00006203 if (!Args.hasArg(options::OPT_nostdlib) &&
6204 !Args.hasArg(options::OPT_nodefaultlibs)) {
6205 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006206 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006207 CmdArgs.push_back("-lm");
6208 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006209 }
6210
6211 if (!Args.hasArg(options::OPT_nostdlib) &&
6212 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00006213 if (Args.hasArg(options::OPT_pthread))
6214 CmdArgs.push_back("-lpthread");
6215 CmdArgs.push_back("-lc");
6216 CmdArgs.push_back("-lCompilerRT-Generic");
6217 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6218 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00006219 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006220 }
6221
Eli Friedman83de5132011-12-08 23:54:21 +00006222 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006223 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006224}
6225
Daniel Dunbarcc912342009-05-02 18:28:39 +00006226/// DragonFly Tools
6227
6228// For now, DragonFly Assemble does just about the same as for
6229// FreeBSD, but this may change soon.
6230void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006231 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006232 const InputInfoList &Inputs,
6233 const ArgList &Args,
6234 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006235 ArgStringList CmdArgs;
6236
6237 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6238 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006239 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00006240 CmdArgs.push_back("--32");
6241
6242 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6243 options::OPT_Xassembler);
6244
6245 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006246 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006247
6248 for (InputInfoList::const_iterator
6249 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6250 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006251 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006252 }
6253
6254 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006255 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006256 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006257}
6258
6259void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006260 const InputInfo &Output,
6261 const InputInfoList &Inputs,
6262 const ArgList &Args,
6263 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00006264 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00006265 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00006266 ArgStringList CmdArgs;
6267
John McCall65b8da02013-04-11 22:55:55 +00006268 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6269 UseGCC47 = false;
6270
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006271 if (!D.SysRoot.empty())
6272 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6273
John McCall65b8da02013-04-11 22:55:55 +00006274 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006275 if (Args.hasArg(options::OPT_static)) {
6276 CmdArgs.push_back("-Bstatic");
6277 } else {
John McCall65b8da02013-04-11 22:55:55 +00006278 if (Args.hasArg(options::OPT_rdynamic))
6279 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006280 if (Args.hasArg(options::OPT_shared))
6281 CmdArgs.push_back("-Bshareable");
6282 else {
6283 CmdArgs.push_back("-dynamic-linker");
6284 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6285 }
John McCall65b8da02013-04-11 22:55:55 +00006286 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006287 }
6288
6289 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6290 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006291 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006292 CmdArgs.push_back("-m");
6293 CmdArgs.push_back("elf_i386");
6294 }
6295
Daniel Dunbarb440f562010-08-02 02:38:21 +00006296 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006297 CmdArgs.push_back("-o");
6298 CmdArgs.push_back(Output.getFilename());
6299 } else {
6300 assert(Output.isNothing() && "Invalid output.");
6301 }
6302
6303 if (!Args.hasArg(options::OPT_nostdlib) &&
6304 !Args.hasArg(options::OPT_nostartfiles)) {
6305 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00006306 if (Args.hasArg(options::OPT_pg))
6307 CmdArgs.push_back(Args.MakeArgString(
6308 getToolChain().GetFilePath("gcrt1.o")));
6309 else {
6310 if (Args.hasArg(options::OPT_pie))
6311 CmdArgs.push_back(Args.MakeArgString(
6312 getToolChain().GetFilePath("Scrt1.o")));
6313 else
6314 CmdArgs.push_back(Args.MakeArgString(
6315 getToolChain().GetFilePath("crt1.o")));
6316 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006317 }
John McCall65b8da02013-04-11 22:55:55 +00006318 CmdArgs.push_back(Args.MakeArgString(
6319 getToolChain().GetFilePath("crti.o")));
6320 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6321 CmdArgs.push_back(Args.MakeArgString(
6322 getToolChain().GetFilePath("crtbeginS.o")));
6323 else
6324 CmdArgs.push_back(Args.MakeArgString(
6325 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006326 }
6327
6328 Args.AddAllArgs(CmdArgs, options::OPT_L);
6329 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6330 Args.AddAllArgs(CmdArgs, options::OPT_e);
6331
Daniel Dunbar54423b22010-09-17 00:24:54 +00006332 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006333
6334 if (!Args.hasArg(options::OPT_nostdlib) &&
6335 !Args.hasArg(options::OPT_nodefaultlibs)) {
6336 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6337 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00006338 if (UseGCC47)
6339 CmdArgs.push_back("-L/usr/lib/gcc47");
6340 else
6341 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006342
6343 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00006344 if (UseGCC47) {
6345 CmdArgs.push_back("-rpath");
6346 CmdArgs.push_back("/usr/lib/gcc47");
6347 } else {
6348 CmdArgs.push_back("-rpath");
6349 CmdArgs.push_back("/usr/lib/gcc44");
6350 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006351 }
6352
Rafael Espindola38360b32010-07-20 12:59:03 +00006353 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006354 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006355 CmdArgs.push_back("-lm");
6356 }
6357
Daniel Dunbarcc912342009-05-02 18:28:39 +00006358 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006359 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006360
6361 if (!Args.hasArg(options::OPT_nolibc)) {
6362 CmdArgs.push_back("-lc");
6363 }
6364
John McCall65b8da02013-04-11 22:55:55 +00006365 if (UseGCC47) {
6366 if (Args.hasArg(options::OPT_static) ||
6367 Args.hasArg(options::OPT_static_libgcc)) {
6368 CmdArgs.push_back("-lgcc");
6369 CmdArgs.push_back("-lgcc_eh");
6370 } else {
6371 if (Args.hasArg(options::OPT_shared_libgcc)) {
6372 CmdArgs.push_back("-lgcc_pic");
6373 if (!Args.hasArg(options::OPT_shared))
6374 CmdArgs.push_back("-lgcc");
6375 } else {
6376 CmdArgs.push_back("-lgcc");
6377 CmdArgs.push_back("--as-needed");
6378 CmdArgs.push_back("-lgcc_pic");
6379 CmdArgs.push_back("--no-as-needed");
6380 }
6381 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006382 } else {
John McCall65b8da02013-04-11 22:55:55 +00006383 if (Args.hasArg(options::OPT_shared)) {
6384 CmdArgs.push_back("-lgcc_pic");
6385 } else {
6386 CmdArgs.push_back("-lgcc");
6387 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006388 }
6389 }
6390
6391 if (!Args.hasArg(options::OPT_nostdlib) &&
6392 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00006393 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006394 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006395 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00006396 else
6397 CmdArgs.push_back(Args.MakeArgString(
6398 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006399 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00006400 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006401 }
6402
Bill Wendling08760582011-06-27 19:15:03 +00006403 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006404
Daniel Dunbarcc912342009-05-02 18:28:39 +00006405 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006406 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006407 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006408}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006409
6410void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6411 const InputInfo &Output,
6412 const InputInfoList &Inputs,
6413 const ArgList &Args,
6414 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006415 ArgStringList CmdArgs;
6416
6417 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006418 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6419 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006420 } else {
6421 assert(Output.isNothing() && "Invalid output.");
6422 }
6423
6424 if (!Args.hasArg(options::OPT_nostdlib) &&
6425 !Args.hasArg(options::OPT_nostartfiles)) {
6426 CmdArgs.push_back("-defaultlib:libcmt");
6427 }
6428
6429 CmdArgs.push_back("-nologo");
6430
Michael J. Spencere2f49362012-06-18 16:56:04 +00006431 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6432
6433 // Add filenames immediately.
6434 for (InputInfoList::const_iterator
6435 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6436 if (it->isFilename())
6437 CmdArgs.push_back(it->getFilename());
6438 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006439
6440 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006441 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006442 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6443}