blob: 4592308e1a57a74cbbff8ddc4b6232093ea413f2 [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
13#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000014#include "clang/Basic/Version.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000015#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000016#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000017#include "clang/Driver/Driver.h"
18#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000019#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000020#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000021#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000022#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000023#include "clang/Driver/Util.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000024#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000025#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000026#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000027#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000028#include "llvm/Option/Arg.h"
29#include "llvm/Option/ArgList.h"
30#include "llvm/Option/Option.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"
Hans Wennborg188382e2013-09-20 18:16:35 +000035#include "llvm/Support/Path.h"
Rafael Espindola04b3fc42013-06-25 14:29:51 +000036#include "llvm/Support/Program.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000037#include "llvm/Support/Process.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000038#include "llvm/Support/raw_ostream.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000039#include <sys/stat.h>
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000040
Daniel Dunbar1a093d22009-03-18 06:00:36 +000041using namespace clang::driver;
42using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000043using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000044using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000045
Daniel Dunbar64198ef2009-09-10 01:21:05 +000046/// CheckPreprocessingOptions - Perform some validation of preprocessing
47/// arguments that is shared with gcc.
48static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
49 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
Hans Wennborg70850d82013-07-18 20:29:38 +000050 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP())
Chris Lattner0e62c1c2011-07-23 10:55:15 +000051 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar64198ef2009-09-10 01:21:05 +000052 << A->getAsString(Args) << "-E";
53}
54
Daniel Dunbar4eadb602009-09-10 01:21:12 +000055/// CheckCodeGenerationOptions - Perform some validation of code generation
56/// arguments that is shared with gcc.
57static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
58 // In gcc, only ARM checks this, but it seems reasonable to check universally.
59 if (Args.hasArg(options::OPT_static))
60 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
61 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000062 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000063 << A->getAsString(Args) << "-static";
64}
65
Chris Lattnerbf2803f2010-03-29 17:55:58 +000066// Quote target names for inclusion in GNU Make dependency files.
67// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000068static void QuoteTarget(StringRef Target,
69 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +000070 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
71 switch (Target[i]) {
72 case ' ':
73 case '\t':
74 // Escape the preceding backslashes
75 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
76 Res.push_back('\\');
77
78 // Escape the space/tab
79 Res.push_back('\\');
80 break;
81 case '$':
82 Res.push_back('$');
83 break;
84 case '#':
85 Res.push_back('\\');
86 break;
87 default:
88 break;
89 }
90
91 Res.push_back(Target[i]);
92 }
93}
94
Bill Wendlingc0938f32012-03-12 22:10:06 +000095static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +000096 ArgStringList &CmdArgs,
97 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +000098 const char *EnvVar) {
99 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000100 bool CombinedArg = false;
101
Bill Wendling281ca292012-03-12 21:22:35 +0000102 if (!DirList)
103 return; // Nothing to do.
104
Chad Rosier616e8a52012-10-30 21:42:09 +0000105 StringRef Name(ArgName);
106 if (Name.equals("-I") || Name.equals("-L"))
107 CombinedArg = true;
108
Bill Wendling281ca292012-03-12 21:22:35 +0000109 StringRef Dirs(DirList);
110 if (Dirs.empty()) // Empty string should not add '.'.
111 return;
112
113 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000114 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000115 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000116 if (CombinedArg) {
117 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
118 } else {
119 CmdArgs.push_back(ArgName);
120 CmdArgs.push_back(".");
121 }
Bill Wendling281ca292012-03-12 21:22:35 +0000122 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000123 if (CombinedArg) {
124 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
125 } else {
126 CmdArgs.push_back(ArgName);
127 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
128 }
Bill Wendling281ca292012-03-12 21:22:35 +0000129 }
Nico Weber89355782012-03-19 15:00:03 +0000130 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000131 }
132
133 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000134 if (CombinedArg) {
135 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
136 } else {
137 CmdArgs.push_back(ArgName);
138 CmdArgs.push_back(".");
139 }
Bill Wendling281ca292012-03-12 21:22:35 +0000140 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000141 if (CombinedArg) {
142 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
143 } else {
144 CmdArgs.push_back(ArgName);
145 CmdArgs.push_back(Args.MakeArgString(Dirs));
146 }
Bill Wendling281ca292012-03-12 21:22:35 +0000147 }
148}
149
Daniel Dunbar54423b22010-09-17 00:24:54 +0000150static void AddLinkerInputs(const ToolChain &TC,
151 const InputInfoList &Inputs, const ArgList &Args,
152 ArgStringList &CmdArgs) {
153 const Driver &D = TC.getDriver();
154
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000155 // Add extra linker input arguments which are not treated as inputs
156 // (constructed via -Xarch_).
157 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
158
Daniel Dunbar54423b22010-09-17 00:24:54 +0000159 for (InputInfoList::const_iterator
160 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
161 const InputInfo &II = *it;
162
163 if (!TC.HasNativeLLVMSupport()) {
164 // Don't try to pass LLVM inputs unless we have native support.
165 if (II.getType() == types::TY_LLVM_IR ||
166 II.getType() == types::TY_LTO_IR ||
167 II.getType() == types::TY_LLVM_BC ||
168 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000169 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000170 << TC.getTripleString();
171 }
172
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000173 // Add filenames immediately.
174 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000175 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000176 continue;
177 }
178
179 // Otherwise, this is a linker input argument.
180 const Arg &A = II.getInputArg();
181
182 // Handle reserved library options.
183 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000184 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Senafeb03b2010-09-17 18:39:08 +0000185 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
186 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000187 } else
188 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar54423b22010-09-17 00:24:54 +0000189 }
Bill Wendling281ca292012-03-12 21:22:35 +0000190
191 // LIBRARY_PATH - included following the user specified library paths.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000192 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000193}
194
John McCall31168b02011-06-15 23:02:42 +0000195/// \brief Determine whether Objective-C automated reference counting is
196/// enabled.
197static bool isObjCAutoRefCount(const ArgList &Args) {
198 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
199}
200
Ted Kremeneke65b0862012-03-06 20:05:56 +0000201/// \brief Determine whether we are linking the ObjC runtime.
202static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000203 if (isObjCAutoRefCount(Args)) {
204 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000205 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000206 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000207 return Args.hasArg(options::OPT_fobjc_link_runtime);
208}
209
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000210static void addProfileRT(const ToolChain &TC, const ArgList &Args,
Bill Wendling08760582011-06-27 19:15:03 +0000211 ArgStringList &CmdArgs,
212 llvm::Triple Triple) {
213 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
214 Args.hasArg(options::OPT_fprofile_generate) ||
215 Args.hasArg(options::OPT_fcreate_profile) ||
216 Args.hasArg(options::OPT_coverage)))
217 return;
218
219 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
220 // the link line. We cannot do the same thing because unlike gcov there is a
221 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
222 // not supported by old linkers.
Benjamin Kramerf5fbe432011-11-07 16:02:25 +0000223 std::string ProfileRT =
224 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
Bill Wendling08760582011-06-27 19:15:03 +0000225
Bill Wendling08760582011-06-27 19:15:03 +0000226 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000227}
228
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000229static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000230 // Don't forward inputs from the original command line. They are added from
231 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000232 return O.getKind() != Option::InputClass &&
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000233 !O.hasFlag(options::DriverOption) &&
234 !O.hasFlag(options::LinkerInput);
235}
236
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000237void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000238 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000239 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000240 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000241 ArgStringList &CmdArgs,
242 const InputInfo &Output,
243 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000244 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000245
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000246 CheckPreprocessingOptions(D, Args);
247
248 Args.AddLastArg(CmdArgs, options::OPT_C);
249 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000250
251 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000252 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000253 (A = Args.getLastArg(options::OPT_MD)) ||
254 (A = Args.getLastArg(options::OPT_MMD))) {
255 // Determine the output location.
256 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000257 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000258 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000259 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000260 } else if (Output.getType() == types::TY_Dependencies) {
261 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000262 } else if (A->getOption().matches(options::OPT_M) ||
263 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000264 DepFile = "-";
265 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000266 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000267 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000268 }
269 CmdArgs.push_back("-dependency-file");
270 CmdArgs.push_back(DepFile);
271
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000272 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000273 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
274 const char *DepTarget;
275
276 // If user provided -o, that is the dependency target, except
277 // when we are only generating a dependency file.
278 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
279 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000280 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000281 } else {
282 // Otherwise derive from the base input.
283 //
284 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000285 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000286 llvm::sys::path::replace_extension(P, "o");
287 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000288 }
289
290 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000291 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000292 QuoteTarget(DepTarget, Quoted);
293 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000294 }
295
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000296 if (A->getOption().matches(options::OPT_M) ||
297 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000298 CmdArgs.push_back("-sys-header-deps");
299 }
300
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000301 if (Args.hasArg(options::OPT_MG)) {
302 if (!A || A->getOption().matches(options::OPT_MD) ||
303 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000304 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000305 CmdArgs.push_back("-MG");
306 }
307
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000308 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000309
310 // Convert all -MQ <target> args to -MT <quoted target>
311 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
312 options::OPT_MQ),
313 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000314 const Arg *A = *it;
315 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000316
Daniel Dunbara442fd52010-06-11 22:00:13 +0000317 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000318 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000319 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000320 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000321 CmdArgs.push_back(Args.MakeArgString(Quoted));
322
323 // -MT flag - no change
324 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000325 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000326 }
327 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000328
Douglas Gregor111af7d2009-04-18 00:34:01 +0000329 // Add -i* options, and automatically translate to
330 // -include-pch/-include-pth for transparent PCH support. It's
331 // wonky, but we include looking for .gch so we can support seamless
332 // replacement into a build system already set up to be generating
333 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000334 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000335 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
336 ie = Args.filtered_end(); it != ie; ++it) {
337 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000338
339 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000340 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
341 RenderedImplicitInclude = true;
342
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000343 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000344 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000345
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000346 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000347 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000348 SmallString<128> P(A->getValue());
349 // We want the files to have a name like foo.h.pch. Add a dummy extension
350 // so that replace_extension does the right thing.
351 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000352 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000353 llvm::sys::path::replace_extension(P, "pch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000354 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000355 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000356 }
357
Douglas Gregor111af7d2009-04-18 00:34:01 +0000358 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000359 llvm::sys::path::replace_extension(P, "pth");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000360 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000361 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000362 }
363
Douglas Gregor111af7d2009-04-18 00:34:01 +0000364 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000365 llvm::sys::path::replace_extension(P, "gch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000366 if (llvm::sys::fs::exists(P.str())) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000367 FoundPCH = UsePCH;
368 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000369 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000370 }
371
372 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000373 if (IsFirstImplicitInclude) {
374 A->claim();
375 if (UsePCH)
376 CmdArgs.push_back("-include-pch");
377 else
378 CmdArgs.push_back("-include-pth");
379 CmdArgs.push_back(Args.MakeArgString(P.str()));
380 continue;
381 } else {
382 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000383 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000384 << P.str() << A->getAsString(Args);
385 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000386 }
387 }
388
389 // Not translated, render as usual.
390 A->claim();
391 A->render(Args, CmdArgs);
392 }
393
394 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000395 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
396 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000397
398 // Add -Wp, and -Xassembler if using the preprocessor.
399
400 // FIXME: There is a very unfortunate problem here, some troubled
401 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
402 // really support that we would have to parse and then translate
403 // those options. :(
404 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
405 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000406
407 // -I- is a deprecated GCC feature, reject it.
408 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000409 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000410
411 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
412 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000413 StringRef sysroot = C.getSysRoot();
414 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000415 if (!Args.hasArg(options::OPT_isysroot)) {
416 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000417 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000418 }
419 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000420
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000421 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000422 // FIXME: We should probably sink the logic for handling these from the
423 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000424 // CPATH - included following the user specified includes (but prior to
425 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000426 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000427 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000428 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000429 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000430 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000431 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000432 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000433 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000434 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000435
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000436 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000437 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000438 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000439
440 // Add system include arguments.
441 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000442}
443
Daniel Dunbarf492c922009-09-10 22:59:51 +0000444/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000445/// CPU.
446//
447// FIXME: This is redundant with -mcpu, why does LLVM use this.
448// FIXME: tblgen this, or kill it!
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000449static const char *getLLVMArchSuffixForARM(StringRef CPU) {
Chad Rosier9ac84512011-10-07 17:48:56 +0000450 return llvm::StringSwitch<const char *>(CPU)
Tim Northover92509c12013-06-13 15:02:46 +0000451 .Case("strongarm", "v4")
Chad Rosier9ac84512011-10-07 17:48:56 +0000452 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
453 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
454 .Cases("arm920", "arm920t", "arm922t", "v4t")
455 .Cases("arm940t", "ep9312","v4t")
456 .Cases("arm10tdmi", "arm1020t", "v5")
457 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
458 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
459 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
460 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
461 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
462 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Bob Wilsonf643afc2013-03-04 22:37:46 +0000463 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
Renato Golin1a04f222013-09-13 17:02:54 +0000464 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "v7")
465 .Cases("cortex-r4", "cortex-r5", "v7r")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000466 .Case("cortex-m0", "v6m")
Bob Wilson743bf672013-03-04 22:37:49 +0000467 .Case("cortex-m3", "v7m")
468 .Case("cortex-m4", "v7em")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000469 .Case("cortex-a9-mp", "v7f")
470 .Case("swift", "v7s")
Chad Rosier9ac84512011-10-07 17:48:56 +0000471 .Default("");
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000472}
473
Benjamin Kramer09811c72012-06-26 22:20:06 +0000474/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
475//
476// FIXME: tblgen this.
477static std::string getARMTargetCPU(const ArgList &Args,
478 const llvm::Triple &Triple) {
479 // FIXME: Warn on inconsistent use of -mcpu and -march.
480
481 // If we have -mcpu=, use that.
482 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000483 StringRef MCPU = A->getValue();
Benjamin Kramer09811c72012-06-26 22:20:06 +0000484 // Handle -mcpu=native.
485 if (MCPU == "native")
486 return llvm::sys::getHostCPUName();
487 else
488 return MCPU;
489 }
490
491 StringRef MArch;
492 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
493 // Otherwise, if we have -march= choose the base CPU for that arch.
Richard Smithbd55daf2012-11-01 04:30:05 +0000494 MArch = A->getValue();
Benjamin Kramer09811c72012-06-26 22:20:06 +0000495 } else {
496 // Otherwise, use the Arch from the triple.
497 MArch = Triple.getArchName();
498 }
499
500 // Handle -march=native.
501 std::string NativeMArch;
502 if (MArch == "native") {
503 std::string CPU = llvm::sys::getHostCPUName();
504 if (CPU != "generic") {
505 // Translate the native cpu into the architecture. The switch below will
506 // then chose the minimum cpu for that arch.
507 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
508 MArch = NativeMArch;
509 }
510 }
511
512 return llvm::StringSwitch<const char *>(MArch)
513 .Cases("armv2", "armv2a","arm2")
514 .Case("armv3", "arm6")
515 .Case("armv3m", "arm7m")
Tim Northover92509c12013-06-13 15:02:46 +0000516 .Case("armv4", "strongarm")
517 .Case("armv4t", "arm7tdmi")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000518 .Cases("armv5", "armv5t", "arm10tdmi")
519 .Cases("armv5e", "armv5te", "arm1022e")
520 .Case("armv5tej", "arm926ej-s")
521 .Cases("armv6", "armv6k", "arm1136jf-s")
522 .Case("armv6j", "arm1136j-s")
523 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
524 .Case("armv6t2", "arm1156t2-s")
Bob Wilson743bf672013-03-04 22:37:49 +0000525 .Cases("armv6m", "armv6-m", "cortex-m0")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000526 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Bob Wilson743bf672013-03-04 22:37:49 +0000527 .Cases("armv7em", "armv7e-m", "cortex-m4")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000528 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
529 .Cases("armv7s", "armv7-s", "swift")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000530 .Cases("armv7r", "armv7-r", "cortex-r4")
531 .Cases("armv7m", "armv7-m", "cortex-m3")
Joey Goulyd077bc62013-06-26 17:19:48 +0000532 .Cases("armv8", "armv8a", "armv8-a", "cortex-a53")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000533 .Case("ep9312", "ep9312")
534 .Case("iwmmxt", "iwmmxt")
535 .Case("xscale", "xscale")
Tim Northover92509c12013-06-13 15:02:46 +0000536 // If all else failed, return the most base CPU with thumb interworking
537 // supported by LLVM.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000538 .Default("arm7tdmi");
539}
540
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000541// FIXME: Move to target hook.
542static bool isSignedCharDefault(const llvm::Triple &Triple) {
543 switch (Triple.getArch()) {
544 default:
545 return true;
546
Tim Northover9bb857a2013-01-31 12:13:10 +0000547 case llvm::Triple::aarch64:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000548 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000549 case llvm::Triple::ppc:
550 case llvm::Triple::ppc64:
Bob Wilson6524dd32011-10-14 05:03:44 +0000551 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000552 return true;
553 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000554
Bill Schmidt778d3872013-07-26 01:36:11 +0000555 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000556 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000557 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000558 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000559 }
560}
561
Robert Lytton0e076492013-08-13 09:43:10 +0000562static bool isNoCommonDefault(const llvm::Triple &Triple) {
563 switch (Triple.getArch()) {
564 default:
565 return false;
566
567 case llvm::Triple::xcore:
568 return true;
569 }
570}
571
Chad Rosiercfbfc582012-04-04 20:51:35 +0000572// Handle -mfpu=.
573//
574// FIXME: Centralize feature selection, defaulting shouldn't be also in the
575// frontend target.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000576static void getAArch64FPUFeatures(const Driver &D, const Arg *A,
577 const ArgList &Args,
578 std::vector<const char *> &Features) {
579 StringRef FPU = A->getValue();
580 if (FPU == "fp-armv8") {
581 Features.push_back("+fp-armv8");
582 } else if (FPU == "neon-fp-armv8") {
583 Features.push_back("+fp-armv8");
584 Features.push_back("+neon");
585 } else if (FPU == "crypto-neon-fp-armv8") {
586 Features.push_back("+fp-armv8");
587 Features.push_back("+neon");
588 Features.push_back("+crypto");
589 } else if (FPU == "neon") {
590 Features.push_back("+neon");
591 } else if (FPU == "none") {
592 Features.push_back("-fp-armv8");
593 Features.push_back("-crypto");
594 Features.push_back("-neon");
595 } else
596 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
597}
598
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000599// Handle -mhwdiv=.
600static void getARMHWDivFeatures(const Driver &D, const Arg *A,
601 const ArgList &Args,
602 std::vector<const char *> &Features) {
603 StringRef HWDiv = A->getValue();
604 if (HWDiv == "arm") {
605 Features.push_back("+hwdiv-arm");
606 Features.push_back("-hwdiv");
607 } else if (HWDiv == "thumb") {
608 Features.push_back("-hwdiv-arm");
609 Features.push_back("+hwdiv");
610 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
611 Features.push_back("+hwdiv-arm");
612 Features.push_back("+hwdiv");
613 } else if (HWDiv == "none") {
614 Features.push_back("-hwdiv-arm");
615 Features.push_back("-hwdiv");
616 } else
617 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
618}
619
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000620// Handle -mfpu=.
621//
622// FIXME: Centralize feature selection, defaulting shouldn't be also in the
623// frontend target.
624static void getARMFPUFeatures(const Driver &D, const Arg *A,
625 const ArgList &Args,
626 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000627 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000628
629 // Set the target features based on the FPU.
630 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
631 // Disable any default FPU support.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000632 Features.push_back("-vfp2");
633 Features.push_back("-vfp3");
634 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000635 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000636 Features.push_back("+vfp3");
637 Features.push_back("+d16");
638 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000639 } else if (FPU == "vfp") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000640 Features.push_back("+vfp2");
641 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000642 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000643 Features.push_back("+vfp3");
644 Features.push_back("-neon");
Joey Gouly7db275b2013-06-27 13:19:54 +0000645 } else if (FPU == "fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000646 Features.push_back("+fp-armv8");
Joey Gouly7db275b2013-06-27 13:19:54 +0000647 } else if (FPU == "neon-fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000648 Features.push_back("+fp-armv8");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000649 Features.push_back("+neon");
Amara Emersonfc362c62013-09-19 13:54:03 +0000650 } else if (FPU == "crypto-neon-fp-armv8") {
651 Features.push_back("+crypto");
652 Features.push_back("+fp-armv8");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000653 } else if (FPU == "neon") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000654 Features.push_back("+neon");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000655 } else if (FPU == "none") {
656 Features.push_back("-vfp2");
657 Features.push_back("-vfp3");
658 Features.push_back("-vfp4");
659 Features.push_back("-fp-armv8");
660 Features.push_back("-crypto");
661 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000662 } else
663 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
664}
665
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000666// Select the float ABI as determined by -msoft-float, -mhard-float, and
667// -mfloat-abi=.
668static StringRef getARMFloatABI(const Driver &D,
669 const ArgList &Args,
670 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000671 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000672 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
673 options::OPT_mhard_float,
674 options::OPT_mfloat_abi_EQ)) {
675 if (A->getOption().matches(options::OPT_msoft_float))
676 FloatABI = "soft";
677 else if (A->getOption().matches(options::OPT_mhard_float))
678 FloatABI = "hard";
679 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000680 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000681 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000682 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000683 << A->getAsString(Args);
684 FloatABI = "soft";
685 }
686 }
687 }
688
689 // If unspecified, choose the default based on the platform.
690 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000691 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000692 case llvm::Triple::Darwin:
693 case llvm::Triple::MacOSX:
694 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000695 // Darwin defaults to "softfp" for v6 and v7.
696 //
697 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000698 std::string ArchName =
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000699 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000700 if (StringRef(ArchName).startswith("v6") ||
701 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000702 FloatABI = "softfp";
703 else
704 FloatABI = "soft";
705 break;
706 }
707
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000708 case llvm::Triple::FreeBSD:
709 // FreeBSD defaults to soft float
710 FloatABI = "soft";
711 break;
712
Daniel Dunbar78485922009-09-10 23:00:09 +0000713 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000714 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000715 case llvm::Triple::GNUEABIHF:
716 FloatABI = "hard";
717 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000718 case llvm::Triple::GNUEABI:
719 FloatABI = "softfp";
720 break;
721 case llvm::Triple::EABI:
722 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
723 FloatABI = "softfp";
724 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000725 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000726 std::string ArchName =
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000727 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000728 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000729 FloatABI = "softfp";
730 else
731 FloatABI = "soft";
732 break;
733 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000734 default:
735 // Assume "soft", but warn the user we are guessing.
736 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000737 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000738 break;
739 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000740 }
741 }
742
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000743 return FloatABI;
744}
745
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000746static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
747 const ArgList &Args,
748 std::vector<const char *> &Features) {
749 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
750 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
751 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
752 // stripped out by the ARM target.
753 // Use software floating point operations?
754 if (FloatABI == "soft")
755 Features.push_back("+soft-float");
756
757 // Use software floating point argument passing?
758 if (FloatABI != "hard")
759 Features.push_back("+soft-float-abi");
760
761 // Honor -mfpu=.
762 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000763 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000764 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
765 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000766
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000767 // Setting -msoft-float effectively disables NEON because of the GCC
768 // implementation, although the same isn't true of VFP or VFP3.
769 if (FloatABI == "soft")
770 Features.push_back("-neon");
771}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000772
773void Clang::AddARMTargetArgs(const ArgList &Args,
774 ArgStringList &CmdArgs,
775 bool KernelOrKext) const {
776 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000777 // Get the effective triple, which takes into account the deployment target.
778 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
779 llvm::Triple Triple(TripleStr);
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000780 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000781
782 // Select the ABI to use.
783 //
784 // FIXME: Support -meabi.
785 const char *ABIName = 0;
786 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000787 ABIName = A->getValue();
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000788 } else if (Triple.isOSDarwin()) {
789 // The backend is hardwired to assume AAPCS for M-class processors, ensure
790 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000791 if (Triple.getEnvironment() == llvm::Triple::EABI ||
792 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000793 ABIName = "aapcs";
794 } else {
795 ABIName = "apcs-gnu";
796 }
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000797 } else {
798 // Select the default based on the platform.
799 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000800 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000801 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000802 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000803 ABIName = "aapcs-linux";
804 break;
805 case llvm::Triple::EABI:
806 ABIName = "aapcs";
807 break;
808 default:
809 ABIName = "apcs-gnu";
810 }
811 }
812 CmdArgs.push_back("-target-abi");
813 CmdArgs.push_back(ABIName);
814
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000815 // Determine floating point ABI from the options & target defaults.
816 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000817 if (FloatABI == "soft") {
818 // Floating point operations and argument passing are soft.
819 //
820 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000821 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000822 CmdArgs.push_back("-mfloat-abi");
823 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000824 } else if (FloatABI == "softfp") {
825 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000826 CmdArgs.push_back("-mfloat-abi");
827 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000828 } else {
829 // Floating point operations and argument passing are hard.
830 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000831 CmdArgs.push_back("-mfloat-abi");
832 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000833 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000834
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000835 // Kernel code has more strict alignment requirements.
836 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000837 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000838 CmdArgs.push_back("-backend-option");
839 CmdArgs.push_back("-arm-long-calls");
840 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000841
Daniel Dunbar12100e22011-03-22 16:48:17 +0000842 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000843 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000844
845 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000846 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000847 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000848 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000849
850 // Setting -mno-global-merge disables the codegen global merge pass. Setting
851 // -mglobal-merge has no effect as the pass is enabled by default.
852 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
853 options::OPT_mno_global_merge)) {
854 if (A->getOption().matches(options::OPT_mno_global_merge))
855 CmdArgs.push_back("-mno-global-merge");
856 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000857
Bob Wilson9c8af452013-04-11 18:53:25 +0000858 if (!Args.hasFlag(options::OPT_mimplicit_float,
859 options::OPT_mno_implicit_float,
860 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000861 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000862
863 // llvm does not support reserving registers in general. There is support
864 // for reserving r9 on ARM though (defined as a platform-specific register
865 // in ARM EABI).
866 if (Args.hasArg(options::OPT_ffixed_r9)) {
867 CmdArgs.push_back("-backend-option");
868 CmdArgs.push_back("-arm-reserve-r9");
869 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000870}
871
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000872// Get CPU and ABI names. They are not independent
873// so we have to calculate them together.
874static void getMipsCPUAndABI(const ArgList &Args,
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000875 const llvm::Triple &Triple,
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000876 StringRef &CPUName,
877 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000878 const char *DefMips32CPU = "mips32";
879 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000880
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000881 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000882 options::OPT_mcpu_EQ))
883 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000884
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000885 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000886 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000887 // Convert a GNU style Mips ABI name to the name
888 // accepted by LLVM Mips backend.
889 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
890 .Case("32", "o32")
891 .Case("64", "n64")
892 .Default(ABIName);
893 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000894
895 // Setup default CPU and ABI names.
896 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000897 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000898 default:
899 llvm_unreachable("Unexpected triple arch name");
900 case llvm::Triple::mips:
901 case llvm::Triple::mipsel:
902 CPUName = DefMips32CPU;
903 break;
904 case llvm::Triple::mips64:
905 case llvm::Triple::mips64el:
906 CPUName = DefMips64CPU;
907 break;
908 }
909 }
910
911 if (!ABIName.empty()) {
912 // Deduce CPU name from ABI name.
913 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000914 .Cases("32", "o32", "eabi", DefMips32CPU)
915 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000916 .Default("");
917 }
918 else if (!CPUName.empty()) {
919 // Deduce ABI name from CPU name.
920 ABIName = llvm::StringSwitch<const char *>(CPUName)
921 .Cases("mips32", "mips32r2", "o32")
922 .Cases("mips64", "mips64r2", "n64")
923 .Default("");
924 }
925
926 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000927}
928
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000929// Convert ABI name to the GNU tools acceptable variant.
930static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
931 return llvm::StringSwitch<llvm::StringRef>(ABI)
932 .Case("o32", "32")
933 .Case("n64", "64")
934 .Default(ABI);
935}
936
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000937// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
938// and -mfloat-abi=.
939static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000940 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000941 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000942 options::OPT_mhard_float,
943 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000944 if (A->getOption().matches(options::OPT_msoft_float))
945 FloatABI = "soft";
946 else if (A->getOption().matches(options::OPT_mhard_float))
947 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000948 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000949 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +0000950 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000951 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000952 FloatABI = "hard";
953 }
954 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000955 }
956
957 // If unspecified, choose the default based on the platform.
958 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000959 // Assume "hard", because it's a default value used by gcc.
960 // When we start to recognize specific target MIPS processors,
961 // we will be able to select the default more correctly.
962 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000963 }
964
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000965 return FloatABI;
966}
967
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000968static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000969 std::vector<const char *> &Features,
970 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000971 StringRef FeatureName) {
972 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000973 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000974 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000975 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000976 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000977 }
978}
979
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000980static void getMIPSTargetFeatures(const Driver &D, const ArgList &Args,
981 std::vector<const char *> &Features) {
982 StringRef FloatABI = getMipsFloatABI(D, Args);
983 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
984 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
985 // FIXME: Note, this is a hack. We need to pass the selected float
986 // mode to the MipsTargetInfoBase to define appropriate macros there.
987 // Now it is the only method.
988 Features.push_back("+soft-float");
989 }
990
Simon Atanasyan22127ce2013-09-24 09:09:16 +0000991 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
992 if (StringRef(A->getValue()) == "2008")
993 Features.push_back("+nan2008");
994 }
995
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000996 AddTargetFeature(Args, Features, options::OPT_msingle_float,
997 options::OPT_mdouble_float, "single-float");
998 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
999 "mips16");
1000 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1001 options::OPT_mno_micromips, "micromips");
1002 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1003 "dsp");
1004 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1005 "dspr2");
1006 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1007 "msa");
Daniel Sanders94694172013-10-17 14:55:58 +00001008 AddTargetFeature(Args, Features, options::OPT_mfp64, options::OPT_mfp32,
1009 "fp64");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001010}
1011
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001012void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001013 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001014 const Driver &D = getToolChain().getDriver();
1015 StringRef CPUName;
1016 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001017 const llvm::Triple &Triple = getToolChain().getTriple();
1018 getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001019
1020 CmdArgs.push_back("-target-abi");
1021 CmdArgs.push_back(ABIName.data());
1022
1023 StringRef FloatABI = getMipsFloatABI(D, Args);
1024
Simon Atanasyan81c423c2013-01-10 12:36:19 +00001025 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
1026
1027 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001028 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001029 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001030 CmdArgs.push_back("-mfloat-abi");
1031 CmdArgs.push_back("soft");
1032
Simon Atanasyan81c423c2013-01-10 12:36:19 +00001033 if (FloatABI == "hard" && IsMips16) {
1034 CmdArgs.push_back("-mllvm");
1035 CmdArgs.push_back("-mips16-hard-float");
1036 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001037 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001038 else {
1039 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001040 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001041 CmdArgs.push_back("-mfloat-abi");
1042 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001043 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001044
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001045 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1046 if (A->getOption().matches(options::OPT_mxgot)) {
1047 CmdArgs.push_back("-mllvm");
1048 CmdArgs.push_back("-mxgot");
1049 }
1050 }
1051
Simon Atanasyanc580b322013-05-11 06:33:44 +00001052 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1053 options::OPT_mno_ldc1_sdc1)) {
1054 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1055 CmdArgs.push_back("-mllvm");
1056 CmdArgs.push_back("-mno-ldc1-sdc1");
1057 }
1058 }
1059
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001060 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1061 options::OPT_mno_check_zero_division)) {
1062 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1063 CmdArgs.push_back("-mllvm");
1064 CmdArgs.push_back("-mno-check-zero-division");
1065 }
1066 }
1067
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001068 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001069 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001070 CmdArgs.push_back("-mllvm");
1071 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1072 A->claim();
1073 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001074}
1075
Hal Finkel8eb59282012-06-11 22:35:19 +00001076/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1077static std::string getPPCTargetCPU(const ArgList &Args) {
1078 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001079 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001080
1081 if (CPUName == "native") {
1082 std::string CPU = llvm::sys::getHostCPUName();
1083 if (!CPU.empty() && CPU != "generic")
1084 return CPU;
1085 else
1086 return "";
1087 }
1088
1089 return llvm::StringSwitch<const char *>(CPUName)
1090 .Case("common", "generic")
1091 .Case("440", "440")
1092 .Case("440fp", "440")
1093 .Case("450", "450")
1094 .Case("601", "601")
1095 .Case("602", "602")
1096 .Case("603", "603")
1097 .Case("603e", "603e")
1098 .Case("603ev", "603ev")
1099 .Case("604", "604")
1100 .Case("604e", "604e")
1101 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001102 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001103 .Case("G3", "g3")
1104 .Case("7400", "7400")
1105 .Case("G4", "g4")
1106 .Case("7450", "7450")
1107 .Case("G4+", "g4+")
1108 .Case("750", "750")
1109 .Case("970", "970")
1110 .Case("G5", "g5")
1111 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001112 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001113 .Case("e500mc", "e500mc")
1114 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001115 .Case("power3", "pwr3")
1116 .Case("power4", "pwr4")
1117 .Case("power5", "pwr5")
1118 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001119 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001120 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001121 .Case("power7", "pwr7")
Bill Schmidt38378a02013-02-01 20:23:10 +00001122 .Case("pwr3", "pwr3")
1123 .Case("pwr4", "pwr4")
1124 .Case("pwr5", "pwr5")
1125 .Case("pwr5x", "pwr5x")
1126 .Case("pwr6", "pwr6")
1127 .Case("pwr6x", "pwr6x")
1128 .Case("pwr7", "pwr7")
Hal Finkel8eb59282012-06-11 22:35:19 +00001129 .Case("powerpc", "ppc")
1130 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001131 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001132 .Default("");
1133 }
1134
1135 return "";
1136}
1137
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001138static void getPPCTargetFeatures(const ArgList &Args,
1139 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001140 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1141 ie = Args.filtered_end();
1142 it != ie; ++it) {
1143 StringRef Name = (*it)->getOption().getName();
1144 (*it)->claim();
1145
1146 // Skip over "-m".
1147 assert(Name.startswith("m") && "Invalid feature name.");
1148 Name = Name.substr(1);
1149
1150 bool IsNegative = Name.startswith("no-");
1151 if (IsNegative)
1152 Name = Name.substr(3);
1153
1154 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1155 // pass the correct option to the backend while calling the frontend
1156 // option the same.
1157 // TODO: Change the LLVM backend option maybe?
1158 if (Name == "mfcrf")
1159 Name = "mfocrf";
1160
1161 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1162 }
1163
1164 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001165 AddTargetFeature(Args, Features, options::OPT_faltivec,
1166 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001167}
1168
Tom Stellard6674c702013-04-01 20:56:53 +00001169/// Get the (LLVM) name of the R600 gpu we are targeting.
1170static std::string getR600TargetGPU(const ArgList &Args) {
1171 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1172 std::string GPUName = A->getValue();
1173 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001174 .Cases("rv630", "rv635", "r600")
1175 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001176 .Case("rv740", "rv770")
1177 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001178 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001179 .Case("hemlock", "cypress")
1180 .Case("aruba", "cayman")
1181 .Default(GPUName.c_str());
1182 }
1183 return "";
1184}
1185
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001186static void getSparcTargetFeatures(const ArgList &Args,
1187 std::vector<const char *> Features) {
1188 bool SoftFloatABI = true;
1189 if (Arg *A =
1190 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1191 if (A->getOption().matches(options::OPT_mhard_float))
1192 SoftFloatABI = false;
1193 }
1194 if (SoftFloatABI)
1195 Features.push_back("+soft-float");
1196}
1197
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001198void Clang::AddSparcTargetArgs(const ArgList &Args,
1199 ArgStringList &CmdArgs) const {
1200 const Driver &D = getToolChain().getDriver();
1201
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001202 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001203 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001204 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1205 options::OPT_mhard_float)) {
1206 if (A->getOption().matches(options::OPT_msoft_float))
1207 FloatABI = "soft";
1208 else if (A->getOption().matches(options::OPT_mhard_float))
1209 FloatABI = "hard";
1210 }
1211
1212 // If unspecified, choose the default based on the platform.
1213 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001214 // Assume "soft", but warn the user we are guessing.
1215 FloatABI = "soft";
1216 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001217 }
1218
1219 if (FloatABI == "soft") {
1220 // Floating point operations and argument passing are soft.
1221 //
1222 // FIXME: This changes CPP defines, we need -target-soft-float.
1223 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001224 } else {
1225 assert(FloatABI == "hard" && "Invalid float abi!");
1226 CmdArgs.push_back("-mhard-float");
1227 }
1228}
1229
Richard Sandiford4652d892013-07-19 16:51:51 +00001230static const char *getSystemZTargetCPU(const ArgList &Args) {
1231 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1232 return A->getValue();
1233 return "z10";
1234}
1235
Chandler Carruth953fb082013-01-13 11:46:33 +00001236static const char *getX86TargetCPU(const ArgList &Args,
1237 const llvm::Triple &Triple) {
1238 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1239 if (StringRef(A->getValue()) != "native")
1240 return A->getValue();
1241
1242 // FIXME: Reject attempts to use -march=native unless the target matches
1243 // the host.
1244 //
1245 // FIXME: We should also incorporate the detected target features for use
1246 // with -native.
1247 std::string CPU = llvm::sys::getHostCPUName();
1248 if (!CPU.empty() && CPU != "generic")
1249 return Args.MakeArgString(CPU);
1250 }
1251
1252 // Select the default CPU if none was given (or detection failed).
1253
1254 if (Triple.getArch() != llvm::Triple::x86_64 &&
1255 Triple.getArch() != llvm::Triple::x86)
1256 return 0; // This routine is only handling x86 targets.
1257
1258 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1259
1260 // FIXME: Need target hooks.
1261 if (Triple.isOSDarwin())
1262 return Is64Bit ? "core2" : "yonah";
1263
1264 // Everything else goes to x86-64 in 64-bit mode.
1265 if (Is64Bit)
1266 return "x86-64";
1267
1268 if (Triple.getOSName().startswith("haiku"))
1269 return "i586";
1270 if (Triple.getOSName().startswith("openbsd"))
1271 return "i486";
1272 if (Triple.getOSName().startswith("bitrig"))
1273 return "i686";
1274 if (Triple.getOSName().startswith("freebsd"))
1275 return "i486";
1276 if (Triple.getOSName().startswith("netbsd"))
1277 return "i486";
1278 // All x86 devices running Android have core2 as their common
1279 // denominator. This makes a better choice than pentium4.
1280 if (Triple.getEnvironment() == llvm::Triple::Android)
1281 return "core2";
1282
1283 // Fallback to p4.
1284 return "pentium4";
1285}
1286
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001287static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1288 switch(T.getArch()) {
1289 default:
1290 return "";
1291
1292 case llvm::Triple::arm:
1293 case llvm::Triple::thumb:
1294 return getARMTargetCPU(Args, T);
1295
1296 case llvm::Triple::mips:
1297 case llvm::Triple::mipsel:
1298 case llvm::Triple::mips64:
1299 case llvm::Triple::mips64el: {
1300 StringRef CPUName;
1301 StringRef ABIName;
1302 getMipsCPUAndABI(Args, T, CPUName, ABIName);
1303 return CPUName;
1304 }
1305
1306 case llvm::Triple::ppc:
1307 case llvm::Triple::ppc64:
1308 case llvm::Triple::ppc64le: {
1309 std::string TargetCPUName = getPPCTargetCPU(Args);
1310 // LLVM may default to generating code for the native CPU,
1311 // but, like gcc, we default to a more generic option for
1312 // each architecture. (except on Darwin)
1313 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1314 if (T.getArch() == llvm::Triple::ppc64)
1315 TargetCPUName = "ppc64";
1316 else if (T.getArch() == llvm::Triple::ppc64le)
1317 TargetCPUName = "ppc64le";
1318 else
1319 TargetCPUName = "ppc";
1320 }
1321 return TargetCPUName;
1322 }
1323
1324 case llvm::Triple::sparc:
1325 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1326 return A->getValue();
1327 return "";
1328
1329 case llvm::Triple::x86:
1330 case llvm::Triple::x86_64:
1331 return getX86TargetCPU(Args, T);
1332
1333 case llvm::Triple::hexagon:
1334 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1335
1336 case llvm::Triple::systemz:
1337 return getSystemZTargetCPU(Args);
1338
1339 case llvm::Triple::r600:
1340 return getR600TargetGPU(Args);
1341 }
1342}
1343
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001344static void getX86TargetFeatures(const ArgList &Args,
1345 std::vector<const char *> &Features) {
1346 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1347 ie = Args.filtered_end();
1348 it != ie; ++it) {
1349 StringRef Name = (*it)->getOption().getName();
1350 (*it)->claim();
1351
1352 // Skip over "-m".
1353 assert(Name.startswith("m") && "Invalid feature name.");
1354 Name = Name.substr(1);
1355
1356 bool IsNegative = Name.startswith("no-");
1357 if (IsNegative)
1358 Name = Name.substr(3);
1359
1360 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1361 }
1362}
1363
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001364void Clang::AddX86TargetArgs(const ArgList &Args,
1365 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001366 if (!Args.hasFlag(options::OPT_mred_zone,
1367 options::OPT_mno_red_zone,
1368 true) ||
1369 Args.hasArg(options::OPT_mkernel) ||
1370 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001371 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001372
Bob Wilson2616e2e2013-02-10 16:01:41 +00001373 // Default to avoid implicit floating-point for kernel/kext code, but allow
1374 // that to be overridden with -mno-soft-float.
1375 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1376 Args.hasArg(options::OPT_fapple_kext));
1377 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1378 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001379 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001380 options::OPT_mno_implicit_float)) {
1381 const Option &O = A->getOption();
1382 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1383 O.matches(options::OPT_msoft_float));
1384 }
1385 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001386 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001387}
1388
Matthew Curtise8f80a12012-12-06 17:49:03 +00001389static inline bool HasPICArg(const ArgList &Args) {
1390 return Args.hasArg(options::OPT_fPIC)
1391 || Args.hasArg(options::OPT_fpic);
1392}
1393
1394static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1395 return Args.getLastArg(options::OPT_G,
1396 options::OPT_G_EQ,
1397 options::OPT_msmall_data_threshold_EQ);
1398}
1399
1400static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1401 std::string value;
1402 if (HasPICArg(Args))
1403 value = "0";
1404 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1405 value = A->getValue();
1406 A->claim();
1407 }
1408 return value;
1409}
1410
Tony Linthicum76329bf2011-12-12 21:14:55 +00001411void Clang::AddHexagonTargetArgs(const ArgList &Args,
1412 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001413 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001414 CmdArgs.push_back("-mqdsp6-compat");
1415 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001416
Matthew Curtise8f80a12012-12-06 17:49:03 +00001417 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1418 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001419 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001420 CmdArgs.push_back(Args.MakeArgString(
1421 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001422 }
1423
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001424 if (!Args.hasArg(options::OPT_fno_short_enums))
1425 CmdArgs.push_back("-fshort-enums");
1426 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1427 CmdArgs.push_back ("-mllvm");
1428 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1429 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001430 CmdArgs.push_back ("-mllvm");
1431 CmdArgs.push_back ("-machine-sink-split=0");
1432}
1433
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001434static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1435 std::vector<const char *> &Features) {
Tim Northover2fe823a2013-08-01 09:23:19 +00001436 // Honor -mfpu=.
1437 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +00001438 getAArch64FPUFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001439}
1440
1441static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1442 const ArgList &Args, ArgStringList &CmdArgs) {
1443 std::vector<const char *> Features;
1444 switch (Triple.getArch()) {
1445 default:
1446 break;
1447 case llvm::Triple::mips:
1448 case llvm::Triple::mipsel:
1449 case llvm::Triple::mips64:
1450 case llvm::Triple::mips64el:
1451 getMIPSTargetFeatures(D, Args, Features);
1452 break;
1453
1454 case llvm::Triple::arm:
1455 case llvm::Triple::thumb:
1456 getARMTargetFeatures(D, Triple, Args, Features);
1457 break;
1458
1459 case llvm::Triple::ppc:
1460 case llvm::Triple::ppc64:
1461 case llvm::Triple::ppc64le:
1462 getPPCTargetFeatures(Args, Features);
1463 break;
1464 case llvm::Triple::sparc:
1465 getSparcTargetFeatures(Args, Features);
1466 break;
1467 case llvm::Triple::aarch64:
1468 getAArch64TargetFeatures(D, Args, Features);
1469 break;
1470 case llvm::Triple::x86:
1471 case llvm::Triple::x86_64:
1472 getX86TargetFeatures(Args, Features);
1473 break;
1474 }
Rafael Espindola43964802013-08-21 17:34:32 +00001475
1476 // Find the last of each feature.
1477 llvm::StringMap<unsigned> LastOpt;
1478 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1479 const char *Name = Features[I];
1480 assert(Name[0] == '-' || Name[0] == '+');
1481 LastOpt[Name + 1] = I;
1482 }
1483
1484 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1485 // If this feature was overridden, ignore it.
1486 const char *Name = Features[I];
1487 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1488 assert(LastI != LastOpt.end());
1489 unsigned Last = LastI->second;
1490 if (Last != I)
1491 continue;
1492
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001493 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001494 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001495 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001496}
1497
Eric Christopher84fbdb42011-08-19 00:30:14 +00001498static bool
John McCall5fb5df92012-06-20 06:18:46 +00001499shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001500 const llvm::Triple &Triple) {
1501 // We use the zero-cost exception tables for Objective-C if the non-fragile
1502 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1503 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001504 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001505 return true;
1506
Bob Wilson6524dd32011-10-14 05:03:44 +00001507 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001508 return false;
1509
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001510 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001511 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001512 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001513}
1514
Anders Carlssone96ab552011-02-28 02:27:16 +00001515/// addExceptionArgs - Adds exception related arguments to the driver command
1516/// arguments. There's a master flag, -fexceptions and also language specific
1517/// flags to enable/disable C++ and Objective-C exceptions.
1518/// This makes it possible to for example disable C++ exceptions but enable
1519/// Objective-C exceptions.
1520static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1521 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001522 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001523 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001524 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001525 if (KernelOrKext) {
1526 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1527 // arguments now to avoid warnings about unused arguments.
1528 Args.ClaimAllArgs(options::OPT_fexceptions);
1529 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1530 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1531 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1532 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1533 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001534 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001535 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001536
1537 // Exceptions are enabled by default.
1538 bool ExceptionsEnabled = true;
1539
1540 // This keeps track of whether exceptions were explicitly turned on or off.
1541 bool DidHaveExplicitExceptionFlag = false;
1542
Rafael Espindola00a66572009-10-01 13:33:33 +00001543 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1544 options::OPT_fno_exceptions)) {
1545 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001546 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001547 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001548 ExceptionsEnabled = false;
1549
1550 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001551 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001552
Anders Carlssone96ab552011-02-28 02:27:16 +00001553 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001554
Anders Carlssone96ab552011-02-28 02:27:16 +00001555 // Exception tables and cleanups can be enabled with -fexceptions even if the
1556 // language itself doesn't support exceptions.
1557 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1558 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001559
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001560 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1561 // is not necessarily sensible, but follows GCC.
1562 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001563 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001564 options::OPT_fno_objc_exceptions,
1565 true)) {
1566 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001567
Eric Christopher84fbdb42011-08-19 00:30:14 +00001568 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001569 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001570 }
1571
1572 if (types::isCXX(InputType)) {
1573 bool CXXExceptionsEnabled = ExceptionsEnabled;
1574
Eric Christopher84fbdb42011-08-19 00:30:14 +00001575 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1576 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001577 options::OPT_fexceptions,
1578 options::OPT_fno_exceptions)) {
1579 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1580 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001581 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001582 CXXExceptionsEnabled = false;
1583 }
1584
1585 if (CXXExceptionsEnabled) {
1586 CmdArgs.push_back("-fcxx-exceptions");
1587
1588 ShouldUseExceptionTables = true;
1589 }
1590 }
1591
1592 if (ShouldUseExceptionTables)
1593 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001594}
1595
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001596static bool ShouldDisableAutolink(const ArgList &Args,
1597 const ToolChain &TC) {
1598 bool Default = true;
1599 if (TC.getTriple().isOSDarwin()) {
1600 // The native darwin assembler doesn't support the linker_option directives,
1601 // so we disable them if we think the .s file will be passed to it.
1602 Default = TC.useIntegratedAs();
1603 }
1604 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1605 Default);
1606}
1607
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001608static bool ShouldDisableCFI(const ArgList &Args,
1609 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001610 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001611 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001612 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001613 // we disable them if we think the .s file will be passed to it.
Rafael Espindola84b588b2013-03-18 18:10:27 +00001614 Default = TC.useIntegratedAs();
Rafael Espindolaf934f982011-05-17 16:26:17 +00001615 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001616 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher45f2e712012-12-18 00:31:10 +00001617 options::OPT_fno_dwarf2_cfi_asm,
1618 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001619}
1620
Ted Kremenek62093662013-03-12 17:02:12 +00001621static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1622 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001623 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1624 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001625 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001626 return !UseDwarfDirectory;
1627}
1628
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001629/// \brief Check whether the given input tree contains any compilation actions.
1630static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001631 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001632 return true;
1633
1634 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1635 if (ContainsCompileAction(*it))
1636 return true;
1637
1638 return false;
1639}
1640
1641/// \brief Check if -relax-all should be passed to the internal assembler.
1642/// This is done by default when compiling non-assembler source with -O0.
1643static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1644 bool RelaxDefault = true;
1645
1646 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1647 RelaxDefault = A->getOption().matches(options::OPT_O0);
1648
1649 if (RelaxDefault) {
1650 RelaxDefault = false;
1651 for (ActionList::const_iterator it = C.getActions().begin(),
1652 ie = C.getActions().end(); it != ie; ++it) {
1653 if (ContainsCompileAction(*it)) {
1654 RelaxDefault = true;
1655 break;
1656 }
1657 }
1658 }
1659
1660 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1661 RelaxDefault);
1662}
1663
David Blaikie9260ed62013-07-25 21:19:01 +00001664static void CollectArgsForIntegratedAssembler(Compilation &C,
1665 const ArgList &Args,
1666 ArgStringList &CmdArgs,
1667 const Driver &D) {
1668 if (UseRelaxAll(C, Args))
1669 CmdArgs.push_back("-mrelax-all");
1670
1671 // When using an integrated assembler, translate -Wa, and -Xassembler
1672 // options.
1673 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1674 options::OPT_Xassembler),
1675 ie = Args.filtered_end(); it != ie; ++it) {
1676 const Arg *A = *it;
1677 A->claim();
1678
1679 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1680 StringRef Value = A->getValue(i);
1681
1682 if (Value == "-force_cpusubtype_ALL") {
1683 // Do nothing, this is the default and we don't support anything else.
1684 } else if (Value == "-L") {
1685 CmdArgs.push_back("-msave-temp-labels");
1686 } else if (Value == "--fatal-warnings") {
1687 CmdArgs.push_back("-mllvm");
1688 CmdArgs.push_back("-fatal-assembler-warnings");
1689 } else if (Value == "--noexecstack") {
1690 CmdArgs.push_back("-mnoexecstack");
1691 } else {
1692 D.Diag(diag::err_drv_unsupported_option_argument)
1693 << A->getOption().getName() << Value;
1694 }
1695 }
1696 }
1697}
1698
Chandler Carruth36381702013-06-23 11:28:48 +00001699static void addProfileRTLinux(
1700 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1701 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1702 Args.hasArg(options::OPT_fprofile_generate) ||
1703 Args.hasArg(options::OPT_fcreate_profile) ||
1704 Args.hasArg(options::OPT_coverage)))
1705 return;
1706
1707 // The profile runtime is located in the Linux library directory and has name
1708 // "libclang_rt.profile-<ArchName>.a".
1709 SmallString<128> LibProfile(TC.getDriver().ResourceDir);
1710 llvm::sys::path::append(
1711 LibProfile, "lib", "linux",
1712 Twine("libclang_rt.profile-") + TC.getArchName() + ".a");
1713
1714 CmdArgs.push_back(Args.MakeArgString(LibProfile));
1715}
1716
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001717static void addSanitizerRTLinkFlagsLinux(
1718 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smithf3e624c2013-03-23 00:30:08 +00001719 const StringRef Sanitizer, bool BeforeLibStdCXX,
1720 bool ExportSymbols = true) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001721 // Sanitizer runtime is located in the Linux library directory and
1722 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1723 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1724 llvm::sys::path::append(
1725 LibSanitizer, "lib", "linux",
1726 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
Richard Smithcff3cde2013-03-20 23:49:07 +00001727
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001728 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1729 // etc.) so that the linker picks custom versions of the global 'operator
1730 // new' and 'operator delete' symbols. We take the extreme (but simple)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001731 // strategy of inserting it at the front of the link command. It also
1732 // needs to be forced to end up in the executable, so wrap it in
1733 // whole-archive.
Richard Smithcff3cde2013-03-20 23:49:07 +00001734 SmallVector<const char *, 3> LibSanitizerArgs;
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001735 LibSanitizerArgs.push_back("-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001736 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001737 LibSanitizerArgs.push_back("-no-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001738
1739 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1740 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1741
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001742 CmdArgs.push_back("-lpthread");
Evgeniy Stepanov758b5072013-05-24 14:28:03 +00001743 CmdArgs.push_back("-lrt");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001744 CmdArgs.push_back("-ldl");
Richard Smithf3e624c2013-03-23 00:30:08 +00001745
1746 // If possible, use a dynamic symbols file to export the symbols from the
1747 // runtime library. If we can't do so, use -export-dynamic instead to export
1748 // all symbols from the binary.
1749 if (ExportSymbols) {
1750 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1751 CmdArgs.push_back(
1752 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1753 else
1754 CmdArgs.push_back("-export-dynamic");
1755 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001756}
1757
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001758/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1759/// This needs to be called before we add the C run-time (malloc, etc).
1760static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001761 ArgStringList &CmdArgs) {
Nick Lewycky609dd662013-10-11 03:33:53 +00001762 if (TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001763 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1764 llvm::sys::path::append(LibAsan, "lib", "linux",
1765 (Twine("libclang_rt.asan-") +
1766 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay35439df2012-12-04 21:18:26 +00001767 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001768 } else {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001769 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001770 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001771 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001772}
1773
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001774/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1775/// This needs to be called before we add the C run-time (malloc, etc).
1776static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1777 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001778 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001779 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001780}
1781
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001782/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1783/// This needs to be called before we add the C run-time (malloc, etc).
1784static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1785 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001786 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001787 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001788}
1789
1790/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
1791/// This needs to be called before we add the C run-time (malloc, etc).
1792static void addLsanRTLinux(const ToolChain &TC, const ArgList &Args,
1793 ArgStringList &CmdArgs) {
1794 if (!Args.hasArg(options::OPT_shared))
1795 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001796}
1797
Richard Smithe30752c2012-10-09 19:52:38 +00001798/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1799/// (Linux).
1800static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
Richard Smithcff3cde2013-03-20 23:49:07 +00001801 ArgStringList &CmdArgs, bool IsCXX,
1802 bool HasOtherSanitizerRt) {
Nick Lewycky24921692013-10-19 00:27:23 +00001803 // Need a copy of sanitizer_common. This could come from another sanitizer
1804 // runtime; if we're not including one, include our own copy.
1805 if (!HasOtherSanitizerRt)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001806 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
1807
1808 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
1809
1810 // Only include the bits of the runtime which need a C++ ABI library if
1811 // we're linking in C++ mode.
1812 if (IsCXX)
1813 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smithe30752c2012-10-09 19:52:38 +00001814}
1815
Peter Collingbournec3772752013-08-07 22:47:34 +00001816static void addDfsanRTLinux(const ToolChain &TC, const ArgList &Args,
1817 ArgStringList &CmdArgs) {
1818 if (!Args.hasArg(options::OPT_shared))
1819 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "dfsan", true);
1820}
1821
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001822static bool shouldUseFramePointerForTarget(const ArgList &Args,
1823 const llvm::Triple &Triple) {
1824 switch (Triple.getArch()) {
1825 // Don't use a frame pointer on linux if optimizing for certain targets.
1826 case llvm::Triple::mips64:
1827 case llvm::Triple::mips64el:
1828 case llvm::Triple::mips:
1829 case llvm::Triple::mipsel:
1830 case llvm::Triple::systemz:
1831 case llvm::Triple::x86:
1832 case llvm::Triple::x86_64:
1833 if (Triple.isOSLinux())
1834 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1835 if (!A->getOption().matches(options::OPT_O0))
1836 return false;
1837 return true;
1838 case llvm::Triple::xcore:
1839 return false;
1840 default:
1841 return true;
1842 }
1843}
1844
Rafael Espindola224dd632011-12-14 21:02:23 +00001845static bool shouldUseFramePointer(const ArgList &Args,
1846 const llvm::Triple &Triple) {
1847 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1848 options::OPT_fomit_frame_pointer))
1849 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1850
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001851 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00001852}
1853
Eric Christopherb7d97e92013-04-03 01:58:53 +00001854static bool shouldUseLeafFramePointer(const ArgList &Args,
1855 const llvm::Triple &Triple) {
1856 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1857 options::OPT_momit_leaf_frame_pointer))
1858 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1859
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001860 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00001861}
1862
Rafael Espindolac7367ff2013-08-10 01:40:10 +00001863/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001864static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00001865 SmallString<128> cwd;
1866 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00001867 CmdArgs.push_back("-fdebug-compilation-dir");
1868 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001869 }
1870}
1871
Eric Christopherd3804002013-02-22 20:12:52 +00001872static const char *SplitDebugName(const ArgList &Args,
1873 const InputInfoList &Inputs) {
1874 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1875 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1876 SmallString<128> T(FinalOutput->getValue());
1877 llvm::sys::path::replace_extension(T, "dwo");
1878 return Args.MakeArgString(T);
1879 } else {
1880 // Use the compilation dir.
1881 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1882 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1883 llvm::sys::path::replace_extension(F, "dwo");
1884 T += F;
1885 return Args.MakeArgString(F);
1886 }
1887}
1888
1889static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1890 const Tool &T, const JobAction &JA,
1891 const ArgList &Args, const InputInfo &Output,
1892 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00001893 ArgStringList ExtractArgs;
1894 ExtractArgs.push_back("--extract-dwo");
1895
1896 ArgStringList StripArgs;
1897 StripArgs.push_back("--strip-dwo");
1898
1899 // Grabbing the output of the earlier compile step.
1900 StripArgs.push_back(Output.getFilename());
1901 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00001902 ExtractArgs.push_back(OutFile);
1903
1904 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00001905 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00001906
1907 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00001908 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001909
1910 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00001911 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001912}
1913
Chad Rosierb71f6aa2013-04-24 18:09:54 +00001914static bool isOptimizationLevelFast(const ArgList &Args) {
1915 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1916 if (A->getOption().matches(options::OPT_Ofast))
1917 return true;
1918 return false;
1919}
1920
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001921/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
1922static bool shouldEnableVectorizerAtOLevel(const ArgList &Args) {
1923 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00001924 if (A->getOption().matches(options::OPT_O4) ||
1925 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001926 return true;
1927
1928 if (A->getOption().matches(options::OPT_O0))
1929 return false;
1930
1931 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
1932
Rafael Espindola91780de2013-08-26 14:05:41 +00001933 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001934 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00001935 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001936 return true;
1937
1938 // Don't vectorize -Oz.
1939 if (S == "z")
1940 return false;
1941
1942 unsigned OptLevel = 0;
1943 if (S.getAsInteger(10, OptLevel))
1944 return false;
1945
1946 return OptLevel > 1;
1947 }
1948
1949 return false;
1950}
1951
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001952void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001953 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001954 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001955 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001956 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001957 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1958 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001959 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001960 ArgStringList CmdArgs;
1961
Daniel Dunbare521a892009-03-31 20:53:55 +00001962 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1963
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001964 // Invoke ourselves in -cc1 mode.
1965 //
1966 // FIXME: Implement custom jobs for internal actions.
1967 CmdArgs.push_back("-cc1");
1968
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001969 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001970 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001971 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001972 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001973
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001974 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001975 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001976
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001977 if (isa<AnalyzeJobAction>(JA)) {
1978 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1979 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001980 } else if (isa<MigrateJobAction>(JA)) {
1981 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001982 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001983 if (Output.getType() == types::TY_Dependencies)
1984 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00001985 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001986 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00001987 if (Args.hasArg(options::OPT_rewrite_objc) &&
1988 !Args.hasArg(options::OPT_g_Group))
1989 CmdArgs.push_back("-P");
1990 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00001991 } else if (isa<AssembleJobAction>(JA)) {
1992 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001993
David Blaikie9260ed62013-07-25 21:19:01 +00001994 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00001995
1996 // Also ignore explicit -force_cpusubtype_ALL option.
1997 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001998 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001999 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002000 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002001
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002002 if (JA.getType() == types::TY_Nothing)
2003 CmdArgs.push_back("-fsyntax-only");
2004 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002005 CmdArgs.push_back("-emit-pch");
2006 else
2007 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002008 } else {
2009 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002010
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002011 if (JA.getType() == types::TY_Nothing) {
2012 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002013 } else if (JA.getType() == types::TY_LLVM_IR ||
2014 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002015 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002016 } else if (JA.getType() == types::TY_LLVM_BC ||
2017 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002018 CmdArgs.push_back("-emit-llvm-bc");
2019 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002020 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002021 } else if (JA.getType() == types::TY_AST) {
2022 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002023 } else if (JA.getType() == types::TY_ModuleFile) {
2024 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002025 } else if (JA.getType() == types::TY_RewrittenObjC) {
2026 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002027 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002028 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2029 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002030 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002031 } else {
2032 assert(JA.getType() == types::TY_PP_Asm &&
2033 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002034 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002035 }
2036
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002037 // The make clang go fast button.
2038 CmdArgs.push_back("-disable-free");
2039
John McCallbb79b5f2010-02-13 03:50:24 +00002040 // Disable the verification pass in -asserts builds.
2041#ifdef NDEBUG
2042 CmdArgs.push_back("-disable-llvm-verifier");
2043#endif
2044
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002045 // Set the main file name, so that debug info works even with
2046 // -save-temps.
2047 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002048 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002049
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002050 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002051 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002052 if (Args.hasArg(options::OPT_static))
2053 CmdArgs.push_back("-static-define");
2054
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002055 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002056 // Enable region store model by default.
2057 CmdArgs.push_back("-analyzer-store=region");
2058
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002059 // Treat blocks as analysis entry points.
2060 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2061
Ted Kremenek49c79792011-03-24 00:28:47 +00002062 CmdArgs.push_back("-analyzer-eagerly-assume");
2063
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002064 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002065 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002066 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002067
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002068 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
2069 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002070
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002071 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002072 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002073
2074 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002075
Jordan Rose10ad0812013-04-05 17:55:07 +00002076 if (types::isCXX(Inputs[0].getType()))
2077 CmdArgs.push_back("-analyzer-checker=cplusplus");
2078
Ted Kremenek37e96522012-01-26 02:27:38 +00002079 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00002080 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2081 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2082 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2083 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2084 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2085 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002086 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002087
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002088 // Set the output format. The default is plist, for (lame) historical
2089 // reasons.
2090 CmdArgs.push_back("-analyzer-output");
2091 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002092 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002093 else
2094 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002095
Ted Kremenekfe449a22010-03-22 22:32:05 +00002096 // Disable the presentation of standard compiler warnings when
2097 // using --analyze. We only want to show static analyzer diagnostics
2098 // or frontend errors.
2099 CmdArgs.push_back("-w");
2100
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002101 // Add -Xanalyzer arguments when running as analyzer.
2102 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002103 }
2104
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002105 CheckCodeGenerationOptions(D, Args);
2106
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002107 bool PIE = getToolChain().isPIEDefault();
2108 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002109 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002110
Alexey Samsonov090301e2013-04-09 12:28:19 +00002111 // For the PIC and PIE flag options, this logic is different from the
2112 // legacy logic in very old versions of GCC, as that logic was just
2113 // a bug no one had ever fixed. This logic is both more rational and
2114 // consistent with GCC's new logic now that the bugs are fixed. The last
2115 // argument relating to either PIC or PIE wins, and no other argument is
2116 // used. If the last argument is any flavor of the '-fno-...' arguments,
2117 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2118 // at the same level.
2119 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2120 options::OPT_fpic, options::OPT_fno_pic,
2121 options::OPT_fPIE, options::OPT_fno_PIE,
2122 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002123 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2124 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002125 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002126 if (LastPICArg) {
2127 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002128 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2129 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2130 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2131 PIC = PIE || O.matches(options::OPT_fPIC) ||
2132 O.matches(options::OPT_fpic);
2133 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2134 O.matches(options::OPT_fPIC);
2135 } else {
2136 PIE = PIC = false;
2137 }
2138 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002139 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002140
Nick Lewycky609dd662013-10-11 03:33:53 +00002141 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002142 // specified while enabling PIC enabled level 1 PIC, just force it back to
2143 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2144 // informal testing).
2145 if (PIC && getToolChain().getTriple().isOSDarwin())
2146 IsPICLevelTwo |= getToolChain().isPICDefault();
2147
Chandler Carruthc0c04552012-04-08 16:40:35 +00002148 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2149 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002150 llvm::Triple Triple(TripleStr);
Eric Christopher8d56caa2013-02-18 01:16:37 +00002151 if (KernelOrKext &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002152 (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002153 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002154 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002155 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002156
Chandler Carruth76a943b2012-11-19 03:52:03 +00002157 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2158 // This is a very special mode. It trumps the other modes, almost no one
2159 // uses it, and it isn't even valid on any OS but Darwin.
2160 if (!getToolChain().getTriple().isOSDarwin())
2161 D.Diag(diag::err_drv_unsupported_opt_for_target)
2162 << A->getSpelling() << getToolChain().getTriple().str();
2163
2164 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2165
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002166 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002167 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002168
Chandler Carruth76a943b2012-11-19 03:52:03 +00002169 // Only a forced PIC mode can cause the actual compile to have PIC defines
2170 // etc., no flags are sufficient. This behavior was selected to closely
2171 // match that of llvm-gcc and Apple GCC before that.
2172 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2173 CmdArgs.push_back("-pic-level");
2174 CmdArgs.push_back("2");
2175 }
2176 } else {
2177 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2178 // handled in Clang's IRGen by the -pie-level flag.
2179 CmdArgs.push_back("-mrelocation-model");
2180 CmdArgs.push_back(PIC ? "pic" : "static");
2181
2182 if (PIC) {
2183 CmdArgs.push_back("-pic-level");
2184 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2185 if (PIE) {
2186 CmdArgs.push_back("-pie-level");
2187 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2188 }
2189 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002190 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002191
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002192 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2193 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002194 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002195
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002196 // LLVM Code Generator Options.
2197
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002198 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2199 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002200 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002201 }
2202
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002203 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2204 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002205 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002206 D.Diag(diag::err_drv_unsupported_opt_for_target)
2207 << A->getSpelling() << getToolChain().getTriple().str();
2208 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2209 CmdArgs.push_back("-fpcc-struct-return");
2210 } else {
2211 assert(A->getOption().matches(options::OPT_freg_struct_return));
2212 CmdArgs.push_back("-freg-struct-return");
2213 }
2214 }
2215
Roman Divacky65b88cd2011-03-01 17:40:53 +00002216 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2217 CmdArgs.push_back("-mrtd");
2218
Rafael Espindola224dd632011-12-14 21:02:23 +00002219 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002220 CmdArgs.push_back("-mdisable-fp-elim");
2221 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2222 options::OPT_fno_zero_initialized_in_bss))
2223 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002224
2225 bool OFastEnabled = isOptimizationLevelFast(Args);
2226 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2227 // enabled. This alias option is being used to simplify the hasFlag logic.
2228 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2229 options::OPT_fstrict_aliasing;
2230 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00002231 options::OPT_fno_strict_aliasing,
2232 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00002233 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002234 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2235 options::OPT_fno_struct_path_tbaa))
2236 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002237 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2238 false))
2239 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002240 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2241 options::OPT_fno_optimize_sibling_calls))
2242 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002243
Eric Christopher006208c2013-04-04 06:29:47 +00002244 // Handle segmented stacks.
2245 if (Args.hasArg(options::OPT_fsplit_stack))
2246 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002247
2248 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2249 // This alias option is being used to simplify the getLastArg logic.
2250 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2251 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002252
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002253 // Handle various floating point optimization flags, mapping them to the
2254 // appropriate LLVM code generation flags. The pattern for all of these is to
2255 // default off the codegen optimizations, and if any flag enables them and no
2256 // flag disables them after the flag enabling them, enable the codegen
2257 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002258 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002259 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002260 options::OPT_ffinite_math_only,
2261 options::OPT_fno_finite_math_only,
2262 options::OPT_fhonor_infinities,
2263 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002264 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2265 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002266 A->getOption().getID() != options::OPT_fhonor_infinities)
2267 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002268 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002269 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002270 options::OPT_ffinite_math_only,
2271 options::OPT_fno_finite_math_only,
2272 options::OPT_fhonor_nans,
2273 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002274 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2275 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002276 A->getOption().getID() != options::OPT_fhonor_nans)
2277 CmdArgs.push_back("-menable-no-nans");
2278
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002279 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2280 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002281 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002282 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002283 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002284 options::OPT_fno_math_errno)) {
2285 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2286 // However, turning *off* -ffast_math merely restores the toolchain default
2287 // (which may be false).
2288 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2289 A->getOption().getID() == options::OPT_ffast_math ||
2290 A->getOption().getID() == options::OPT_Ofast)
2291 MathErrno = false;
2292 else if (A->getOption().getID() == options::OPT_fmath_errno)
2293 MathErrno = true;
2294 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002295 if (MathErrno)
2296 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002297
2298 // There are several flags which require disabling very specific
2299 // optimizations. Any of these being disabled forces us to turn off the
2300 // entire set of LLVM optimizations, so collect them through all the flag
2301 // madness.
2302 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002303 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002304 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002305 options::OPT_funsafe_math_optimizations,
2306 options::OPT_fno_unsafe_math_optimizations,
2307 options::OPT_fassociative_math,
2308 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002309 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2310 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002311 A->getOption().getID() != options::OPT_fno_associative_math)
2312 AssociativeMath = true;
2313 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002314 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002315 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002316 options::OPT_funsafe_math_optimizations,
2317 options::OPT_fno_unsafe_math_optimizations,
2318 options::OPT_freciprocal_math,
2319 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002320 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2321 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002322 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2323 ReciprocalMath = true;
2324 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002325 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002326 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002327 options::OPT_funsafe_math_optimizations,
2328 options::OPT_fno_unsafe_math_optimizations,
2329 options::OPT_fsigned_zeros,
2330 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002331 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2332 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002333 A->getOption().getID() != options::OPT_fsigned_zeros)
2334 SignedZeros = false;
2335 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002336 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002337 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002338 options::OPT_funsafe_math_optimizations,
2339 options::OPT_fno_unsafe_math_optimizations,
2340 options::OPT_ftrapping_math,
2341 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002342 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2343 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002344 A->getOption().getID() != options::OPT_ftrapping_math)
2345 TrappingMath = false;
2346 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2347 !TrappingMath)
2348 CmdArgs.push_back("-menable-unsafe-fp-math");
2349
Lang Hamesaa53b932012-07-06 00:59:19 +00002350
2351 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002352 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002353 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002354 options::OPT_ffp_contract)) {
2355 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002356 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002357 if (Val == "fast" || Val == "on" || Val == "off") {
2358 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2359 } else {
2360 D.Diag(diag::err_drv_unsupported_option_argument)
2361 << A->getOption().getName() << Val;
2362 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002363 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2364 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002365 // If fast-math is set then set the fp-contract mode to fast.
2366 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2367 }
2368 }
2369
Bob Wilson6a039162012-07-19 03:52:53 +00002370 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2371 // and if we find them, tell the frontend to provide the appropriate
2372 // preprocessor macros. This is distinct from enabling any optimizations as
2373 // these options induce language changes which must survive serialization
2374 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002375 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2376 options::OPT_fno_fast_math))
2377 if (!A->getOption().matches(options::OPT_fno_fast_math))
2378 CmdArgs.push_back("-ffast-math");
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002379 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2380 if (A->getOption().matches(options::OPT_ffinite_math_only))
2381 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002382
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002383 // Decide whether to use verbose asm. Verbose assembly is the default on
2384 // toolchains which have the integrated assembler on by default.
2385 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2386 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002387 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002388 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002389 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002390
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002391 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2392 CmdArgs.push_back("-mdebug-pass");
2393 CmdArgs.push_back("Structure");
2394 }
2395 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2396 CmdArgs.push_back("-mdebug-pass");
2397 CmdArgs.push_back("Arguments");
2398 }
2399
John McCall8517abc2010-02-19 02:45:38 +00002400 // Enable -mconstructor-aliases except on darwin, where we have to
2401 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002402 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002403 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002404
John McCall7ef5cb32011-03-18 02:56:14 +00002405 // Darwin's kernel doesn't support guard variables; just die if we
2406 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002407 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002408 CmdArgs.push_back("-fforbid-guard-variables");
2409
Douglas Gregordbe39272011-02-01 15:15:22 +00002410 if (Args.hasArg(options::OPT_mms_bitfields)) {
2411 CmdArgs.push_back("-mms-bitfields");
2412 }
John McCall8517abc2010-02-19 02:45:38 +00002413
Daniel Dunbar306945d2009-09-16 06:17:29 +00002414 // This is a coarse approximation of what llvm-gcc actually does, both
2415 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2416 // complicated ways.
2417 bool AsynchronousUnwindTables =
2418 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2419 options::OPT_fno_asynchronous_unwind_tables,
2420 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002421 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002422 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2423 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002424 CmdArgs.push_back("-munwind-tables");
2425
Chandler Carruth05fb5852012-11-21 23:40:23 +00002426 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002427
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002428 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2429 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002430 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002431 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002432
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002433 // FIXME: Handle -mtune=.
2434 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002435
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002436 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002437 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002438 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002439 }
2440
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002441 // Add the target cpu
2442 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2443 llvm::Triple ETriple(ETripleStr);
2444 std::string CPU = getCPUName(Args, ETriple);
2445 if (!CPU.empty()) {
2446 CmdArgs.push_back("-target-cpu");
2447 CmdArgs.push_back(Args.MakeArgString(CPU));
2448 }
2449
Rafael Espindolaeb265472013-08-21 21:59:03 +00002450 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2451 CmdArgs.push_back("-mfpmath");
2452 CmdArgs.push_back(A->getValue());
2453 }
2454
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002455 // Add the target features
2456 getTargetFeatures(D, ETriple, Args, CmdArgs);
2457
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002458 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002459 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002460 default:
2461 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002462
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002463 case llvm::Triple::arm:
2464 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002465 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002466 break;
2467
Eric Christopher0b26a612010-03-02 02:41:08 +00002468 case llvm::Triple::mips:
2469 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002470 case llvm::Triple::mips64:
2471 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002472 AddMIPSTargetArgs(Args, CmdArgs);
2473 break;
2474
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002475 case llvm::Triple::sparc:
2476 AddSparcTargetArgs(Args, CmdArgs);
2477 break;
2478
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002479 case llvm::Triple::x86:
2480 case llvm::Triple::x86_64:
2481 AddX86TargetArgs(Args, CmdArgs);
2482 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002483
2484 case llvm::Triple::hexagon:
2485 AddHexagonTargetArgs(Args, CmdArgs);
2486 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002487 }
2488
Hans Wennborg75958c42013-08-08 00:17:41 +00002489 // Add clang-cl arguments.
2490 if (getToolChain().getDriver().IsCLMode())
2491 AddClangCLArgs(Args, CmdArgs);
2492
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002493 // Pass the linker version in use.
2494 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2495 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002496 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002497 }
2498
Eric Christopherb7d97e92013-04-03 01:58:53 +00002499 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002500 CmdArgs.push_back("-momit-leaf-frame-pointer");
2501
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002502 // Explicitly error on some things we know we don't support and can't just
2503 // ignore.
2504 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002505 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2506 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002507 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002508 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002509 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002510 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2511 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002512 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002513 << Unsupported->getOption().getName();
2514 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002515 }
2516
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002517 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002518 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002519 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002520 CmdArgs.push_back("-header-include-file");
2521 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2522 D.CCPrintHeadersFilename : "-");
2523 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002524 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002525 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002526
Chad Rosierbe10f982011-08-02 17:58:04 +00002527 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002528 CmdArgs.push_back("-diagnostic-log-file");
2529 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2530 D.CCLogDiagnosticsFilename : "-");
2531 }
2532
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002533 // Use the last option from "-g" group. "-gline-tables-only"
2534 // is preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002535 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002536 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002537 if (A->getOption().matches(options::OPT_gline_tables_only))
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002538 CmdArgs.push_back("-gline-tables-only");
Manman Ren9691f7f2013-06-19 01:46:49 +00002539 else if (A->getOption().matches(options::OPT_gdwarf_2))
2540 CmdArgs.push_back("-gdwarf-2");
2541 else if (A->getOption().matches(options::OPT_gdwarf_3))
2542 CmdArgs.push_back("-gdwarf-3");
2543 else if (A->getOption().matches(options::OPT_gdwarf_4))
2544 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002545 else if (!A->getOption().matches(options::OPT_g0) &&
Manman Ren38db0922013-07-02 23:15:25 +00002546 !A->getOption().matches(options::OPT_ggdb0)) {
2547 // Default is dwarf-2 for darwin.
2548 if (getToolChain().getTriple().isOSDarwin())
2549 CmdArgs.push_back("-gdwarf-2");
2550 else
2551 CmdArgs.push_back("-g");
2552 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002553 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002554
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002555 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2556 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002557 if (Args.hasArg(options::OPT_gcolumn_info))
2558 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002559
Eric Christopher138c32b2013-09-13 22:37:55 +00002560 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002561 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2562 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00002563 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002564 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00002565 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002566 CmdArgs.push_back("-g");
2567 CmdArgs.push_back("-backend-option");
2568 CmdArgs.push_back("-split-dwarf=Enable");
2569 }
2570
Eric Christopher138c32b2013-09-13 22:37:55 +00002571 // -ggnu-pubnames turns on gnu style pubnames in the backend.
2572 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2573 CmdArgs.push_back("-backend-option");
2574 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2575 }
Eric Christophereec89c22013-06-18 00:03:50 +00002576
2577 Args.AddAllArgs(CmdArgs, options::OPT_fdebug_types_section);
2578
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002579 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2580 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2581
Chris Lattner3c77a352010-06-22 00:03:40 +00002582 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2583
Nick Lewycky207bce32011-04-21 23:44:07 +00002584 if (Args.hasArg(options::OPT_ftest_coverage) ||
2585 Args.hasArg(options::OPT_coverage))
2586 CmdArgs.push_back("-femit-coverage-notes");
2587 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2588 Args.hasArg(options::OPT_coverage))
2589 CmdArgs.push_back("-femit-coverage-data");
2590
Nick Lewycky480cb992011-05-04 20:46:58 +00002591 if (C.getArgs().hasArg(options::OPT_c) ||
2592 C.getArgs().hasArg(options::OPT_S)) {
2593 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002594 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00002595 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00002596 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002597 SmallString<128> Pwd;
2598 if (!llvm::sys::fs::current_path(Pwd)) {
2599 llvm::sys::path::append(Pwd, CoverageFilename.str());
2600 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00002601 }
2602 }
Eric Christophere30f61c2013-02-22 00:24:40 +00002603 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002604 }
2605 }
2606
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002607 // Pass options for controlling the default header search paths.
2608 if (Args.hasArg(options::OPT_nostdinc)) {
2609 CmdArgs.push_back("-nostdsysteminc");
2610 CmdArgs.push_back("-nobuiltininc");
2611 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002612 if (Args.hasArg(options::OPT_nostdlibinc))
2613 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002614 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2615 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2616 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002617
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002618 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002619 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002620 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002621
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002622 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2623
Ted Kremenekf7639e12012-03-06 20:06:33 +00002624 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00002625 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002626 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002627 options::OPT_ccc_arcmt_modify,
2628 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002629 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002630 switch (A->getOption().getID()) {
2631 default:
2632 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002633 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002634 CmdArgs.push_back("-arcmt-check");
2635 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002636 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002637 CmdArgs.push_back("-arcmt-modify");
2638 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002639 case options::OPT_ccc_arcmt_migrate:
2640 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002641 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002642 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002643
2644 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2645 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002646 break;
John McCalld70fb982011-06-15 23:25:17 +00002647 }
2648 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00002649 } else {
2650 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2651 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2652 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00002653 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002654
Ted Kremenekf7639e12012-03-06 20:06:33 +00002655 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2656 if (ARCMTEnabled) {
2657 D.Diag(diag::err_drv_argument_not_allowed_with)
2658 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2659 }
2660 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002661 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002662
2663 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002664 options::OPT_objcmt_migrate_subscripting,
2665 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002666 // None specified, means enable them all.
2667 CmdArgs.push_back("-objcmt-migrate-literals");
2668 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002669 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002670 } else {
2671 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2672 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002673 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00002674 }
2675 }
2676
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002677 // Add preprocessing options like -I, -D, etc. if we are using the
2678 // preprocessor.
2679 //
2680 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002681 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00002682 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002683
Rafael Espindolaa7431922011-07-21 23:40:37 +00002684 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2685 // that "The compiler can only warn and ignore the option if not recognized".
2686 // When building with ccache, it will pass -D options to clang even on
2687 // preprocessed inputs and configure concludes that -fPIC is not supported.
2688 Args.ClaimAllArgs(options::OPT_D);
2689
Rafael Espindolaad70d962013-08-27 16:58:15 +00002690 // Manually translate -O4 to -O3; let clang reject others.
2691 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2692 if (A->getOption().matches(options::OPT_O4)) {
2693 CmdArgs.push_back("-O3");
2694 D.Diag(diag::warn_O4_is_O3);
2695 } else {
2696 A->render(Args, CmdArgs);
2697 }
2698 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002699
Chad Rosier86b82082012-12-12 20:06:31 +00002700 // Don't warn about unused -flto. This can happen when we're preprocessing or
2701 // precompiling.
2702 Args.ClaimAllArgs(options::OPT_flto);
2703
Daniel Dunbar945577c2009-10-29 02:24:45 +00002704 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002705 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2706 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002707 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002708 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002709
2710 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00002711 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002712 //
2713 // If a std is supplied, only add -trigraphs if it follows the
2714 // option.
2715 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2716 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002717 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002718 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002719 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002720 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002721 else
2722 Std->render(Args, CmdArgs);
2723
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002724 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2725 options::OPT_trigraphs))
2726 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002727 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002728 } else {
2729 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002730 //
2731 // FIXME: Clang doesn't correctly handle -std= when the input language
2732 // doesn't match. For the time being just ignore this for C++ inputs;
2733 // eventually we want to do all the standard defaulting here instead of
2734 // splitting it between the driver and clang -cc1.
2735 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002736 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2737 "-std=", /*Joined=*/true);
2738 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2739 CmdArgs.push_back("-std=c++11");
2740
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002741 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002742 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002743
Richard Smith282b4492013-09-04 22:50:31 +00002744 // GCC's behavior for -Wwrite-strings is a bit strange:
2745 // * In C, this "warning flag" changes the types of string literals from
2746 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
2747 // for the discarded qualifier.
2748 // * In C++, this is just a normal warning flag.
2749 //
2750 // Implementing this warning correctly in C is hard, so we follow GCC's
2751 // behavior for now. FIXME: Directly diagnose uses of a string literal as
2752 // a non-const char* in C, rather than using this crude hack.
2753 if (!types::isCXX(InputType)) {
2754 // FIXME: This should behave just like a warning flag, and thus should also
2755 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
2756 Arg *WriteStrings =
2757 Args.getLastArg(options::OPT_Wwrite_strings,
2758 options::OPT_Wno_write_strings, options::OPT_w);
2759 if (WriteStrings &&
2760 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
2761 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00002762 }
2763
Chandler Carruth61fbf622011-04-23 09:27:53 +00002764 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002765 // during C++ compilation, which it is by default. GCC keeps this define even
2766 // in the presence of '-w', match this behavior bug-for-bug.
2767 if (types::isCXX(InputType) &&
2768 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2769 true)) {
2770 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002771 }
2772
Chandler Carruthe0391482010-05-22 02:21:53 +00002773 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2774 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2775 if (Asm->getOption().matches(options::OPT_fasm))
2776 CmdArgs.push_back("-fgnu-keywords");
2777 else
2778 CmdArgs.push_back("-fno-gnu-keywords");
2779 }
2780
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002781 if (ShouldDisableCFI(Args, getToolChain()))
2782 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002783
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002784 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2785 CmdArgs.push_back("-fno-dwarf-directory-asm");
2786
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002787 if (ShouldDisableAutolink(Args, getToolChain()))
2788 CmdArgs.push_back("-fno-autolink");
2789
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002790 // Add in -fdebug-compilation-dir if necessary.
2791 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00002792
Richard Smith9a568822011-11-21 19:36:32 +00002793 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2794 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002795 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002796 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002797 }
2798
Richard Smith9a568822011-11-21 19:36:32 +00002799 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2800 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002801 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00002802 }
2803
Richard Smitha3d3bd22013-05-08 02:12:03 +00002804 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
2805 CmdArgs.push_back("-fconstexpr-steps");
2806 CmdArgs.push_back(A->getValue());
2807 }
2808
Richard Smithb3a14522013-02-22 01:59:51 +00002809 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2810 CmdArgs.push_back("-fbracket-depth");
2811 CmdArgs.push_back(A->getValue());
2812 }
2813
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002814 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2815 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002816 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002817 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002818 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2819 } else
2820 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002821 }
2822
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002823
Michael J. Spencer929fccd2012-10-22 22:13:48 +00002824 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002825 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002826
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002827 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2828 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00002829 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002830 }
David Chisnall5778fce2009-08-31 16:41:57 +00002831
Chris Lattnere23003d2010-01-09 21:54:33 +00002832 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2833 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00002834 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00002835 }
2836
Chris Lattnerb35583d2010-04-07 20:49:23 +00002837 CmdArgs.push_back("-ferror-limit");
2838 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00002839 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00002840 else
2841 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002842
Chandler Carrutha77a7272010-05-06 04:55:18 +00002843 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2844 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002845 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002846 }
2847
2848 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2849 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002850 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002851 }
2852
Richard Smithf6f003a2011-12-16 19:06:07 +00002853 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2854 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002855 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00002856 }
2857
Daniel Dunbar2c978472009-11-04 06:24:47 +00002858 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002859 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002860 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002861 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00002862 } else {
2863 // If -fmessage-length=N was not specified, determine whether this is a
2864 // terminal and, if so, implicitly define -fmessage-length appropriately.
2865 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002866 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002867 }
2868
John McCallb4a99d32013-02-19 01:57:35 +00002869 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2870 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2871 options::OPT_fvisibility_ms_compat)) {
2872 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2873 CmdArgs.push_back("-fvisibility");
2874 CmdArgs.push_back(A->getValue());
2875 } else {
2876 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2877 CmdArgs.push_back("-fvisibility");
2878 CmdArgs.push_back("hidden");
2879 CmdArgs.push_back("-ftype-visibility");
2880 CmdArgs.push_back("default");
2881 }
Daniel Dunbare357d562009-12-03 18:42:11 +00002882 }
2883
Douglas Gregor08329632010-06-15 17:05:35 +00002884 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002885
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002886 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2887
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002888 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002889 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2890 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002891 CmdArgs.push_back("-ffreestanding");
2892
Daniel Dunbare357d562009-12-03 18:42:11 +00002893 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002894 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002895 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002896 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002897 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002898 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00002899 // AltiVec language extensions aren't relevant for assembling.
2900 if (!isa<PreprocessJobAction>(JA) ||
2901 Output.getType() != types::TY_PP_Asm)
2902 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002903 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2904 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002905
Alexey Samsonov609213f92013-08-19 09:14:21 +00002906 const SanitizerArgs &Sanitize = D.getOrParseSanitizerArgs(Args);
Alexey Samsonove6203662013-08-09 07:42:13 +00002907 Sanitize.addArgs(getToolChain(), Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00002908
Will Dietz3676d562012-12-30 20:53:28 +00002909 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2910 options::OPT_fno_sanitize_recover,
2911 true))
2912 CmdArgs.push_back("-fno-sanitize-recover");
2913
Chad Rosierae229d52013-01-29 23:31:22 +00002914 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2915 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2916 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2917 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2918
Eric Christopher459d2712013-02-19 06:16:53 +00002919 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00002920 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002921 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00002922 getToolChain().getArch() == llvm::Triple::ppc64 ||
2923 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00002924 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00002925 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00002926
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002927 if (getToolChain().SupportsProfiling())
2928 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002929
2930 // -flax-vector-conversions is default.
2931 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2932 options::OPT_fno_lax_vector_conversions))
2933 CmdArgs.push_back("-fno-lax-vector-conversions");
2934
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002935 if (Args.getLastArg(options::OPT_fapple_kext))
2936 CmdArgs.push_back("-fapple-kext");
2937
David Blaikie690f21e2012-06-14 18:55:27 +00002938 if (Args.hasFlag(options::OPT_frewrite_includes,
2939 options::OPT_fno_rewrite_includes, false))
2940 CmdArgs.push_back("-frewrite-includes");
2941
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002942 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002943 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002944 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002945 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2946 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002947
2948 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2949 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00002950 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00002951 }
2952
Bob Wilson14adb362012-02-03 06:27:22 +00002953 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002954
Chandler Carruth6e501032011-03-27 00:04:55 +00002955 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2956 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2957 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2958 options::OPT_fno_wrapv)) {
2959 if (A->getOption().matches(options::OPT_fwrapv))
2960 CmdArgs.push_back("-fwrapv");
2961 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2962 options::OPT_fno_strict_overflow)) {
2963 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2964 CmdArgs.push_back("-fwrapv");
2965 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002966 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00002967 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
2968 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002969
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002970 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2971
Mahesha S6a682be42012-10-27 07:47:56 +00002972
Daniel Dunbar4930e332009-11-17 08:07:36 +00002973 // -stack-protector=0 is default.
2974 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002975 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2976 options::OPT_fstack_protector_all,
2977 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002978 if (A->getOption().matches(options::OPT_fstack_protector))
2979 StackProtectorLevel = 1;
2980 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2981 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002982 } else {
2983 StackProtectorLevel =
2984 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2985 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002986 if (StackProtectorLevel) {
2987 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002988 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002989 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002990
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002991 // --param ssp-buffer-size=
2992 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2993 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002994 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002995 if (Str.startswith("ssp-buffer-size=")) {
2996 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00002997 CmdArgs.push_back("-stack-protector-buffer-size");
2998 // FIXME: Verify the argument is a valid integer.
2999 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003000 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003001 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003002 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003003 }
3004
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003005 // Translate -mstackrealign
3006 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3007 false)) {
3008 CmdArgs.push_back("-backend-option");
3009 CmdArgs.push_back("-force-align-stack");
3010 }
3011 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3012 false)) {
3013 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3014 }
3015
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003016 if (Args.hasArg(options::OPT_mstack_alignment)) {
3017 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3018 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003019 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00003020 // -mkernel implies -mstrict-align; don't add the redundant option.
Renato Golina146a482013-08-24 14:44:41 +00003021 if (!KernelOrKext) {
Renato Golin8d5f3142013-08-28 23:56:07 +00003022 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3023 options::OPT_munaligned_access)) {
3024 if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3025 CmdArgs.push_back("-backend-option");
3026 CmdArgs.push_back("-arm-strict-align");
3027 } else {
3028 CmdArgs.push_back("-backend-option");
3029 CmdArgs.push_back("-arm-no-strict-align");
3030 }
Renato Golina146a482013-08-24 14:44:41 +00003031 }
Chad Rosier60027022012-11-09 17:29:19 +00003032 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003033
Daniel Dunbard18049a2009-04-07 21:16:11 +00003034 // Forward -f options with positive and negative forms; we translate
3035 // these by hand.
3036
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003037 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003038 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003039 CmdArgs.push_back("-fapple-kext");
3040 if (!Args.hasArg(options::OPT_fbuiltin))
3041 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003042 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003043 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003044 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003045 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003046 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003047
Nuno Lopes13c88c72009-12-16 16:59:22 +00003048 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3049 options::OPT_fno_assume_sane_operator_new))
3050 CmdArgs.push_back("-fno-assume-sane-operator-new");
3051
Daniel Dunbar4930e332009-11-17 08:07:36 +00003052 // -fblocks=0 is default.
3053 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003054 getToolChain().IsBlocksDefault()) ||
3055 (Args.hasArg(options::OPT_fgnu_runtime) &&
3056 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3057 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003058 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003059
3060 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3061 !getToolChain().hasBlocksRuntime())
3062 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003063 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003064
Douglas Gregor226173a2012-01-18 15:19:58 +00003065 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3066 // users must also pass -fcxx-modules. The latter flag will disappear once the
3067 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003068 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003069 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3070 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3071 options::OPT_fno_cxx_modules,
3072 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003073 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003074 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003075 HaveModules = true;
3076 }
3077 }
3078
Daniel Jasper07e6c402013-08-05 20:26:17 +00003079 // -fmodule-maps enables module map processing (off by default) for header
3080 // checking. It is implied by -fmodules.
3081 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3082 false)) {
3083 CmdArgs.push_back("-fmodule-maps");
3084 }
3085
Daniel Jasperac42b752013-10-21 06:34:34 +00003086 // -fmodules-decluse checks that modules used are declared so (off by
3087 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003088 if (Args.hasFlag(options::OPT_fmodules_decluse,
3089 options::OPT_fno_modules_decluse,
3090 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003091 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003092 }
3093
Daniel Jasperac42b752013-10-21 06:34:34 +00003094 // -fmodule-name specifies the module that is currently being built (or
3095 // used for header checking by -fmodule-maps).
3096 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name)) {
3097 A->claim();
3098 A->render(Args, CmdArgs);
3099 }
3100
3101 // -fmodule-map-file can be used to specify a file containing module
3102 // definitions.
3103 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file)) {
3104 A->claim();
3105 A->render(Args, CmdArgs);
3106 }
3107
Douglas Gregor35b04d62013-02-07 19:01:24 +00003108 // If a module path was provided, pass it along. Otherwise, use a temporary
3109 // directory.
3110 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3111 A->claim();
3112 if (HaveModules) {
3113 A->render(Args, CmdArgs);
3114 }
3115 } else if (HaveModules) {
3116 SmallString<128> DefaultModuleCache;
3117 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3118 DefaultModuleCache);
Douglas Gregor23c7d672013-03-21 21:48:48 +00003119 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3120 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor4bedb492013-02-07 22:59:12 +00003121 const char Arg[] = "-fmodules-cache-path=";
3122 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3123 Arg, Arg + strlen(Arg));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003124 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3125 }
3126
3127 // Pass through all -fmodules-ignore-macro arguments.
3128 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003129 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3130 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003131
John McCalldfea9982010-04-09 19:12:06 +00003132 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003133 if (Args.hasFlag(options::OPT_fno_access_control,
3134 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003135 false))
John McCall3155f572010-04-09 19:03:51 +00003136 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003137
Anders Carlssond470fef2010-11-21 00:09:52 +00003138 // -felide-constructors is the default.
3139 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3140 options::OPT_felide_constructors,
3141 false))
3142 CmdArgs.push_back("-fno-elide-constructors");
3143
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003144 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003145 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00003146 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00003147 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00003148
Richard Smith52be6192012-11-05 22:04:41 +00003149 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003150 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00003151 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00003152 Args.getLastArg(options::OPT_mkernel,
3153 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00003154 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00003155 D.Diag(diag::err_drv_argument_not_allowed_with)
3156 << "-fsanitize=vptr" << NoRttiArg;
3157 }
3158 }
3159
Tony Linthicum76329bf2011-12-12 21:14:55 +00003160 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003161 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003162 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003163 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00003164 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003165 CmdArgs.push_back("-fshort-enums");
3166
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003167 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003168 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003169 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00003170 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00003171
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003172 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003173 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003174 options::OPT_fno_threadsafe_statics))
3175 CmdArgs.push_back("-fno-threadsafe-statics");
3176
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003177 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003178 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3179 options::OPT_fno_use_cxa_atexit,
3180 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00003181 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003182 getToolChain().getArch() != llvm::Triple::hexagon) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00003183 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003184 CmdArgs.push_back("-fno-use-cxa-atexit");
3185
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003186 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003187 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003188 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3189 CmdArgs.push_back("-fms-extensions");
3190
Francois Pichet1b4f1632011-09-17 04:32:15 +00003191 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003192 if (Args.hasFlag(options::OPT_fms_compatibility,
3193 options::OPT_fno_ms_compatibility,
3194 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3195 Args.hasFlag(options::OPT_fms_extensions,
3196 options::OPT_fno_ms_extensions,
3197 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003198 CmdArgs.push_back("-fms-compatibility");
3199
Reid Klecknerc106fda2013-09-18 00:33:59 +00003200 // -fmsc-version=1700 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003201 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3202 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3203 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003204 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003205 if (msc_ver.empty())
Reid Klecknerc106fda2013-09-18 00:33:59 +00003206 CmdArgs.push_back("-fmsc-version=1700");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003207 else
3208 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3209 }
3210
3211
Eric Christopher5ecce122013-02-18 00:38:31 +00003212 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00003213 if (Args.hasFlag(options::OPT_fborland_extensions,
3214 options::OPT_fno_borland_extensions, false))
3215 CmdArgs.push_back("-fborland-extensions");
3216
Francois Pichet02744872011-09-01 16:38:08 +00003217 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3218 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003219 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3220 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00003221 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003222 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003223
Chandler Carruthe03aa552010-04-17 20:17:31 +00003224 // -fgnu-keywords default varies depending on language; only pass if
3225 // specified.
3226 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003227 options::OPT_fno_gnu_keywords))
3228 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00003229
Rafael Espindola922a6242011-06-02 17:30:53 +00003230 if (Args.hasFlag(options::OPT_fgnu89_inline,
3231 options::OPT_fno_gnu89_inline,
3232 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00003233 CmdArgs.push_back("-fgnu89-inline");
3234
Chad Rosier9c76d242012-03-15 22:31:42 +00003235 if (Args.hasArg(options::OPT_fno_inline))
3236 CmdArgs.push_back("-fno-inline");
3237
Chad Rosier64d6be92012-03-06 21:17:19 +00003238 if (Args.hasArg(options::OPT_fno_inline_functions))
3239 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00003240
John McCall5fb5df92012-06-20 06:18:46 +00003241 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00003242
John McCall5fb5df92012-06-20 06:18:46 +00003243 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahaniandaf48312013-10-15 17:16:30 +00003244 // legacy is the default. Next runtime is always legacy dispatch and
3245 // -fno-objc-legacy-dispatch gets ignored silently.
3246 if (objcRuntime.isNonFragile() && !objcRuntime.isNeXTFamily()) {
David Chisnall3154e682011-09-30 13:32:35 +00003247 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3248 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00003249 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003250 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00003251 if (getToolChain().UseObjCMixedDispatch())
3252 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3253 else
3254 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3255 }
3256 }
3257
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00003258 // -fencode-extended-block-signature=1 is default.
3259 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3260 CmdArgs.push_back("-fencode-extended-block-signature");
3261 }
3262
John McCall24fc0de2011-07-06 00:26:06 +00003263 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3264 // NOTE: This logic is duplicated in ToolChains.cpp.
3265 bool ARC = isObjCAutoRefCount(Args);
3266 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00003267 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00003268
John McCall24fc0de2011-07-06 00:26:06 +00003269 CmdArgs.push_back("-fobjc-arc");
3270
Chandler Carruth491db322011-11-04 07:34:47 +00003271 // FIXME: It seems like this entire block, and several around it should be
3272 // wrapped in isObjC, but for now we just use it here as this is where it
3273 // was being used previously.
3274 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3275 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3276 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3277 else
3278 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3279 }
3280
John McCall24fc0de2011-07-06 00:26:06 +00003281 // Allow the user to enable full exceptions code emission.
3282 // We define off for Objective-CC, on for Objective-C++.
3283 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3284 options::OPT_fno_objc_arc_exceptions,
3285 /*default*/ types::isCXX(InputType)))
3286 CmdArgs.push_back("-fobjc-arc-exceptions");
3287 }
3288
3289 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3290 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00003291 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00003292 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003293
John McCall24fc0de2011-07-06 00:26:06 +00003294 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3295 // takes precedence.
3296 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3297 if (!GCArg)
3298 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3299 if (GCArg) {
3300 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003301 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00003302 << GCArg->getAsString(Args);
3303 } else if (getToolChain().SupportsObjCGC()) {
3304 GCArg->render(Args, CmdArgs);
3305 } else {
3306 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003307 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00003308 << GCArg->getAsString(Args);
3309 }
3310 }
3311
John McCallb5f652e2011-06-22 00:53:57 +00003312 // Add exception args.
3313 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00003314 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00003315
3316 if (getToolChain().UseSjLjExceptions())
3317 CmdArgs.push_back("-fsjlj-exceptions");
3318
3319 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00003320 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3321 options::OPT_fno_assume_sane_operator_new))
3322 CmdArgs.push_back("-fno-assume-sane-operator-new");
3323
Daniel Dunbar34d7a992010-04-27 15:34:57 +00003324 // -fconstant-cfstrings is default, and may be subject to argument translation
3325 // on Darwin.
3326 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3327 options::OPT_fno_constant_cfstrings) ||
3328 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3329 options::OPT_mno_constant_cfstrings))
3330 CmdArgs.push_back("-fno-constant-cfstrings");
3331
John Thompsoned4e2952009-11-05 20:14:16 +00003332 // -fshort-wchar default varies depending on platform; only
3333 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00003334 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3335 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00003336
Hans Wennborg28c96312013-07-31 23:39:13 +00003337 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003338 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003339 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003340 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003341 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003342
Daniel Dunbar096ed292011-10-05 21:04:55 +00003343 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3344 // -fno-pack-struct doesn't apply to -fpack-struct=.
3345 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00003346 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00003347 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00003348 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00003349 } else if (Args.hasFlag(options::OPT_fpack_struct,
3350 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00003351 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00003352 }
3353
Robert Lytton0e076492013-08-13 09:43:10 +00003354 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003355 if (!Args.hasArg(options::OPT_fcommon))
3356 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00003357 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003358 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00003359
Daniel Dunbard18049a2009-04-07 21:16:11 +00003360 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003361 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003362 CmdArgs.push_back("-fno-common");
3363
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003364 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00003365 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00003366 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003367 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003368 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003369 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3370
Daniel Dunbar6358d682010-10-15 22:30:42 +00003371 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3372 if (!Args.hasFlag(options::OPT_ffor_scope,
3373 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003374 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00003375 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3376
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00003377 // -fcaret-diagnostics is default.
3378 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3379 options::OPT_fno_caret_diagnostics, true))
3380 CmdArgs.push_back("-fno-caret-diagnostics");
3381
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003382 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00003383 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003384 options::OPT_fno_diagnostics_fixit_info))
3385 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003386
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003387 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00003388 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003389 options::OPT_fno_diagnostics_show_option))
3390 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003391
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003392 if (const Arg *A =
3393 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3394 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00003395 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003396 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003397
Douglas Gregor643c9222011-05-21 17:07:29 +00003398 if (const Arg *A =
3399 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3400 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003401 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003402 }
3403
Chandler Carruthb6766f02011-03-27 01:50:55 +00003404 if (Arg *A = Args.getLastArg(
3405 options::OPT_fdiagnostics_show_note_include_stack,
3406 options::OPT_fno_diagnostics_show_note_include_stack)) {
3407 if (A->getOption().matches(
3408 options::OPT_fdiagnostics_show_note_include_stack))
3409 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3410 else
3411 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3412 }
3413
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003414 // Color diagnostics are the default, unless the terminal doesn't support
3415 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00003416 // Support both clang's -f[no-]color-diagnostics and gcc's
3417 // -f[no-]diagnostics-colors[=never|always|auto].
3418 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3419 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3420 it != ie; ++it) {
3421 const Option &O = (*it)->getOption();
3422 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3423 !O.matches(options::OPT_fdiagnostics_color) &&
3424 !O.matches(options::OPT_fno_color_diagnostics) &&
3425 !O.matches(options::OPT_fno_diagnostics_color) &&
3426 !O.matches(options::OPT_fdiagnostics_color_EQ))
3427 continue;
3428
3429 (*it)->claim();
3430 if (O.matches(options::OPT_fcolor_diagnostics) ||
3431 O.matches(options::OPT_fdiagnostics_color)) {
3432 ShowColors = Colors_On;
3433 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3434 O.matches(options::OPT_fno_diagnostics_color)) {
3435 ShowColors = Colors_Off;
3436 } else {
3437 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3438 StringRef value((*it)->getValue());
3439 if (value == "always")
3440 ShowColors = Colors_On;
3441 else if (value == "never")
3442 ShowColors = Colors_Off;
3443 else if (value == "auto")
3444 ShowColors = Colors_Auto;
3445 else
3446 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3447 << ("-fdiagnostics-color=" + value).str();
3448 }
3449 }
3450 if (ShowColors == Colors_On ||
3451 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003452 CmdArgs.push_back("-fcolor-diagnostics");
3453
Nico Rieck7857d462013-09-11 00:38:02 +00003454 if (Args.hasArg(options::OPT_fansi_escape_codes))
3455 CmdArgs.push_back("-fansi-escape-codes");
3456
Daniel Dunbardb097022009-06-08 21:13:54 +00003457 if (!Args.hasFlag(options::OPT_fshow_source_location,
3458 options::OPT_fno_show_source_location))
3459 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003460
Douglas Gregor643c9222011-05-21 17:07:29 +00003461 if (!Args.hasFlag(options::OPT_fshow_column,
3462 options::OPT_fno_show_column,
3463 true))
3464 CmdArgs.push_back("-fno-show-column");
3465
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00003466 if (!Args.hasFlag(options::OPT_fspell_checking,
3467 options::OPT_fno_spell_checking))
3468 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003469
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003470
Chad Rosierc8e56e82012-12-05 21:08:21 +00003471 // -fno-asm-blocks is default.
3472 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3473 false))
3474 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003475
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003476 // Enable vectorization per default according to the optimization level
3477 // selected. For optimization levels that want vectorization we use the alias
3478 // option to simplify the hasFlag logic.
3479 bool EnableVec = shouldEnableVectorizerAtOLevel(Args);
3480 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00003481 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00003482 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00003483 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003484 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003485
Rafael Espindolaf818ef42013-08-01 23:56:42 +00003486 // -fslp-vectorize is default.
3487 if (Args.hasFlag(options::OPT_fslp_vectorize,
3488 options::OPT_fno_slp_vectorize, true))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00003489 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00003490
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003491 // -fno-slp-vectorize-aggressive is default.
3492 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003493 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003494 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003495
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00003496 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3497 A->render(Args, CmdArgs);
3498
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003499 // -fdollars-in-identifiers default varies depending on platform and
3500 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00003501 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003502 options::OPT_fno_dollars_in_identifiers)) {
3503 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003504 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003505 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003506 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003507 }
3508
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003509 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3510 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00003511 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003512 options::OPT_fno_unit_at_a_time)) {
3513 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003514 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003515 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003516
Eli Friedman055c9702011-11-02 01:53:16 +00003517 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3518 options::OPT_fno_apple_pragma_pack, false))
3519 CmdArgs.push_back("-fapple-pragma-pack");
3520
Eli Benderskyc95cfe82013-07-24 18:20:14 +00003521 // le32-specific flags:
3522 // -fno-math-builtin: clang should not convert math builtins to intrinsics
3523 // by default.
3524 if (getToolChain().getArch() == llvm::Triple::le32) {
3525 CmdArgs.push_back("-fno-math-builtin");
3526 }
3527
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003528 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003529 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003530 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003531#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003532 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003533 (getToolChain().getArch() == llvm::Triple::arm ||
3534 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003535 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3536 CmdArgs.push_back("-fno-builtin-strcat");
3537 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3538 CmdArgs.push_back("-fno-builtin-strcpy");
3539 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003540#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003541
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003542 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003543 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003544 options::OPT_traditional_cpp)) {
3545 if (isa<PreprocessJobAction>(JA))
3546 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003547 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003548 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003549 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003550
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003551 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003552 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003553
3554 // Handle serialized diagnostics.
3555 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3556 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003557 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003558 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003559
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003560 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3561 CmdArgs.push_back("-fretain-comments-from-system-headers");
3562
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003563 // Forward -fcomment-block-commands to -cc1.
3564 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00003565 // Forward -fparse-all-comments to -cc1.
3566 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003567
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003568 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3569 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003570 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003571 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3572 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003573 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003574
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003575 // We translate this by hand to the -cc1 argument, since nightly test uses
3576 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003577 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003578 CmdArgs.push_back("-disable-llvm-optzns");
3579 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003580 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003581 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003582
Daniel Dunbard67a3222009-03-30 06:36:42 +00003583 if (Output.getType() == types::TY_Dependencies) {
3584 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003585 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003586 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003587 CmdArgs.push_back(Output.getFilename());
3588 } else {
3589 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003590 }
3591
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003592 for (InputInfoList::const_iterator
3593 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3594 const InputInfo &II = *it;
3595 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00003596 if (Args.hasArg(options::OPT_rewrite_objc))
3597 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3598 else
3599 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00003600 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003601 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003602 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003603 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003604 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003605
Chris Lattnere9d7d782009-11-03 19:50:27 +00003606 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3607
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003608 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003609
3610 // Optionally embed the -cc1 level arguments into the debug info, for build
3611 // analysis.
3612 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003613 ArgStringList OriginalArgs;
3614 for (ArgList::const_iterator it = Args.begin(),
3615 ie = Args.end(); it != ie; ++it)
3616 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003617
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003618 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003619 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003620 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003621 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003622 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003623 }
3624 CmdArgs.push_back("-dwarf-debug-flags");
3625 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3626 }
3627
Eric Christopherd3804002013-02-22 20:12:52 +00003628 // Add the split debug info name to the command lines here so we
3629 // can propagate it to the backend.
3630 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003631 getToolChain().getTriple().isOSLinux() &&
Eric Christopherf1545832013-02-22 23:50:16 +00003632 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00003633 const char *SplitDwarfOut;
3634 if (SplitDwarf) {
3635 CmdArgs.push_back("-split-dwarf-file");
3636 SplitDwarfOut = SplitDebugName(Args, Inputs);
3637 CmdArgs.push_back(SplitDwarfOut);
3638 }
3639
3640 // Finally add the compile command to the compilation.
Hans Wennborg87cfa712013-09-19 20:32:16 +00003641 if (Args.hasArg(options::OPT__SLASH_fallback)) {
3642 tools::visualstudio::Compile CL(getToolChain());
3643 Command *CLCommand = CL.GetCommand(C, JA, Output, Inputs, Args,
3644 LinkingOutput);
3645 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
3646 } else {
3647 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3648 }
3649
Daniel Dunbar17731772009-03-23 19:03:36 +00003650
Eric Christopherf1545832013-02-22 23:50:16 +00003651 // Handle the debug info splitting at object creation time if we're
3652 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00003653 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00003654 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00003655 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00003656
Roman Divacky178e01602011-02-10 16:52:03 +00003657 if (Arg *A = Args.getLastArg(options::OPT_pg))
3658 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003659 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00003660 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003661
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003662 // Claim some arguments which clang supports automatically.
3663
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00003664 // -fpch-preprocess is used with gcc to add a special marker in the output to
3665 // include the PCH file. Clang's PTH solution is completely transparent, so we
3666 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003667 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003668
Daniel Dunbar17731772009-03-23 19:03:36 +00003669 // Claim some arguments which clang doesn't support, but we don't
3670 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003671 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3672 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00003673
Rafael Espindolab0092d72013-09-04 19:37:35 +00003674 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00003675 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003676}
3677
John McCall5fb5df92012-06-20 06:18:46 +00003678/// Add options related to the Objective-C runtime/ABI.
3679///
3680/// Returns true if the runtime is non-fragile.
3681ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3682 ArgStringList &cmdArgs,
3683 RewriteKind rewriteKind) const {
3684 // Look for the controlling runtime option.
3685 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3686 options::OPT_fgnu_runtime,
3687 options::OPT_fobjc_runtime_EQ);
3688
3689 // Just forward -fobjc-runtime= to the frontend. This supercedes
3690 // options about fragility.
3691 if (runtimeArg &&
3692 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3693 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003694 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003695 if (runtime.tryParse(value)) {
3696 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3697 << value;
3698 }
3699
3700 runtimeArg->render(args, cmdArgs);
3701 return runtime;
3702 }
3703
3704 // Otherwise, we'll need the ABI "version". Version numbers are
3705 // slightly confusing for historical reasons:
3706 // 1 - Traditional "fragile" ABI
3707 // 2 - Non-fragile ABI, version 1
3708 // 3 - Non-fragile ABI, version 2
3709 unsigned objcABIVersion = 1;
3710 // If -fobjc-abi-version= is present, use that to set the version.
3711 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003712 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003713 if (value == "1")
3714 objcABIVersion = 1;
3715 else if (value == "2")
3716 objcABIVersion = 2;
3717 else if (value == "3")
3718 objcABIVersion = 3;
3719 else
3720 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3721 << value;
3722 } else {
3723 // Otherwise, determine if we are using the non-fragile ABI.
3724 bool nonFragileABIIsDefault =
3725 (rewriteKind == RK_NonFragile ||
3726 (rewriteKind == RK_None &&
3727 getToolChain().IsObjCNonFragileABIDefault()));
3728 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3729 options::OPT_fno_objc_nonfragile_abi,
3730 nonFragileABIIsDefault)) {
3731 // Determine the non-fragile ABI version to use.
3732#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3733 unsigned nonFragileABIVersion = 1;
3734#else
3735 unsigned nonFragileABIVersion = 2;
3736#endif
3737
3738 if (Arg *abiArg = args.getLastArg(
3739 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003740 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003741 if (value == "1")
3742 nonFragileABIVersion = 1;
3743 else if (value == "2")
3744 nonFragileABIVersion = 2;
3745 else
3746 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3747 << value;
3748 }
3749
3750 objcABIVersion = 1 + nonFragileABIVersion;
3751 } else {
3752 objcABIVersion = 1;
3753 }
3754 }
3755
3756 // We don't actually care about the ABI version other than whether
3757 // it's non-fragile.
3758 bool isNonFragile = objcABIVersion != 1;
3759
3760 // If we have no runtime argument, ask the toolchain for its default runtime.
3761 // However, the rewriter only really supports the Mac runtime, so assume that.
3762 ObjCRuntime runtime;
3763 if (!runtimeArg) {
3764 switch (rewriteKind) {
3765 case RK_None:
3766 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3767 break;
3768 case RK_Fragile:
3769 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3770 break;
3771 case RK_NonFragile:
3772 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3773 break;
3774 }
3775
3776 // -fnext-runtime
3777 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3778 // On Darwin, make this use the default behavior for the toolchain.
3779 if (getToolChain().getTriple().isOSDarwin()) {
3780 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3781
3782 // Otherwise, build for a generic macosx port.
3783 } else {
3784 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3785 }
3786
3787 // -fgnu-runtime
3788 } else {
3789 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003790 // Legacy behaviour is to target the gnustep runtime if we are i
3791 // non-fragile mode or the GCC runtime in fragile mode.
3792 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003793 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003794 else
3795 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003796 }
3797
3798 cmdArgs.push_back(args.MakeArgString(
3799 "-fobjc-runtime=" + runtime.getAsString()));
3800 return runtime;
3801}
3802
Hans Wennborg75958c42013-08-08 00:17:41 +00003803void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
3804 unsigned RTOptionID = options::OPT__SLASH_MT;
3805
Hans Wennborgf1a74252013-09-10 20:18:04 +00003806 if (Args.hasArg(options::OPT__SLASH_LDd))
3807 // The /LDd option implies /MTd. The dependent lib part can be overridden,
3808 // but defining _DEBUG is sticky.
3809 RTOptionID = options::OPT__SLASH_MTd;
3810
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00003811 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00003812 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00003813
Hans Wennborg75958c42013-08-08 00:17:41 +00003814 switch(RTOptionID) {
3815 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00003816 if (Args.hasArg(options::OPT__SLASH_LDd))
3817 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00003818 CmdArgs.push_back("-D_MT");
3819 CmdArgs.push_back("-D_DLL");
3820 CmdArgs.push_back("--dependent-lib=msvcrt");
3821 break;
3822 case options::OPT__SLASH_MDd:
3823 CmdArgs.push_back("-D_DEBUG");
3824 CmdArgs.push_back("-D_MT");
3825 CmdArgs.push_back("-D_DLL");
3826 CmdArgs.push_back("--dependent-lib=msvcrtd");
3827 break;
3828 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00003829 if (Args.hasArg(options::OPT__SLASH_LDd))
3830 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00003831 CmdArgs.push_back("-D_MT");
3832 CmdArgs.push_back("--dependent-lib=libcmt");
3833 break;
3834 case options::OPT__SLASH_MTd:
3835 CmdArgs.push_back("-D_DEBUG");
3836 CmdArgs.push_back("-D_MT");
3837 CmdArgs.push_back("--dependent-lib=libcmtd");
3838 break;
3839 default:
3840 llvm_unreachable("Unexpected option ID.");
3841 }
3842
Reid Kleckner6beca0e2013-08-08 19:33:10 +00003843 // This provides POSIX compatibility (maps 'open' to '_open'), which most
3844 // users want. The /Za flag to cl.exe turns this off, but it's not
3845 // implemented in clang.
3846 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00003847
3848 // FIXME: Make this default for the win32 triple.
3849 CmdArgs.push_back("-cxx-abi");
3850 CmdArgs.push_back("microsoft");
Hans Wennborg0fd62072013-08-09 00:32:23 +00003851
3852 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
3853 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00003854
3855 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
3856 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00003857 if (Args.hasArg(options::OPT__SLASH_fallback))
3858 CmdArgs.push_back("msvc-fallback");
3859 else
3860 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00003861 }
Hans Wennborg75958c42013-08-08 00:17:41 +00003862}
3863
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003864void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003865 const InputInfo &Output,
3866 const InputInfoList &Inputs,
3867 const ArgList &Args,
3868 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003869 ArgStringList CmdArgs;
3870
3871 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3872 const InputInfo &Input = Inputs[0];
3873
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003874 // Don't warn about "clang -w -c foo.s"
3875 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003876 // and "clang -emit-llvm -c foo.s"
3877 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003878
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003879 // Invoke ourselves in -cc1as mode.
3880 //
3881 // FIXME: Implement custom jobs for internal actions.
3882 CmdArgs.push_back("-cc1as");
3883
3884 // Add the "effective" target triple.
3885 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003886 std::string TripleStr =
3887 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003888 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3889
3890 // Set the output mode, we currently only expect to be used as a real
3891 // assembler.
3892 CmdArgs.push_back("-filetype");
3893 CmdArgs.push_back("obj");
3894
Eric Christopher45f2e712012-12-18 00:31:10 +00003895 // Set the main file name, so that debug info works even with
3896 // -save-temps or preprocessed assembly.
3897 CmdArgs.push_back("-main-file-name");
3898 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3899
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003900 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003901 const llvm::Triple &Triple = getToolChain().getTriple();
3902 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003903 if (!CPU.empty()) {
3904 CmdArgs.push_back("-target-cpu");
3905 CmdArgs.push_back(Args.MakeArgString(CPU));
3906 }
3907
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003908 // Add the target features
3909 const Driver &D = getToolChain().getDriver();
3910 getTargetFeatures(D, Triple, Args, CmdArgs);
Jim Grosbach576452b2012-02-10 20:37:10 +00003911
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003912 // Ignore explicit -force_cpusubtype_ALL option.
3913 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003914
Eric Christopherfc3ee562012-01-10 00:38:01 +00003915 // Determine the original source input.
3916 const Action *SourceAction = &JA;
3917 while (SourceAction->getKind() != Action::InputClass) {
3918 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3919 SourceAction = SourceAction->getInputs()[0];
3920 }
3921
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003922 // Forward -g and handle debug info related flags, assuming we are dealing
3923 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00003924 if (SourceAction->getType() == types::TY_Asm ||
3925 SourceAction->getType() == types::TY_PP_Asm) {
3926 Args.ClaimAllArgs(options::OPT_g_Group);
3927 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3928 if (!A->getOption().matches(options::OPT_g0))
3929 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003930
3931 // Add the -fdebug-compilation-dir flag if needed.
3932 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00003933
3934 // Set the AT_producer to the clang version when using the integrated
3935 // assembler on assembly source files.
3936 CmdArgs.push_back("-dwarf-debug-producer");
3937 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00003938 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003939
3940 // Optionally embed the -cc1as level arguments into the debug info, for build
3941 // analysis.
3942 if (getToolChain().UseDwarfDebugFlags()) {
3943 ArgStringList OriginalArgs;
3944 for (ArgList::const_iterator it = Args.begin(),
3945 ie = Args.end(); it != ie; ++it)
3946 (*it)->render(Args, OriginalArgs);
3947
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003948 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003949 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3950 Flags += Exec;
3951 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3952 Flags += " ";
3953 Flags += OriginalArgs[i];
3954 }
3955 CmdArgs.push_back("-dwarf-debug-flags");
3956 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3957 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003958
3959 // FIXME: Add -static support, once we have it.
3960
David Blaikie9260ed62013-07-25 21:19:01 +00003961 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
3962 getToolChain().getDriver());
3963
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003964 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003965
3966 assert(Output.isFilename() && "Unexpected lipo output.");
3967 CmdArgs.push_back("-o");
3968 CmdArgs.push_back(Output.getFilename());
3969
Daniel Dunbarb440f562010-08-02 02:38:21 +00003970 assert(Input.isFilename() && "Invalid input.");
3971 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003972
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003973 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003974 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00003975
3976 // Handle the debug info splitting at object creation time if we're
3977 // creating an object.
3978 // TODO: Currently only works on linux with newer objcopy.
3979 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003980 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00003981 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
3982 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003983}
3984
Daniel Dunbara3246a02009-03-18 08:07:30 +00003985void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003986 const InputInfo &Output,
3987 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003988 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003989 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003990 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003991 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003992
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003993 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003994 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003995 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00003996 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003997 // Don't forward any -g arguments to assembly steps.
3998 if (isa<AssembleJobAction>(JA) &&
3999 A->getOption().matches(options::OPT_g_Group))
4000 continue;
4001
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00004002 // Don't forward any -W arguments to assembly and link steps.
4003 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4004 A->getOption().matches(options::OPT_W_Group))
4005 continue;
4006
Daniel Dunbar2da02722009-03-19 07:55:12 +00004007 // It is unfortunate that we have to claim here, as this means
4008 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00004009 // platforms using a generic gcc, even if we are just using gcc
4010 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00004011 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004012 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00004013 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004014 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004015
Daniel Dunbar4e295052010-01-25 22:35:08 +00004016 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004017
4018 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004019 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00004020 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004021 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00004022
4023 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004024 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004025 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004026 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004027 CmdArgs.push_back("ppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00004028 else if (Arch == llvm::Triple::ppc64le)
4029 CmdArgs.push_back("ppc64le");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004030 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004031 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00004032 }
4033
Daniel Dunbar5716d872009-05-02 21:41:52 +00004034 // Try to force gcc to match the tool chain we want, if we recognize
4035 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004036 //
4037 // FIXME: The triple class should directly provide the information we want
4038 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004039 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004040 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00004041 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4042 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004043 CmdArgs.push_back("-m64");
4044
Daniel Dunbarb440f562010-08-02 02:38:21 +00004045 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004046 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004047 CmdArgs.push_back(Output.getFilename());
4048 } else {
4049 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004050 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004051 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004052
Tony Linthicum76329bf2011-12-12 21:14:55 +00004053 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4054 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004055
4056 // Only pass -x if gcc will understand it; otherwise hope gcc
4057 // understands the suffix correctly. The main use case this would go
4058 // wrong in is for linker inputs if they happened to have an odd
4059 // suffix; really the only way to get this to happen is a command
4060 // like '-x foobar a.c' which will treat a.c like a linker input.
4061 //
4062 // FIXME: For the linker case specifically, can we safely convert
4063 // inputs into '-Wl,' options?
4064 for (InputInfoList::const_iterator
4065 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4066 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004067
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004068 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004069 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4070 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004071 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004072 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004073 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004074 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004075 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004076 else if (II.getType() == types::TY_ModuleFile)
4077 D.Diag(diag::err_drv_no_module_support)
4078 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004079
Daniel Dunbara3246a02009-03-18 08:07:30 +00004080 if (types::canTypeBeUserSpecified(II.getType())) {
4081 CmdArgs.push_back("-x");
4082 CmdArgs.push_back(types::getTypeName(II.getType()));
4083 }
4084
Daniel Dunbarb440f562010-08-02 02:38:21 +00004085 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004086 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00004087 else {
4088 const Arg &A = II.getInputArg();
4089
4090 // Reverse translate some rewritten options.
4091 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4092 CmdArgs.push_back("-lstdc++");
4093 continue;
4094 }
4095
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004096 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00004097 A.render(Args, CmdArgs);
4098 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004099 }
4100
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004101 const std::string customGCCName = D.getCCCGenericGCCName();
4102 const char *GCCName;
4103 if (!customGCCName.empty())
4104 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00004105 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004106 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004107 } else
4108 GCCName = "gcc";
4109
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004110 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004111 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004112 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004113}
4114
Daniel Dunbar4e295052010-01-25 22:35:08 +00004115void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4116 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004117 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004118}
4119
Daniel Dunbar4e295052010-01-25 22:35:08 +00004120void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
4121 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004122 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004123}
4124
Daniel Dunbar4e295052010-01-25 22:35:08 +00004125void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4126 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004127 const Driver &D = getToolChain().getDriver();
4128
Daniel Dunbar4e295052010-01-25 22:35:08 +00004129 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004130 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4131 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00004132 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004133 else {
4134 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004135 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004136 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004137
Daniel Dunbar4e295052010-01-25 22:35:08 +00004138 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004139 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004140}
4141
Daniel Dunbar4e295052010-01-25 22:35:08 +00004142void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
4143 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004144 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004145}
Daniel Dunbara3246a02009-03-18 08:07:30 +00004146
Daniel Dunbar4e295052010-01-25 22:35:08 +00004147void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4148 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004149 // The types are (hopefully) good enough.
4150}
4151
Tony Linthicum76329bf2011-12-12 21:14:55 +00004152// Hexagon tools start.
4153void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4154 ArgStringList &CmdArgs) const {
4155
4156}
4157void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4158 const InputInfo &Output,
4159 const InputInfoList &Inputs,
4160 const ArgList &Args,
4161 const char *LinkingOutput) const {
4162
4163 const Driver &D = getToolChain().getDriver();
4164 ArgStringList CmdArgs;
4165
4166 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00004167 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00004168 CmdArgs.push_back(Args.MakeArgString(MarchString));
4169
4170 RenderExtraToolArgs(JA, CmdArgs);
4171
4172 if (Output.isFilename()) {
4173 CmdArgs.push_back("-o");
4174 CmdArgs.push_back(Output.getFilename());
4175 } else {
4176 assert(Output.isNothing() && "Unexpected output");
4177 CmdArgs.push_back("-fsyntax-only");
4178 }
4179
Matthew Curtise8f80a12012-12-06 17:49:03 +00004180 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4181 if (!SmallDataThreshold.empty())
4182 CmdArgs.push_back(
4183 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004184
Matthew Curtise5df3812012-12-07 17:23:04 +00004185 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4186 options::OPT_Xassembler);
4187
Tony Linthicum76329bf2011-12-12 21:14:55 +00004188 // Only pass -x if gcc will understand it; otherwise hope gcc
4189 // understands the suffix correctly. The main use case this would go
4190 // wrong in is for linker inputs if they happened to have an odd
4191 // suffix; really the only way to get this to happen is a command
4192 // like '-x foobar a.c' which will treat a.c like a linker input.
4193 //
4194 // FIXME: For the linker case specifically, can we safely convert
4195 // inputs into '-Wl,' options?
4196 for (InputInfoList::const_iterator
4197 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4198 const InputInfo &II = *it;
4199
4200 // Don't try to pass LLVM or AST inputs to a generic gcc.
4201 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4202 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4203 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4204 << getToolChain().getTripleString();
4205 else if (II.getType() == types::TY_AST)
4206 D.Diag(clang::diag::err_drv_no_ast_support)
4207 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004208 else if (II.getType() == types::TY_ModuleFile)
4209 D.Diag(diag::err_drv_no_module_support)
4210 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00004211
4212 if (II.isFilename())
4213 CmdArgs.push_back(II.getFilename());
4214 else
4215 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4216 II.getInputArg().render(Args, CmdArgs);
4217 }
4218
4219 const char *GCCName = "hexagon-as";
4220 const char *Exec =
4221 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4222 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4223
4224}
4225void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4226 ArgStringList &CmdArgs) const {
4227 // The types are (hopefully) good enough.
4228}
4229
4230void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4231 const InputInfo &Output,
4232 const InputInfoList &Inputs,
4233 const ArgList &Args,
4234 const char *LinkingOutput) const {
4235
Matthew Curtise689b052012-12-06 15:46:07 +00004236 const toolchains::Hexagon_TC& ToolChain =
4237 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4238 const Driver &D = ToolChain.getDriver();
4239
Tony Linthicum76329bf2011-12-12 21:14:55 +00004240 ArgStringList CmdArgs;
4241
Matthew Curtise689b052012-12-06 15:46:07 +00004242 //----------------------------------------------------------------------------
4243 //
4244 //----------------------------------------------------------------------------
4245 bool hasStaticArg = Args.hasArg(options::OPT_static);
4246 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00004247 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00004248 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4249 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4250 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4251 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004252
Matthew Curtise689b052012-12-06 15:46:07 +00004253 //----------------------------------------------------------------------------
4254 // Silence warnings for various options
4255 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00004256
Matthew Curtise689b052012-12-06 15:46:07 +00004257 Args.ClaimAllArgs(options::OPT_g_Group);
4258 Args.ClaimAllArgs(options::OPT_emit_llvm);
4259 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4260 // handled somewhere else.
4261 Args.ClaimAllArgs(options::OPT_static_libgcc);
4262
4263 //----------------------------------------------------------------------------
4264 //
4265 //----------------------------------------------------------------------------
4266 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4267 e = ToolChain.ExtraOpts.end();
4268 i != e; ++i)
4269 CmdArgs.push_back(i->c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004270
Matthew Curtisf10a5952012-12-06 14:16:43 +00004271 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4272 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00004273
Matthew Curtise689b052012-12-06 15:46:07 +00004274 if (buildingLib) {
4275 CmdArgs.push_back("-shared");
4276 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4277 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00004278 }
4279
Matthew Curtise689b052012-12-06 15:46:07 +00004280 if (hasStaticArg)
4281 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004282
Matthew Curtise8f80a12012-12-06 17:49:03 +00004283 if (buildPIE && !buildingLib)
4284 CmdArgs.push_back("-pie");
4285
4286 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4287 if (!SmallDataThreshold.empty()) {
4288 CmdArgs.push_back(
4289 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4290 }
4291
Matthew Curtise689b052012-12-06 15:46:07 +00004292 //----------------------------------------------------------------------------
4293 //
4294 //----------------------------------------------------------------------------
4295 CmdArgs.push_back("-o");
4296 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004297
Matthew Curtise689b052012-12-06 15:46:07 +00004298 const std::string MarchSuffix = "/" + MarchString;
4299 const std::string G0Suffix = "/G0";
4300 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4301 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4302 + "/";
4303 const std::string StartFilesDir = RootDir
4304 + "hexagon/lib"
4305 + (buildingLib
4306 ? MarchG0Suffix : MarchSuffix);
4307
4308 //----------------------------------------------------------------------------
4309 // moslib
4310 //----------------------------------------------------------------------------
4311 std::vector<std::string> oslibs;
4312 bool hasStandalone= false;
4313
4314 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4315 ie = Args.filtered_end(); it != ie; ++it) {
4316 (*it)->claim();
4317 oslibs.push_back((*it)->getValue());
4318 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004319 }
Matthew Curtise689b052012-12-06 15:46:07 +00004320 if (oslibs.empty()) {
4321 oslibs.push_back("standalone");
4322 hasStandalone = true;
4323 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004324
Matthew Curtise689b052012-12-06 15:46:07 +00004325 //----------------------------------------------------------------------------
4326 // Start Files
4327 //----------------------------------------------------------------------------
4328 if (incStdLib && incStartFiles) {
4329
4330 if (!buildingLib) {
4331 if (hasStandalone) {
4332 CmdArgs.push_back(
4333 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4334 }
4335 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4336 }
4337 std::string initObj = useShared ? "/initS.o" : "/init.o";
4338 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4339 }
4340
4341 //----------------------------------------------------------------------------
4342 // Library Search Paths
4343 //----------------------------------------------------------------------------
4344 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4345 for (ToolChain::path_list::const_iterator
4346 i = LibPaths.begin(),
4347 e = LibPaths.end();
4348 i != e;
4349 ++i)
4350 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4351
4352 //----------------------------------------------------------------------------
4353 //
4354 //----------------------------------------------------------------------------
4355 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4356 Args.AddAllArgs(CmdArgs, options::OPT_e);
4357 Args.AddAllArgs(CmdArgs, options::OPT_s);
4358 Args.AddAllArgs(CmdArgs, options::OPT_t);
4359 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4360
4361 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4362
4363 //----------------------------------------------------------------------------
4364 // Libraries
4365 //----------------------------------------------------------------------------
4366 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00004367 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00004368 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4369 CmdArgs.push_back("-lm");
4370 }
4371
4372 CmdArgs.push_back("--start-group");
4373
4374 if (!buildingLib) {
4375 for(std::vector<std::string>::iterator i = oslibs.begin(),
4376 e = oslibs.end(); i != e; ++i)
4377 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4378 CmdArgs.push_back("-lc");
4379 }
4380 CmdArgs.push_back("-lgcc");
4381
4382 CmdArgs.push_back("--end-group");
4383 }
4384
4385 //----------------------------------------------------------------------------
4386 // End files
4387 //----------------------------------------------------------------------------
4388 if (incStdLib && incStartFiles) {
4389 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4390 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4391 }
4392
4393 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
4394 C.addCommand(
4395 new Command(
4396 JA, *this,
4397 Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004398}
4399// Hexagon tools end.
4400
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004401llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4402 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4403 // archs which Darwin doesn't use.
4404
4405 // The matching this routine does is fairly pointless, since it is neither the
4406 // complete architecture list, nor a reasonable subset. The problem is that
4407 // historically the driver driver accepts this and also ties its -march=
4408 // handling to the architecture name, so we need to be careful before removing
4409 // support for it.
4410
4411 // This code must be kept in sync with Clang's Darwin specific argument
4412 // translation.
4413
4414 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4415 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4416 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4417 .Case("ppc64", llvm::Triple::ppc64)
4418 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4419 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4420 llvm::Triple::x86)
4421 .Case("x86_64", llvm::Triple::x86_64)
4422 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00004423 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4424 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4425 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004426 .Case("r600", llvm::Triple::r600)
4427 .Case("nvptx", llvm::Triple::nvptx)
4428 .Case("nvptx64", llvm::Triple::nvptx64)
4429 .Case("amdil", llvm::Triple::amdil)
4430 .Case("spir", llvm::Triple::spir)
4431 .Default(llvm::Triple::UnknownArch);
4432}
Tony Linthicum76329bf2011-12-12 21:14:55 +00004433
Bob Wilsondecc03e2012-11-23 06:14:39 +00004434const char *Clang::getBaseInputName(const ArgList &Args,
4435 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00004436 return Args.MakeArgString(
4437 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004438}
4439
Bob Wilsondecc03e2012-11-23 06:14:39 +00004440const char *Clang::getBaseInputStem(const ArgList &Args,
4441 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004442 const char *Str = getBaseInputName(Args, Inputs);
4443
Chris Lattner906bb902011-01-16 08:14:11 +00004444 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004445 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004446
4447 return Str;
4448}
4449
Bob Wilsondecc03e2012-11-23 06:14:39 +00004450const char *Clang::getDependencyFileName(const ArgList &Args,
4451 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004452 // FIXME: Think about this more.
4453 std::string Res;
4454
4455 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004456 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004457 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004458 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00004459 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004460 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004461 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004462}
4463
Daniel Dunbarbe220842009-03-20 16:06:39 +00004464void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004465 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004466 const InputInfoList &Inputs,
4467 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004468 const char *LinkingOutput) const {
4469 ArgStringList CmdArgs;
4470
4471 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4472 const InputInfo &Input = Inputs[0];
4473
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004474 // Determine the original source input.
4475 const Action *SourceAction = &JA;
4476 while (SourceAction->getKind() != Action::InputClass) {
4477 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4478 SourceAction = SourceAction->getInputs()[0];
4479 }
4480
4481 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004482 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004483 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004484 if (Args.hasArg(options::OPT_gstabs))
4485 CmdArgs.push_back("--gstabs");
4486 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004487 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004488 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004489
Daniel Dunbarbe220842009-03-20 16:06:39 +00004490 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004491 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004492
Daniel Dunbar6d484762010-07-22 01:47:22 +00004493 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004494 if (getToolChain().getArch() == llvm::Triple::x86 ||
4495 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004496 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4497 CmdArgs.push_back("-force_cpusubtype_ALL");
4498
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004499 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004500 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00004501 Args.hasArg(options::OPT_fapple_kext)) &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004502 (!getDarwinToolChain().isTargetIPhoneOS() ||
4503 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4504 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004505 CmdArgs.push_back("-static");
4506
Daniel Dunbarbe220842009-03-20 16:06:39 +00004507 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4508 options::OPT_Xassembler);
4509
4510 assert(Output.isFilename() && "Unexpected lipo output.");
4511 CmdArgs.push_back("-o");
4512 CmdArgs.push_back(Output.getFilename());
4513
Daniel Dunbarb440f562010-08-02 02:38:21 +00004514 assert(Input.isFilename() && "Invalid input.");
4515 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004516
4517 // asm_final spec is empty.
4518
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004519 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004520 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004521 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004522}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004523
David Blaikie68e081d2011-12-20 02:48:34 +00004524void darwin::DarwinTool::anchor() {}
4525
Daniel Dunbare9ded432009-09-09 18:36:20 +00004526void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4527 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004528 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004529
Daniel Dunbarc1964212009-03-26 16:23:12 +00004530 // Derived from darwin_arch spec.
4531 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004532 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004533
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004534 // FIXME: Is this needed anymore?
4535 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004536 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004537}
4538
Bill Wendling3b2000f2012-10-02 18:02:50 +00004539bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4540 // We only need to generate a temp path for LTO if we aren't compiling object
4541 // files. When compiling source files, we run 'dsymutil' after linking. We
4542 // don't run 'dsymutil' when compiling object files.
4543 for (InputInfoList::const_iterator
4544 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4545 if (it->getType() != types::TY_Object)
4546 return true;
4547
4548 return false;
4549}
4550
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004551void darwin::Link::AddLinkArgs(Compilation &C,
4552 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004553 ArgStringList &CmdArgs,
4554 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004555 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004556 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004557
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004558 unsigned Version[3] = { 0, 0, 0 };
4559 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4560 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00004561 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004562 Version[1], Version[2], HadExtra) ||
4563 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004564 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004565 << A->getAsString(Args);
4566 }
4567
4568 // Newer linkers support -demangle, pass it if supported and not disabled by
4569 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004570 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004571 // Don't pass -demangle to ld_classic.
4572 //
4573 // FIXME: This is a temporary workaround, ld should be handling this.
4574 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4575 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004576 if (getToolChain().getArch() == llvm::Triple::x86) {
4577 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4578 options::OPT_Wl_COMMA),
4579 ie = Args.filtered_end(); it != ie; ++it) {
4580 const Arg *A = *it;
4581 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smithbd55daf2012-11-01 04:30:05 +00004582 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004583 UsesLdClassic = true;
4584 }
4585 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004586 if (!UsesLdClassic)
4587 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004588 }
4589
Bob Wilson3d27dad2013-08-02 22:25:34 +00004590 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
4591 CmdArgs.push_back("-export_dynamic");
4592
Bill Wendling313b6bf2012-11-16 23:03:00 +00004593 // If we are using LTO, then automatically create a temporary file path for
4594 // the linker to use, so that it's lifetime will extend past a possible
4595 // dsymutil step.
4596 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4597 const char *TmpPath = C.getArgs().MakeArgString(
4598 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4599 C.addTempFile(TmpPath);
4600 CmdArgs.push_back("-object_path_lto");
4601 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00004602 }
4603
Daniel Dunbarc1964212009-03-26 16:23:12 +00004604 // Derived from the "link" spec.
4605 Args.AddAllArgs(CmdArgs, options::OPT_static);
4606 if (!Args.hasArg(options::OPT_static))
4607 CmdArgs.push_back("-dynamic");
4608 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4609 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4610 // here. How do we wish to handle such things?
4611 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004612
Daniel Dunbarc1964212009-03-26 16:23:12 +00004613 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004614 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004615 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004616 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004617
4618 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4619 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4620 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4621
4622 Arg *A;
4623 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4624 (A = Args.getLastArg(options::OPT_current__version)) ||
4625 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004626 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004627 << A->getAsString(Args) << "-dynamiclib";
4628
4629 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4630 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4631 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4632 } else {
4633 CmdArgs.push_back("-dylib");
4634
4635 Arg *A;
4636 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4637 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4638 (A = Args.getLastArg(options::OPT_client__name)) ||
4639 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4640 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4641 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004642 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004643 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004644
Daniel Dunbarc1964212009-03-26 16:23:12 +00004645 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4646 "-dylib_compatibility_version");
4647 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4648 "-dylib_current_version");
4649
Daniel Dunbara48823f2010-01-22 02:04:52 +00004650 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004651
4652 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4653 "-dylib_install_name");
4654 }
4655
4656 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4657 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4658 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004659 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004660 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004661 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4662 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4663 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4664 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4665 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4666 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004667 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004668 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4669 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4670 Args.AddAllArgs(CmdArgs, options::OPT_init);
4671
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004672 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004673 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004674
4675 // If we had an explicit -mios-simulator-version-min argument, honor that,
4676 // otherwise use the traditional deployment targets. We can't just check the
4677 // is-sim attribute because existing code follows this path, and the linker
4678 // may not handle the argument.
4679 //
4680 // FIXME: We may be able to remove this, once we can verify no one depends on
4681 // it.
4682 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4683 CmdArgs.push_back("-ios_simulator_version_min");
4684 else if (DarwinTC.isTargetIPhoneOS())
4685 CmdArgs.push_back("-iphoneos_version_min");
4686 else
4687 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004688 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004689
Daniel Dunbarc1964212009-03-26 16:23:12 +00004690 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4691 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4692 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4693 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4694 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004695
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004696 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4697 options::OPT_fno_pie,
4698 options::OPT_fno_PIE)) {
4699 if (A->getOption().matches(options::OPT_fpie) ||
4700 A->getOption().matches(options::OPT_fPIE))
4701 CmdArgs.push_back("-pie");
4702 else
4703 CmdArgs.push_back("-no_pie");
4704 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004705
4706 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4707 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4708 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4709 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4710 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4711 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4712 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4713 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4714 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4715 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4716 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4717 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4718 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4719 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4720 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4721 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004722
Daniel Dunbar84384642011-05-02 21:03:47 +00004723 // Give --sysroot= preference, over the Apple specific behavior to also use
4724 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004725 StringRef sysroot = C.getSysRoot();
4726 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004727 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004728 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004729 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4730 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00004731 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004732 }
4733
Daniel Dunbarc1964212009-03-26 16:23:12 +00004734 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4735 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4736 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4737 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4738 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004739 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004740 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4741 Args.AddAllArgs(CmdArgs, options::OPT_y);
4742 Args.AddLastArg(CmdArgs, options::OPT_w);
4743 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4744 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4745 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4746 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4747 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4748 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4749 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4750 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4751 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4752 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4753 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4754 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4755}
4756
4757void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004758 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004759 const InputInfoList &Inputs,
4760 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004761 const char *LinkingOutput) const {
4762 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004763
Daniel Dunbarc1964212009-03-26 16:23:12 +00004764 // The logic here is derived from gcc's behavior; most of which
4765 // comes from specs (starting with link_command). Consult gcc for
4766 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004767 ArgStringList CmdArgs;
4768
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004769 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4770 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4771 options::OPT_ccc_arcmt_migrate)) {
4772 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4773 (*I)->claim();
4774 const char *Exec =
4775 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4776 CmdArgs.push_back(Output.getFilename());
4777 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4778 return;
4779 }
4780
Daniel Dunbarc1964212009-03-26 16:23:12 +00004781 // I'm not sure why this particular decomposition exists in gcc, but
4782 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004783 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004784
Daniel Dunbarc1964212009-03-26 16:23:12 +00004785 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4786 Args.AddAllArgs(CmdArgs, options::OPT_s);
4787 Args.AddAllArgs(CmdArgs, options::OPT_t);
4788 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4789 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004790 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004791 Args.AddAllArgs(CmdArgs, options::OPT_r);
4792
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004793 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4794 // members of static archive libraries which implement Objective-C classes or
4795 // categories.
4796 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4797 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004798
Daniel Dunbarc1964212009-03-26 16:23:12 +00004799 CmdArgs.push_back("-o");
4800 CmdArgs.push_back(Output.getFilename());
4801
Chad Rosier06fd3c62012-05-16 23:45:12 +00004802 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004803 !Args.hasArg(options::OPT_nostartfiles)) {
4804 // Derived from startfile spec.
4805 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004806 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004807 if (getDarwinToolChain().isTargetIOSSimulator()) {
4808 // The simulator doesn't have a versioned crt1 file.
4809 CmdArgs.push_back("-ldylib1.o");
4810 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004811 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4812 CmdArgs.push_back("-ldylib1.o");
4813 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004814 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004815 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004816 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004817 CmdArgs.push_back("-ldylib1.10.5.o");
4818 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004819 } else {
4820 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004821 if (!Args.hasArg(options::OPT_static)) {
4822 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004823 if (getDarwinToolChain().isTargetIOSSimulator()) {
4824 // The simulator doesn't have a versioned crt1 file.
4825 CmdArgs.push_back("-lbundle1.o");
4826 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004827 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4828 CmdArgs.push_back("-lbundle1.o");
4829 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004830 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004831 CmdArgs.push_back("-lbundle1.o");
4832 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004833 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004834 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004835 if (Args.hasArg(options::OPT_pg) &&
4836 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004837 if (Args.hasArg(options::OPT_static) ||
4838 Args.hasArg(options::OPT_object) ||
4839 Args.hasArg(options::OPT_preload)) {
4840 CmdArgs.push_back("-lgcrt0.o");
4841 } else {
4842 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004843
Daniel Dunbarc1964212009-03-26 16:23:12 +00004844 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004845 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004846 // By default on OS X 10.8 and later, we don't link with a crt1.o
4847 // file and the linker knows to use _main as the entry point. But,
4848 // when compiling with -pg, we need to link with the gcrt1.o file,
4849 // so pass the -no_new_main option to tell the linker to use the
4850 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004851 if (getDarwinToolChain().isTargetMacOS() &&
4852 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4853 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004854 } else {
4855 if (Args.hasArg(options::OPT_static) ||
4856 Args.hasArg(options::OPT_object) ||
4857 Args.hasArg(options::OPT_preload)) {
4858 CmdArgs.push_back("-lcrt0.o");
4859 } else {
4860 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004861 if (getDarwinToolChain().isTargetIOSSimulator()) {
4862 // The simulator doesn't have a versioned crt1 file.
4863 CmdArgs.push_back("-lcrt1.o");
4864 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004865 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4866 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004867 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00004868 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004869 } else {
4870 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4871 CmdArgs.push_back("-lcrt1.o");
4872 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4873 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004874 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004875 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004876
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004877 // darwin_crt2 spec is empty.
4878 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004879 }
4880 }
4881 }
4882 }
4883
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004884 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4885 Args.hasArg(options::OPT_shared_libgcc) &&
4886 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004887 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004888 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004889 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004890 }
4891 }
4892
4893 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004894
Daniel Dunbarc1964212009-03-26 16:23:12 +00004895 if (Args.hasArg(options::OPT_fopenmp))
4896 // This is more complicated in gcc...
4897 CmdArgs.push_back("-lgomp");
4898
Douglas Gregor9295df02012-05-15 21:00:27 +00004899 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4900
Bob Wilson16d93952012-05-15 18:57:39 +00004901 if (isObjCRuntimeLinked(Args) &&
4902 !Args.hasArg(options::OPT_nostdlib) &&
4903 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004904 // Avoid linking compatibility stubs on i386 mac.
4905 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004906 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004907 // If we don't have ARC or subscripting runtime support, link in the
4908 // runtime stubs. We have to do this *before* adding any of the normal
4909 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004910 ObjCRuntime runtime =
4911 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004912 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004913 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004914 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004915 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004916 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004917 CmdArgs.push_back("-framework");
4918 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004919 // Link libobj.
4920 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004921 }
John McCall31168b02011-06-15 23:02:42 +00004922
Daniel Dunbarc1964212009-03-26 16:23:12 +00004923 if (LinkingOutput) {
4924 CmdArgs.push_back("-arch_multiple");
4925 CmdArgs.push_back("-final_output");
4926 CmdArgs.push_back(LinkingOutput);
4927 }
4928
Daniel Dunbarc1964212009-03-26 16:23:12 +00004929 if (Args.hasArg(options::OPT_fnested_functions))
4930 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004931
Daniel Dunbarc1964212009-03-26 16:23:12 +00004932 if (!Args.hasArg(options::OPT_nostdlib) &&
4933 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00004934 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004935 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004936
Daniel Dunbarc1964212009-03-26 16:23:12 +00004937 // link_ssp spec is empty.
4938
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004939 // Let the tool chain choose which runtime library to link.
4940 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004941 }
4942
Chad Rosier06fd3c62012-05-16 23:45:12 +00004943 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004944 !Args.hasArg(options::OPT_nostartfiles)) {
4945 // endfile_spec is empty.
4946 }
4947
4948 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4949 Args.AddAllArgs(CmdArgs, options::OPT_F);
4950
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004951 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004952 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004953 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004954}
4955
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004956void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004957 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004958 const InputInfoList &Inputs,
4959 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004960 const char *LinkingOutput) const {
4961 ArgStringList CmdArgs;
4962
4963 CmdArgs.push_back("-create");
4964 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004965
4966 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004967 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004968
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004969 for (InputInfoList::const_iterator
4970 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4971 const InputInfo &II = *it;
4972 assert(II.isFilename() && "Unexpected lipo input.");
4973 CmdArgs.push_back(II.getFilename());
4974 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004975 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004976 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004977 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004978}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004979
Daniel Dunbar88299622010-06-04 18:28:36 +00004980void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004981 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004982 const InputInfoList &Inputs,
4983 const ArgList &Args,
4984 const char *LinkingOutput) const {
4985 ArgStringList CmdArgs;
4986
Daniel Dunbareb86b042011-05-09 17:23:16 +00004987 CmdArgs.push_back("-o");
4988 CmdArgs.push_back(Output.getFilename());
4989
Daniel Dunbar88299622010-06-04 18:28:36 +00004990 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4991 const InputInfo &Input = Inputs[0];
4992 assert(Input.isFilename() && "Unexpected dsymutil input.");
4993 CmdArgs.push_back(Input.getFilename());
4994
Daniel Dunbar88299622010-06-04 18:28:36 +00004995 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004996 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004997 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004998}
4999
Eric Christopher551ef452011-08-23 17:56:55 +00005000void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00005001 const InputInfo &Output,
5002 const InputInfoList &Inputs,
5003 const ArgList &Args,
5004 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00005005 ArgStringList CmdArgs;
5006 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00005007 CmdArgs.push_back("--debug-info");
5008 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00005009 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00005010
5011 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5012 const InputInfo &Input = Inputs[0];
5013 assert(Input.isFilename() && "Unexpected verify input");
5014
5015 // Grabbing the output of the earlier dsymutil run.
5016 CmdArgs.push_back(Input.getFilename());
5017
5018 const char *Exec =
5019 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5020 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5021}
5022
David Chisnallf571cde2012-02-15 13:39:01 +00005023void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5024 const InputInfo &Output,
5025 const InputInfoList &Inputs,
5026 const ArgList &Args,
5027 const char *LinkingOutput) const {
5028 ArgStringList CmdArgs;
5029
5030 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5031 options::OPT_Xassembler);
5032
5033 CmdArgs.push_back("-o");
5034 CmdArgs.push_back(Output.getFilename());
5035
5036 for (InputInfoList::const_iterator
5037 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5038 const InputInfo &II = *it;
5039 CmdArgs.push_back(II.getFilename());
5040 }
5041
5042 const char *Exec =
5043 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5044 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5045}
5046
5047
5048void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5049 const InputInfo &Output,
5050 const InputInfoList &Inputs,
5051 const ArgList &Args,
5052 const char *LinkingOutput) const {
5053 // FIXME: Find a real GCC, don't hard-code versions here
5054 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5055 const llvm::Triple &T = getToolChain().getTriple();
5056 std::string LibPath = "/usr/lib/";
5057 llvm::Triple::ArchType Arch = T.getArch();
5058 switch (Arch) {
5059 case llvm::Triple::x86:
5060 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
5061 T.getOSName()).str() + "/4.5.2/";
5062 break;
5063 case llvm::Triple::x86_64:
5064 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
5065 T.getOSName()).str();
5066 GCCLibPath += "/4.5.2/amd64/";
5067 LibPath += "amd64/";
5068 break;
5069 default:
5070 assert(0 && "Unsupported architecture");
5071 }
5072
5073 ArgStringList CmdArgs;
5074
David Chisnall272a0712012-02-29 15:06:12 +00005075 // Demangle C++ names in errors
5076 CmdArgs.push_back("-C");
5077
David Chisnallf571cde2012-02-15 13:39:01 +00005078 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5079 (!Args.hasArg(options::OPT_shared))) {
5080 CmdArgs.push_back("-e");
5081 CmdArgs.push_back("_start");
5082 }
5083
5084 if (Args.hasArg(options::OPT_static)) {
5085 CmdArgs.push_back("-Bstatic");
5086 CmdArgs.push_back("-dn");
5087 } else {
5088 CmdArgs.push_back("-Bdynamic");
5089 if (Args.hasArg(options::OPT_shared)) {
5090 CmdArgs.push_back("-shared");
5091 } else {
5092 CmdArgs.push_back("--dynamic-linker");
5093 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5094 }
5095 }
5096
5097 if (Output.isFilename()) {
5098 CmdArgs.push_back("-o");
5099 CmdArgs.push_back(Output.getFilename());
5100 } else {
5101 assert(Output.isNothing() && "Invalid output.");
5102 }
5103
5104 if (!Args.hasArg(options::OPT_nostdlib) &&
5105 !Args.hasArg(options::OPT_nostartfiles)) {
5106 if (!Args.hasArg(options::OPT_shared)) {
5107 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5108 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005109 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005110 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5111 } else {
5112 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005113 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5114 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005115 }
Hans Wennborg70850d82013-07-18 20:29:38 +00005116 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00005117 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005118 }
5119
5120 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5121
5122 Args.AddAllArgs(CmdArgs, options::OPT_L);
5123 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5124 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00005125 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00005126
5127 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5128
5129 if (!Args.hasArg(options::OPT_nostdlib) &&
5130 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005131 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00005132 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00005133 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005134 if (!Args.hasArg(options::OPT_shared)) {
5135 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00005136 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00005137 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005138 }
David Chisnallf571cde2012-02-15 13:39:01 +00005139 }
5140
5141 if (!Args.hasArg(options::OPT_nostdlib) &&
5142 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00005143 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005144 }
David Chisnall96de9932012-02-16 16:00:47 +00005145 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005146
5147 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5148
5149 const char *Exec =
5150 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5151 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5152}
5153
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005154void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005155 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005156 const InputInfoList &Inputs,
5157 const ArgList &Args,
5158 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005159 ArgStringList CmdArgs;
5160
5161 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5162 options::OPT_Xassembler);
5163
5164 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005165 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005166
5167 for (InputInfoList::const_iterator
5168 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5169 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005170 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005171 }
5172
5173 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005174 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005175 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005176}
5177
5178void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005179 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005180 const InputInfoList &Inputs,
5181 const ArgList &Args,
5182 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005183 ArgStringList CmdArgs;
5184
5185 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005186 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005187 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005188 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005189 }
5190
5191 if (Args.hasArg(options::OPT_static)) {
5192 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005193 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005194 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005195// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005196 CmdArgs.push_back("-Bdynamic");
5197 if (Args.hasArg(options::OPT_shared)) {
5198 CmdArgs.push_back("-shared");
5199 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00005200 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005201 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5202 }
5203 }
5204
Daniel Dunbarb440f562010-08-02 02:38:21 +00005205 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005206 CmdArgs.push_back("-o");
5207 CmdArgs.push_back(Output.getFilename());
5208 } else {
5209 assert(Output.isNothing() && "Invalid output.");
5210 }
5211
5212 if (!Args.hasArg(options::OPT_nostdlib) &&
5213 !Args.hasArg(options::OPT_nostartfiles)) {
5214 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005215 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005216 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005217 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005218 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005219 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005220 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005221 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005222 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005223 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005224 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005225 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005226 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005227 }
5228
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005229 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5230 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005231 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005232
5233 Args.AddAllArgs(CmdArgs, options::OPT_L);
5234 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5235 Args.AddAllArgs(CmdArgs, options::OPT_e);
5236
Daniel Dunbar54423b22010-09-17 00:24:54 +00005237 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005238
5239 if (!Args.hasArg(options::OPT_nostdlib) &&
5240 !Args.hasArg(options::OPT_nodefaultlibs)) {
5241 // FIXME: For some reason GCC passes -lgcc before adding
5242 // the default system libraries. Just mimic this for now.
5243 CmdArgs.push_back("-lgcc");
5244
5245 if (Args.hasArg(options::OPT_pthread))
5246 CmdArgs.push_back("-pthread");
5247 if (!Args.hasArg(options::OPT_shared))
5248 CmdArgs.push_back("-lc");
5249 CmdArgs.push_back("-lgcc");
5250 }
5251
5252 if (!Args.hasArg(options::OPT_nostdlib) &&
5253 !Args.hasArg(options::OPT_nostartfiles)) {
5254 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005255 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005256 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005257 }
5258
Bill Wendling08760582011-06-27 19:15:03 +00005259 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005260
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005261 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005262 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005263 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005264}
5265
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005266void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005267 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005268 const InputInfoList &Inputs,
5269 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005270 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005271 ArgStringList CmdArgs;
5272
5273 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5274 options::OPT_Xassembler);
5275
5276 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005277 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005278
5279 for (InputInfoList::const_iterator
5280 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5281 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005282 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005283 }
5284
5285 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005286 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005287 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005288}
5289
5290void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005291 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005292 const InputInfoList &Inputs,
5293 const ArgList &Args,
5294 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005295 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005296 ArgStringList CmdArgs;
5297
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005298 // Silence warning for "clang -g foo.o -o foo"
5299 Args.ClaimAllArgs(options::OPT_g_Group);
5300 // and "clang -emit-llvm foo.o -o foo"
5301 Args.ClaimAllArgs(options::OPT_emit_llvm);
5302 // and for "clang -w foo.o -o foo". Other warning options are already
5303 // handled somewhere else.
5304 Args.ClaimAllArgs(options::OPT_w);
5305
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005306 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005307 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005308 CmdArgs.push_back("-e");
5309 CmdArgs.push_back("__start");
5310 }
5311
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005312 if (Args.hasArg(options::OPT_static)) {
5313 CmdArgs.push_back("-Bstatic");
5314 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005315 if (Args.hasArg(options::OPT_rdynamic))
5316 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005317 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005318 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005319 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005320 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005321 } else {
5322 CmdArgs.push_back("-dynamic-linker");
5323 CmdArgs.push_back("/usr/libexec/ld.so");
5324 }
5325 }
5326
Rafael Espindola044f7832013-06-05 04:28:55 +00005327 if (Args.hasArg(options::OPT_nopie))
5328 CmdArgs.push_back("-nopie");
5329
Daniel Dunbarb440f562010-08-02 02:38:21 +00005330 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005331 CmdArgs.push_back("-o");
5332 CmdArgs.push_back(Output.getFilename());
5333 } else {
5334 assert(Output.isNothing() && "Invalid output.");
5335 }
5336
5337 if (!Args.hasArg(options::OPT_nostdlib) &&
5338 !Args.hasArg(options::OPT_nostartfiles)) {
5339 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00005340 if (Args.hasArg(options::OPT_pg))
5341 CmdArgs.push_back(Args.MakeArgString(
5342 getToolChain().GetFilePath("gcrt0.o")));
5343 else
5344 CmdArgs.push_back(Args.MakeArgString(
5345 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005346 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005347 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005348 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005349 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005350 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005351 }
5352 }
5353
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005354 std::string Triple = getToolChain().getTripleString();
5355 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005356 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005357 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005358 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005359
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005360 Args.AddAllArgs(CmdArgs, options::OPT_L);
5361 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5362 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005363 Args.AddAllArgs(CmdArgs, options::OPT_s);
5364 Args.AddAllArgs(CmdArgs, options::OPT_t);
5365 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5366 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005367
Daniel Dunbar54423b22010-09-17 00:24:54 +00005368 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005369
5370 if (!Args.hasArg(options::OPT_nostdlib) &&
5371 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005372 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005373 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005374 if (Args.hasArg(options::OPT_pg))
5375 CmdArgs.push_back("-lm_p");
5376 else
5377 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005378 }
5379
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005380 // FIXME: For some reason GCC passes -lgcc before adding
5381 // the default system libraries. Just mimic this for now.
5382 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005383
Eric Christopher17674ec2012-09-13 06:32:34 +00005384 if (Args.hasArg(options::OPT_pthread)) {
5385 if (!Args.hasArg(options::OPT_shared) &&
5386 Args.hasArg(options::OPT_pg))
5387 CmdArgs.push_back("-lpthread_p");
5388 else
5389 CmdArgs.push_back("-lpthread");
5390 }
5391
Chandler Carruth45661652011-12-17 22:32:42 +00005392 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005393 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005394 CmdArgs.push_back("-lc_p");
5395 else
5396 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005397 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005398
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005399 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005400 }
5401
5402 if (!Args.hasArg(options::OPT_nostdlib) &&
5403 !Args.hasArg(options::OPT_nostartfiles)) {
5404 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005405 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005406 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005407 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005408 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005409 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005410 }
5411
5412 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005413 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005414 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005415}
Ed Schoutene33194b2009-04-02 19:13:12 +00005416
Eli Friedman9fa28852012-08-08 23:57:20 +00005417void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5418 const InputInfo &Output,
5419 const InputInfoList &Inputs,
5420 const ArgList &Args,
5421 const char *LinkingOutput) const {
5422 ArgStringList CmdArgs;
5423
5424 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5425 options::OPT_Xassembler);
5426
5427 CmdArgs.push_back("-o");
5428 CmdArgs.push_back(Output.getFilename());
5429
5430 for (InputInfoList::const_iterator
5431 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5432 const InputInfo &II = *it;
5433 CmdArgs.push_back(II.getFilename());
5434 }
5435
5436 const char *Exec =
5437 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5438 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5439}
5440
5441void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5442 const InputInfo &Output,
5443 const InputInfoList &Inputs,
5444 const ArgList &Args,
5445 const char *LinkingOutput) const {
5446 const Driver &D = getToolChain().getDriver();
5447 ArgStringList CmdArgs;
5448
5449 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5450 (!Args.hasArg(options::OPT_shared))) {
5451 CmdArgs.push_back("-e");
5452 CmdArgs.push_back("__start");
5453 }
5454
5455 if (Args.hasArg(options::OPT_static)) {
5456 CmdArgs.push_back("-Bstatic");
5457 } else {
5458 if (Args.hasArg(options::OPT_rdynamic))
5459 CmdArgs.push_back("-export-dynamic");
5460 CmdArgs.push_back("--eh-frame-hdr");
5461 CmdArgs.push_back("-Bdynamic");
5462 if (Args.hasArg(options::OPT_shared)) {
5463 CmdArgs.push_back("-shared");
5464 } else {
5465 CmdArgs.push_back("-dynamic-linker");
5466 CmdArgs.push_back("/usr/libexec/ld.so");
5467 }
5468 }
5469
5470 if (Output.isFilename()) {
5471 CmdArgs.push_back("-o");
5472 CmdArgs.push_back(Output.getFilename());
5473 } else {
5474 assert(Output.isNothing() && "Invalid output.");
5475 }
5476
5477 if (!Args.hasArg(options::OPT_nostdlib) &&
5478 !Args.hasArg(options::OPT_nostartfiles)) {
5479 if (!Args.hasArg(options::OPT_shared)) {
5480 if (Args.hasArg(options::OPT_pg))
5481 CmdArgs.push_back(Args.MakeArgString(
5482 getToolChain().GetFilePath("gcrt0.o")));
5483 else
5484 CmdArgs.push_back(Args.MakeArgString(
5485 getToolChain().GetFilePath("crt0.o")));
5486 CmdArgs.push_back(Args.MakeArgString(
5487 getToolChain().GetFilePath("crtbegin.o")));
5488 } else {
5489 CmdArgs.push_back(Args.MakeArgString(
5490 getToolChain().GetFilePath("crtbeginS.o")));
5491 }
5492 }
5493
5494 Args.AddAllArgs(CmdArgs, options::OPT_L);
5495 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5496 Args.AddAllArgs(CmdArgs, options::OPT_e);
5497
5498 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5499
5500 if (!Args.hasArg(options::OPT_nostdlib) &&
5501 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005502 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00005503 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5504 if (Args.hasArg(options::OPT_pg))
5505 CmdArgs.push_back("-lm_p");
5506 else
5507 CmdArgs.push_back("-lm");
5508 }
5509
Rafael Espindola1ad26f02012-10-23 17:07:31 +00005510 if (Args.hasArg(options::OPT_pthread)) {
5511 if (!Args.hasArg(options::OPT_shared) &&
5512 Args.hasArg(options::OPT_pg))
5513 CmdArgs.push_back("-lpthread_p");
5514 else
5515 CmdArgs.push_back("-lpthread");
5516 }
5517
Eli Friedman9fa28852012-08-08 23:57:20 +00005518 if (!Args.hasArg(options::OPT_shared)) {
5519 if (Args.hasArg(options::OPT_pg))
5520 CmdArgs.push_back("-lc_p");
5521 else
5522 CmdArgs.push_back("-lc");
5523 }
5524
5525 std::string myarch = "-lclang_rt.";
5526 const llvm::Triple &T = getToolChain().getTriple();
5527 llvm::Triple::ArchType Arch = T.getArch();
5528 switch (Arch) {
5529 case llvm::Triple::arm:
5530 myarch += ("arm");
5531 break;
5532 case llvm::Triple::x86:
5533 myarch += ("i386");
5534 break;
5535 case llvm::Triple::x86_64:
5536 myarch += ("amd64");
5537 break;
5538 default:
5539 assert(0 && "Unsupported architecture");
5540 }
5541 CmdArgs.push_back(Args.MakeArgString(myarch));
5542 }
5543
5544 if (!Args.hasArg(options::OPT_nostdlib) &&
5545 !Args.hasArg(options::OPT_nostartfiles)) {
5546 if (!Args.hasArg(options::OPT_shared))
5547 CmdArgs.push_back(Args.MakeArgString(
5548 getToolChain().GetFilePath("crtend.o")));
5549 else
5550 CmdArgs.push_back(Args.MakeArgString(
5551 getToolChain().GetFilePath("crtendS.o")));
5552 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005553
5554 const char *Exec =
5555 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5556 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005557}
5558
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005559void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005560 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005561 const InputInfoList &Inputs,
5562 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005563 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005564 ArgStringList CmdArgs;
5565
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005566 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5567 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005568 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005569 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005570 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005571 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005572 else if (getToolChain().getArch() == llvm::Triple::mips ||
5573 getToolChain().getArch() == llvm::Triple::mipsel ||
5574 getToolChain().getArch() == llvm::Triple::mips64 ||
5575 getToolChain().getArch() == llvm::Triple::mips64el) {
5576 StringRef CPUName;
5577 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005578 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005579
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005580 CmdArgs.push_back("-march");
5581 CmdArgs.push_back(CPUName.data());
5582
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005583 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005584 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005585
5586 if (getToolChain().getArch() == llvm::Triple::mips ||
5587 getToolChain().getArch() == llvm::Triple::mips64)
5588 CmdArgs.push_back("-EB");
5589 else
5590 CmdArgs.push_back("-EL");
5591
5592 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5593 options::OPT_fpic, options::OPT_fno_pic,
5594 options::OPT_fPIE, options::OPT_fno_PIE,
5595 options::OPT_fpie, options::OPT_fno_pie);
5596 if (LastPICArg &&
5597 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5598 LastPICArg->getOption().matches(options::OPT_fpic) ||
5599 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5600 LastPICArg->getOption().matches(options::OPT_fpie))) {
5601 CmdArgs.push_back("-KPIC");
5602 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005603 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5604 getToolChain().getArch() == llvm::Triple::thumb) {
5605 CmdArgs.push_back("-mfpu=softvfp");
5606 switch(getToolChain().getTriple().getEnvironment()) {
5607 case llvm::Triple::GNUEABI:
5608 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00005609 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005610 break;
5611
5612 default:
5613 CmdArgs.push_back("-matpcs");
5614 }
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005615 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005616
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005617 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5618 options::OPT_Xassembler);
5619
5620 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005621 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005622
5623 for (InputInfoList::const_iterator
5624 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5625 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005626 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005627 }
5628
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005629 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005630 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005631 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005632}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005633
5634void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005635 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005636 const InputInfoList &Inputs,
5637 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005638 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005639 const toolchains::FreeBSD& ToolChain =
5640 static_cast<const toolchains::FreeBSD&>(getToolChain());
5641 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005642 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005643
5644 // Silence warning for "clang -g foo.o -o foo"
5645 Args.ClaimAllArgs(options::OPT_g_Group);
5646 // and "clang -emit-llvm foo.o -o foo"
5647 Args.ClaimAllArgs(options::OPT_emit_llvm);
5648 // and for "clang -w foo.o -o foo". Other warning options are already
5649 // handled somewhere else.
5650 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005651
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005652 if (!D.SysRoot.empty())
5653 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5654
Roman Divackyafe2f232012-08-28 15:09:03 +00005655 if (Args.hasArg(options::OPT_pie))
5656 CmdArgs.push_back("-pie");
5657
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005658 if (Args.hasArg(options::OPT_static)) {
5659 CmdArgs.push_back("-Bstatic");
5660 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005661 if (Args.hasArg(options::OPT_rdynamic))
5662 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005663 CmdArgs.push_back("--eh-frame-hdr");
5664 if (Args.hasArg(options::OPT_shared)) {
5665 CmdArgs.push_back("-Bshareable");
5666 } else {
5667 CmdArgs.push_back("-dynamic-linker");
5668 CmdArgs.push_back("/libexec/ld-elf.so.1");
5669 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005670 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5671 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005672 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5673 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5674 CmdArgs.push_back("--hash-style=both");
5675 }
5676 }
5677 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005678 }
5679
5680 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5681 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005682 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005683 CmdArgs.push_back("-m");
5684 CmdArgs.push_back("elf_i386_fbsd");
5685 }
5686
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005687 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005688 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005689 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005690 }
5691
Daniel Dunbarb440f562010-08-02 02:38:21 +00005692 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005693 CmdArgs.push_back("-o");
5694 CmdArgs.push_back(Output.getFilename());
5695 } else {
5696 assert(Output.isNothing() && "Invalid output.");
5697 }
5698
5699 if (!Args.hasArg(options::OPT_nostdlib) &&
5700 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005701 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005702 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005703 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005704 crt1 = "gcrt1.o";
5705 else if (Args.hasArg(options::OPT_pie))
5706 crt1 = "Scrt1.o";
5707 else
5708 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005709 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005710 if (crt1)
5711 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5712
5713 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5714
5715 const char *crtbegin = NULL;
5716 if (Args.hasArg(options::OPT_static))
5717 crtbegin = "crtbeginT.o";
5718 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5719 crtbegin = "crtbeginS.o";
5720 else
5721 crtbegin = "crtbegin.o";
5722
5723 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005724 }
5725
5726 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005727 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005728 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5729 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005730 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005731 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5732 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005733 Args.AddAllArgs(CmdArgs, options::OPT_s);
5734 Args.AddAllArgs(CmdArgs, options::OPT_t);
5735 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5736 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005737
Roman Divackyafe2f232012-08-28 15:09:03 +00005738 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005739
5740 if (!Args.hasArg(options::OPT_nostdlib) &&
5741 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005742 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005743 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005744 if (Args.hasArg(options::OPT_pg))
5745 CmdArgs.push_back("-lm_p");
5746 else
5747 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005748 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005749 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5750 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005751 if (Args.hasArg(options::OPT_pg))
5752 CmdArgs.push_back("-lgcc_p");
5753 else
5754 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005755 if (Args.hasArg(options::OPT_static)) {
5756 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005757 } else if (Args.hasArg(options::OPT_pg)) {
5758 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005759 } else {
5760 CmdArgs.push_back("--as-needed");
5761 CmdArgs.push_back("-lgcc_s");
5762 CmdArgs.push_back("--no-as-needed");
5763 }
5764
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005765 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005766 if (Args.hasArg(options::OPT_pg))
5767 CmdArgs.push_back("-lpthread_p");
5768 else
5769 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005770 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005771
Roman Divacky66f22762011-02-10 16:59:40 +00005772 if (Args.hasArg(options::OPT_pg)) {
5773 if (Args.hasArg(options::OPT_shared))
5774 CmdArgs.push_back("-lc");
5775 else
5776 CmdArgs.push_back("-lc_p");
5777 CmdArgs.push_back("-lgcc_p");
5778 } else {
5779 CmdArgs.push_back("-lc");
5780 CmdArgs.push_back("-lgcc");
5781 }
5782
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005783 if (Args.hasArg(options::OPT_static)) {
5784 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005785 } else if (Args.hasArg(options::OPT_pg)) {
5786 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005787 } else {
5788 CmdArgs.push_back("--as-needed");
5789 CmdArgs.push_back("-lgcc_s");
5790 CmdArgs.push_back("--no-as-needed");
5791 }
5792 }
5793
5794 if (!Args.hasArg(options::OPT_nostdlib) &&
5795 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005796 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005797 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005798 else
5799 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005800 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005801 }
5802
Roman Divackyafe2f232012-08-28 15:09:03 +00005803 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005804
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005805 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005806 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005807 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005808}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005809
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005810void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5811 const InputInfo &Output,
5812 const InputInfoList &Inputs,
5813 const ArgList &Args,
5814 const char *LinkingOutput) const {
5815 ArgStringList CmdArgs;
5816
5817 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5818 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005819 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005820 CmdArgs.push_back("--32");
5821
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005822 // Set byte order explicitly
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005823 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005824 CmdArgs.push_back("-EB");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005825 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005826 CmdArgs.push_back("-EL");
5827
5828 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5829 options::OPT_Xassembler);
5830
5831 CmdArgs.push_back("-o");
5832 CmdArgs.push_back(Output.getFilename());
5833
5834 for (InputInfoList::const_iterator
5835 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5836 const InputInfo &II = *it;
5837 CmdArgs.push_back(II.getFilename());
5838 }
5839
David Chisnallddbd68f2011-09-27 22:03:18 +00005840 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005841 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5842}
5843
5844void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5845 const InputInfo &Output,
5846 const InputInfoList &Inputs,
5847 const ArgList &Args,
5848 const char *LinkingOutput) const {
5849 const Driver &D = getToolChain().getDriver();
5850 ArgStringList CmdArgs;
5851
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005852 if (!D.SysRoot.empty())
5853 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5854
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005855 if (Args.hasArg(options::OPT_static)) {
5856 CmdArgs.push_back("-Bstatic");
5857 } else {
5858 if (Args.hasArg(options::OPT_rdynamic))
5859 CmdArgs.push_back("-export-dynamic");
5860 CmdArgs.push_back("--eh-frame-hdr");
5861 if (Args.hasArg(options::OPT_shared)) {
5862 CmdArgs.push_back("-Bshareable");
5863 } else {
5864 CmdArgs.push_back("-dynamic-linker");
5865 CmdArgs.push_back("/libexec/ld.elf_so");
5866 }
5867 }
5868
5869 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5870 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005871 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005872 CmdArgs.push_back("-m");
5873 CmdArgs.push_back("elf_i386");
5874 }
5875
5876 if (Output.isFilename()) {
5877 CmdArgs.push_back("-o");
5878 CmdArgs.push_back(Output.getFilename());
5879 } else {
5880 assert(Output.isNothing() && "Invalid output.");
5881 }
5882
5883 if (!Args.hasArg(options::OPT_nostdlib) &&
5884 !Args.hasArg(options::OPT_nostartfiles)) {
5885 if (!Args.hasArg(options::OPT_shared)) {
5886 CmdArgs.push_back(Args.MakeArgString(
5887 getToolChain().GetFilePath("crt0.o")));
5888 CmdArgs.push_back(Args.MakeArgString(
5889 getToolChain().GetFilePath("crti.o")));
5890 CmdArgs.push_back(Args.MakeArgString(
5891 getToolChain().GetFilePath("crtbegin.o")));
5892 } else {
5893 CmdArgs.push_back(Args.MakeArgString(
5894 getToolChain().GetFilePath("crti.o")));
5895 CmdArgs.push_back(Args.MakeArgString(
5896 getToolChain().GetFilePath("crtbeginS.o")));
5897 }
5898 }
5899
5900 Args.AddAllArgs(CmdArgs, options::OPT_L);
5901 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5902 Args.AddAllArgs(CmdArgs, options::OPT_e);
5903 Args.AddAllArgs(CmdArgs, options::OPT_s);
5904 Args.AddAllArgs(CmdArgs, options::OPT_t);
5905 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5906 Args.AddAllArgs(CmdArgs, options::OPT_r);
5907
5908 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5909
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00005910 unsigned Major, Minor, Micro;
5911 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
5912 bool useLibgcc = true;
5913 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) {
5914 if (getToolChain().getArch() == llvm::Triple::x86 ||
5915 getToolChain().getArch() == llvm::Triple::x86_64)
5916 useLibgcc = false;
5917 }
5918
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005919 if (!Args.hasArg(options::OPT_nostdlib) &&
5920 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005921 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005922 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5923 CmdArgs.push_back("-lm");
5924 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005925 if (Args.hasArg(options::OPT_pthread))
5926 CmdArgs.push_back("-lpthread");
5927 CmdArgs.push_back("-lc");
5928
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00005929 if (useLibgcc) {
5930 if (Args.hasArg(options::OPT_static)) {
5931 // libgcc_eh depends on libc, so resolve as much as possible,
5932 // pull in any new requirements from libc and then get the rest
5933 // of libgcc.
5934 CmdArgs.push_back("-lgcc_eh");
5935 CmdArgs.push_back("-lc");
5936 CmdArgs.push_back("-lgcc");
5937 } else {
5938 CmdArgs.push_back("-lgcc");
5939 CmdArgs.push_back("--as-needed");
5940 CmdArgs.push_back("-lgcc_s");
5941 CmdArgs.push_back("--no-as-needed");
5942 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005943 }
5944 }
5945
5946 if (!Args.hasArg(options::OPT_nostdlib) &&
5947 !Args.hasArg(options::OPT_nostartfiles)) {
5948 if (!Args.hasArg(options::OPT_shared))
5949 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5950 "crtend.o")));
5951 else
5952 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5953 "crtendS.o")));
5954 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5955 "crtn.o")));
5956 }
5957
Bill Wendling08760582011-06-27 19:15:03 +00005958 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005959
David Chisnallddbd68f2011-09-27 22:03:18 +00005960 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005961 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5962}
5963
Thomas Schwinge4e555262013-03-28 19:04:25 +00005964void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5965 const InputInfo &Output,
5966 const InputInfoList &Inputs,
5967 const ArgList &Args,
5968 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00005969 ArgStringList CmdArgs;
5970
5971 // Add --32/--64 to make sure we get the format we want.
5972 // This is incomplete
5973 if (getToolChain().getArch() == llvm::Triple::x86) {
5974 CmdArgs.push_back("--32");
5975 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5976 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005977 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5978 CmdArgs.push_back("-a32");
5979 CmdArgs.push_back("-mppc");
5980 CmdArgs.push_back("-many");
5981 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5982 CmdArgs.push_back("-a64");
5983 CmdArgs.push_back("-mppc64");
5984 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00005985 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
5986 CmdArgs.push_back("-a64");
5987 CmdArgs.push_back("-mppc64le");
5988 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005989 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005990 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005991 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5992 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005993
5994 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5995 getToolChain().getTriple());
5996 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005997
5998 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5999 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
6000 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006001 } else if (getToolChain().getArch() == llvm::Triple::mips ||
6002 getToolChain().getArch() == llvm::Triple::mipsel ||
6003 getToolChain().getArch() == llvm::Triple::mips64 ||
6004 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006005 StringRef CPUName;
6006 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006007 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006008
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006009 CmdArgs.push_back("-march");
6010 CmdArgs.push_back(CPUName.data());
6011
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006012 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006013 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00006014
6015 if (getToolChain().getArch() == llvm::Triple::mips ||
6016 getToolChain().getArch() == llvm::Triple::mips64)
6017 CmdArgs.push_back("-EB");
6018 else
6019 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006020
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006021 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6022 if (StringRef(A->getValue()) == "2008")
6023 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6024 }
6025
Simon Atanasyan036d16d2013-04-30 07:47:13 +00006026 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6027 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6028 options::OPT_mno_micromips);
6029 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6030 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6031
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006032 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6033 options::OPT_fpic, options::OPT_fno_pic,
6034 options::OPT_fPIE, options::OPT_fno_PIE,
6035 options::OPT_fpie, options::OPT_fno_pie);
6036 if (LastPICArg &&
6037 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6038 LastPICArg->getOption().matches(options::OPT_fpic) ||
6039 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6040 LastPICArg->getOption().matches(options::OPT_fpie))) {
6041 CmdArgs.push_back("-KPIC");
6042 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006043 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
Richard Sandiford4652d892013-07-19 16:51:51 +00006044 // Always pass an -march option, since our default of z10 is later
6045 // than the GNU assembler's default.
6046 StringRef CPUName = getSystemZTargetCPU(Args);
6047 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Rafael Espindola92b00932010-08-10 00:25:48 +00006048 }
6049
6050 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6051 options::OPT_Xassembler);
6052
6053 CmdArgs.push_back("-o");
6054 CmdArgs.push_back(Output.getFilename());
6055
6056 for (InputInfoList::const_iterator
6057 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6058 const InputInfo &II = *it;
6059 CmdArgs.push_back(II.getFilename());
6060 }
6061
6062 const char *Exec =
6063 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6064 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00006065
6066 // Handle the debug info splitting at object creation time if we're
6067 // creating an object.
6068 // TODO: Currently only works on linux with newer objcopy.
6069 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006070 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00006071 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6072 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00006073}
6074
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006075static void AddLibgcc(llvm::Triple Triple, const Driver &D,
6076 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00006077 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00006078 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6079 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00006080 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006081 CmdArgs.push_back("-lgcc");
6082
Logan Chien3d3373c2012-11-19 12:04:11 +00006083 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006084 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006085 CmdArgs.push_back("-lgcc");
6086 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00006087 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006088 CmdArgs.push_back("--as-needed");
6089 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00006090 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006091 CmdArgs.push_back("--no-as-needed");
6092 }
6093
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006094 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00006095 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00006096 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006097 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00006098
6099 // According to Android ABI, we have to link with libdl if we are
6100 // linking with non-static libgcc.
6101 //
6102 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6103 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6104 if (isAndroid && !StaticLibgcc)
6105 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00006106}
6107
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006108static bool hasMipsN32ABIArg(const ArgList &Args) {
6109 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smithbd55daf2012-11-01 04:30:05 +00006110 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006111}
6112
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006113static StringRef getLinuxDynamicLinker(const ArgList &Args,
6114 const toolchains::Linux &ToolChain) {
6115 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android)
6116 return "/system/bin/linker";
6117 else if (ToolChain.getArch() == llvm::Triple::x86)
6118 return "/lib/ld-linux.so.2";
6119 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6120 return "/lib/ld-linux-aarch64.so.1";
6121 else if (ToolChain.getArch() == llvm::Triple::arm ||
6122 ToolChain.getArch() == llvm::Triple::thumb) {
6123 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6124 return "/lib/ld-linux-armhf.so.3";
6125 else
6126 return "/lib/ld-linux.so.3";
6127 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6128 ToolChain.getArch() == llvm::Triple::mipsel)
6129 return "/lib/ld.so.1";
6130 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6131 ToolChain.getArch() == llvm::Triple::mips64el) {
6132 if (hasMipsN32ABIArg(Args))
6133 return "/lib32/ld.so.1";
6134 else
6135 return "/lib64/ld.so.1";
6136 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6137 return "/lib/ld.so.1";
6138 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
Bill Schmidt778d3872013-07-26 01:36:11 +00006139 ToolChain.getArch() == llvm::Triple::ppc64le ||
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006140 ToolChain.getArch() == llvm::Triple::systemz)
6141 return "/lib64/ld64.so.1";
6142 else
6143 return "/lib64/ld-linux-x86-64.so.2";
6144}
6145
Thomas Schwinge4e555262013-03-28 19:04:25 +00006146void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6147 const InputInfo &Output,
6148 const InputInfoList &Inputs,
6149 const ArgList &Args,
6150 const char *LinkingOutput) const {
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006151 const toolchains::Linux& ToolChain =
6152 static_cast<const toolchains::Linux&>(getToolChain());
6153 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00006154 const bool isAndroid =
6155 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Alexey Samsonov609213f92013-08-19 09:14:21 +00006156 const SanitizerArgs &Sanitize = D.getOrParseSanitizerArgs(Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006157 const bool IsPIE =
6158 !Args.hasArg(options::OPT_shared) &&
Alexey Samsonove6203662013-08-09 07:42:13 +00006159 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow(ToolChain));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006160
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006161 ArgStringList CmdArgs;
6162
Rafael Espindolad1002f62010-11-15 18:28:16 +00006163 // Silence warning for "clang -g foo.o -o foo"
6164 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006165 // and "clang -emit-llvm foo.o -o foo"
6166 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00006167 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00006168 // handled somewhere else.
6169 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00006170
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006171 if (!D.SysRoot.empty())
6172 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006173
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006174 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00006175 CmdArgs.push_back("-pie");
6176
Rafael Espindola1c76c592010-11-07 22:57:16 +00006177 if (Args.hasArg(options::OPT_rdynamic))
6178 CmdArgs.push_back("-export-dynamic");
6179
Rafael Espindola34d77dc2010-11-11 19:34:42 +00006180 if (Args.hasArg(options::OPT_s))
6181 CmdArgs.push_back("-s");
6182
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006183 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6184 e = ToolChain.ExtraOpts.end();
6185 i != e; ++i)
6186 CmdArgs.push_back(i->c_str());
6187
6188 if (!Args.hasArg(options::OPT_static)) {
6189 CmdArgs.push_back("--eh-frame-hdr");
6190 }
6191
6192 CmdArgs.push_back("-m");
6193 if (ToolChain.getArch() == llvm::Triple::x86)
6194 CmdArgs.push_back("elf_i386");
Tim Northover9bb857a2013-01-31 12:13:10 +00006195 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6196 CmdArgs.push_back("aarch64linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00006197 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00006198 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006199 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00006200 else if (ToolChain.getArch() == llvm::Triple::ppc)
6201 CmdArgs.push_back("elf32ppclinux");
6202 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6203 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00006204 else if (ToolChain.getArch() == llvm::Triple::mips)
6205 CmdArgs.push_back("elf32btsmip");
6206 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6207 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006208 else if (ToolChain.getArch() == llvm::Triple::mips64) {
6209 if (hasMipsN32ABIArg(Args))
6210 CmdArgs.push_back("elf32btsmipn32");
6211 else
6212 CmdArgs.push_back("elf64btsmip");
6213 }
6214 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
6215 if (hasMipsN32ABIArg(Args))
6216 CmdArgs.push_back("elf32ltsmipn32");
6217 else
6218 CmdArgs.push_back("elf64ltsmip");
6219 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006220 else if (ToolChain.getArch() == llvm::Triple::systemz)
6221 CmdArgs.push_back("elf64_s390");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006222 else
6223 CmdArgs.push_back("elf_x86_64");
6224
6225 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00006226 if (ToolChain.getArch() == llvm::Triple::arm
6227 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006228 CmdArgs.push_back("-Bstatic");
6229 else
6230 CmdArgs.push_back("-static");
6231 } else if (Args.hasArg(options::OPT_shared)) {
6232 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00006233 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006234 CmdArgs.push_back("-Bsymbolic");
6235 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006236 }
6237
6238 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00006239 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006240 (!Args.hasArg(options::OPT_static) &&
6241 !Args.hasArg(options::OPT_shared))) {
6242 CmdArgs.push_back("-dynamic-linker");
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006243 CmdArgs.push_back(Args.MakeArgString(
6244 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006245 }
6246
6247 CmdArgs.push_back("-o");
6248 CmdArgs.push_back(Output.getFilename());
6249
Rafael Espindola81937ec2010-12-01 01:52:43 +00006250 if (!Args.hasArg(options::OPT_nostdlib) &&
6251 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006252 if (!isAndroid) {
6253 const char *crt1 = NULL;
6254 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00006255 if (Args.hasArg(options::OPT_pg))
6256 crt1 = "gcrt1.o";
6257 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006258 crt1 = "Scrt1.o";
6259 else
6260 crt1 = "crt1.o";
6261 }
6262 if (crt1)
6263 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006264
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006265 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6266 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006267
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006268 const char *crtbegin;
6269 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006270 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006271 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006272 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006273 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006274 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006275 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006276 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006277 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00006278
6279 // Add crtfastmath.o if available and fast math is enabled.
6280 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006281 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006282
6283 Args.AddAllArgs(CmdArgs, options::OPT_L);
6284
6285 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6286
Roman Divackyee8188a2011-03-01 17:53:14 +00006287 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6288 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006289 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006290
Rafael Espindola9446d762012-04-09 23:53:34 +00006291 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
6292 // as gold requires -plugin to come before any -plugin-opt that -Wl might
6293 // forward.
Rafael Espindolab0092d72013-09-04 19:37:35 +00006294 if (D.IsUsingLTO(Args)) {
Rafael Espindola9446d762012-04-09 23:53:34 +00006295 CmdArgs.push_back("-plugin");
6296 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
6297 CmdArgs.push_back(Args.MakeArgString(Plugin));
Chandler Carruth953fb082013-01-13 11:46:33 +00006298
6299 // Try to pass driver level flags relevant to LTO code generation down to
6300 // the plugin.
6301
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006302 // Handle flags for selecting CPU variants.
6303 std::string CPU = getCPUName(Args, ToolChain.getTriple());
6304 if (!CPU.empty()) {
Chandler Carruth953fb082013-01-13 11:46:33 +00006305 CmdArgs.push_back(
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006306 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6307 CPU));
6308 }
Rafael Espindola9446d762012-04-09 23:53:34 +00006309 }
6310
Chandler Carruth953fb082013-01-13 11:46:33 +00006311
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00006312 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6313 CmdArgs.push_back("--no-demangle");
6314
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006315 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6316
Eric Christopher04997782012-11-29 18:51:05 +00006317 // Call these before we add the C++ ABI library.
Richard Smith52be6192012-11-05 22:04:41 +00006318 if (Sanitize.needsUbsanRt())
Hans Wennborg70850d82013-07-18 20:29:38 +00006319 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX(),
Richard Smithcff3cde2013-03-20 23:49:07 +00006320 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006321 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
Eric Christopher04997782012-11-29 18:51:05 +00006322 if (Sanitize.needsAsanRt())
6323 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6324 if (Sanitize.needsTsanRt())
6325 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00006326 if (Sanitize.needsMsanRt())
6327 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006328 if (Sanitize.needsLsanRt())
6329 addLsanRTLinux(getToolChain(), Args, CmdArgs);
Peter Collingbournec3772752013-08-07 22:47:34 +00006330 if (Sanitize.needsDfsanRt())
6331 addDfsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith4d3110a2012-10-25 02:14:12 +00006332
Chandler Carruthe4458b32013-06-24 09:38:45 +00006333 // The profile runtime also needs access to system libraries.
6334 addProfileRTLinux(getToolChain(), Args, CmdArgs);
6335
Hans Wennborg70850d82013-07-18 20:29:38 +00006336 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00006337 !Args.hasArg(options::OPT_nostdlib) &&
6338 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00006339 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6340 !Args.hasArg(options::OPT_static);
6341 if (OnlyLibstdcxxStatic)
6342 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006343 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00006344 if (OnlyLibstdcxxStatic)
6345 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006346 CmdArgs.push_back("-lm");
6347 }
6348
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006349 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00006350 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6351 if (Args.hasArg(options::OPT_static))
6352 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00006353
Chandler Carruth01538002013-01-17 13:19:29 +00006354 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6355 if (OpenMP) {
6356 CmdArgs.push_back("-lgomp");
6357
6358 // FIXME: Exclude this for platforms whith libgomp that doesn't require
6359 // librt. Most modern Linux platfroms require it, but some may not.
6360 CmdArgs.push_back("-lrt");
6361 }
6362
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006363 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006364
Chandler Carruth94a32012012-05-14 18:31:18 +00006365 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruth01538002013-01-17 13:19:29 +00006366 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth94a32012012-05-14 18:31:18 +00006367 CmdArgs.push_back("-lpthread");
6368
6369 CmdArgs.push_back("-lc");
6370
6371 if (Args.hasArg(options::OPT_static))
6372 CmdArgs.push_back("--end-group");
6373 else
6374 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6375 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00006376
Rafael Espindola81937ec2010-12-01 01:52:43 +00006377 if (!Args.hasArg(options::OPT_nostartfiles)) {
6378 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006379 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006380 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006381 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006382 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00006383 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006384 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006385
Rafael Espindola81937ec2010-12-01 01:52:43 +00006386 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006387 if (!isAndroid)
6388 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00006389 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006390 }
6391
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006392 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6393}
Rafael Espindola92b00932010-08-10 00:25:48 +00006394
Chris Lattner3e2ee142010-07-07 16:01:42 +00006395void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006396 const InputInfo &Output,
6397 const InputInfoList &Inputs,
6398 const ArgList &Args,
6399 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006400 ArgStringList CmdArgs;
6401
6402 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6403 options::OPT_Xassembler);
6404
6405 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006406 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006407
6408 for (InputInfoList::const_iterator
6409 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6410 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006411 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006412 }
6413
6414 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00006415 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006416 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006417}
6418
6419void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006420 const InputInfo &Output,
6421 const InputInfoList &Inputs,
6422 const ArgList &Args,
6423 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006424 const Driver &D = getToolChain().getDriver();
6425 ArgStringList CmdArgs;
6426
Daniel Dunbarb440f562010-08-02 02:38:21 +00006427 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006428 CmdArgs.push_back("-o");
6429 CmdArgs.push_back(Output.getFilename());
6430 } else {
6431 assert(Output.isNothing() && "Invalid output.");
6432 }
6433
6434 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00006435 !Args.hasArg(options::OPT_nostartfiles)) {
6436 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6437 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6438 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6439 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6440 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006441
6442 Args.AddAllArgs(CmdArgs, options::OPT_L);
6443 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6444 Args.AddAllArgs(CmdArgs, options::OPT_e);
6445
Daniel Dunbar54423b22010-09-17 00:24:54 +00006446 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006447
Eli Friedman83de5132011-12-08 23:54:21 +00006448 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6449
Chris Lattner3e2ee142010-07-07 16:01:42 +00006450 if (!Args.hasArg(options::OPT_nostdlib) &&
6451 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006452 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006453 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006454 CmdArgs.push_back("-lm");
6455 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006456 }
6457
6458 if (!Args.hasArg(options::OPT_nostdlib) &&
6459 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00006460 if (Args.hasArg(options::OPT_pthread))
6461 CmdArgs.push_back("-lpthread");
6462 CmdArgs.push_back("-lc");
6463 CmdArgs.push_back("-lCompilerRT-Generic");
6464 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6465 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00006466 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006467 }
6468
Eli Friedman83de5132011-12-08 23:54:21 +00006469 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006470 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006471}
6472
Daniel Dunbarcc912342009-05-02 18:28:39 +00006473/// DragonFly Tools
6474
6475// For now, DragonFly Assemble does just about the same as for
6476// FreeBSD, but this may change soon.
6477void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006478 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006479 const InputInfoList &Inputs,
6480 const ArgList &Args,
6481 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006482 ArgStringList CmdArgs;
6483
6484 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6485 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006486 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00006487 CmdArgs.push_back("--32");
6488
6489 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6490 options::OPT_Xassembler);
6491
6492 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006493 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006494
6495 for (InputInfoList::const_iterator
6496 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6497 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006498 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006499 }
6500
6501 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006502 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006503 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006504}
6505
6506void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006507 const InputInfo &Output,
6508 const InputInfoList &Inputs,
6509 const ArgList &Args,
6510 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00006511 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00006512 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00006513 ArgStringList CmdArgs;
6514
John McCall65b8da02013-04-11 22:55:55 +00006515 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6516 UseGCC47 = false;
6517
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006518 if (!D.SysRoot.empty())
6519 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6520
John McCall65b8da02013-04-11 22:55:55 +00006521 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006522 if (Args.hasArg(options::OPT_static)) {
6523 CmdArgs.push_back("-Bstatic");
6524 } else {
John McCall65b8da02013-04-11 22:55:55 +00006525 if (Args.hasArg(options::OPT_rdynamic))
6526 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006527 if (Args.hasArg(options::OPT_shared))
6528 CmdArgs.push_back("-Bshareable");
6529 else {
6530 CmdArgs.push_back("-dynamic-linker");
6531 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6532 }
John McCall65b8da02013-04-11 22:55:55 +00006533 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006534 }
6535
6536 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6537 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006538 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006539 CmdArgs.push_back("-m");
6540 CmdArgs.push_back("elf_i386");
6541 }
6542
Daniel Dunbarb440f562010-08-02 02:38:21 +00006543 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006544 CmdArgs.push_back("-o");
6545 CmdArgs.push_back(Output.getFilename());
6546 } else {
6547 assert(Output.isNothing() && "Invalid output.");
6548 }
6549
6550 if (!Args.hasArg(options::OPT_nostdlib) &&
6551 !Args.hasArg(options::OPT_nostartfiles)) {
6552 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00006553 if (Args.hasArg(options::OPT_pg))
6554 CmdArgs.push_back(Args.MakeArgString(
6555 getToolChain().GetFilePath("gcrt1.o")));
6556 else {
6557 if (Args.hasArg(options::OPT_pie))
6558 CmdArgs.push_back(Args.MakeArgString(
6559 getToolChain().GetFilePath("Scrt1.o")));
6560 else
6561 CmdArgs.push_back(Args.MakeArgString(
6562 getToolChain().GetFilePath("crt1.o")));
6563 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006564 }
John McCall65b8da02013-04-11 22:55:55 +00006565 CmdArgs.push_back(Args.MakeArgString(
6566 getToolChain().GetFilePath("crti.o")));
6567 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6568 CmdArgs.push_back(Args.MakeArgString(
6569 getToolChain().GetFilePath("crtbeginS.o")));
6570 else
6571 CmdArgs.push_back(Args.MakeArgString(
6572 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006573 }
6574
6575 Args.AddAllArgs(CmdArgs, options::OPT_L);
6576 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6577 Args.AddAllArgs(CmdArgs, options::OPT_e);
6578
Daniel Dunbar54423b22010-09-17 00:24:54 +00006579 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006580
6581 if (!Args.hasArg(options::OPT_nostdlib) &&
6582 !Args.hasArg(options::OPT_nodefaultlibs)) {
6583 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6584 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00006585 if (UseGCC47)
6586 CmdArgs.push_back("-L/usr/lib/gcc47");
6587 else
6588 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006589
6590 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00006591 if (UseGCC47) {
6592 CmdArgs.push_back("-rpath");
6593 CmdArgs.push_back("/usr/lib/gcc47");
6594 } else {
6595 CmdArgs.push_back("-rpath");
6596 CmdArgs.push_back("/usr/lib/gcc44");
6597 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006598 }
6599
Hans Wennborg70850d82013-07-18 20:29:38 +00006600 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006601 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006602 CmdArgs.push_back("-lm");
6603 }
6604
Daniel Dunbarcc912342009-05-02 18:28:39 +00006605 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006606 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006607
6608 if (!Args.hasArg(options::OPT_nolibc)) {
6609 CmdArgs.push_back("-lc");
6610 }
6611
John McCall65b8da02013-04-11 22:55:55 +00006612 if (UseGCC47) {
6613 if (Args.hasArg(options::OPT_static) ||
6614 Args.hasArg(options::OPT_static_libgcc)) {
6615 CmdArgs.push_back("-lgcc");
6616 CmdArgs.push_back("-lgcc_eh");
6617 } else {
6618 if (Args.hasArg(options::OPT_shared_libgcc)) {
6619 CmdArgs.push_back("-lgcc_pic");
6620 if (!Args.hasArg(options::OPT_shared))
6621 CmdArgs.push_back("-lgcc");
6622 } else {
6623 CmdArgs.push_back("-lgcc");
6624 CmdArgs.push_back("--as-needed");
6625 CmdArgs.push_back("-lgcc_pic");
6626 CmdArgs.push_back("--no-as-needed");
6627 }
6628 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006629 } else {
John McCall65b8da02013-04-11 22:55:55 +00006630 if (Args.hasArg(options::OPT_shared)) {
6631 CmdArgs.push_back("-lgcc_pic");
6632 } else {
6633 CmdArgs.push_back("-lgcc");
6634 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006635 }
6636 }
6637
6638 if (!Args.hasArg(options::OPT_nostdlib) &&
6639 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00006640 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006641 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006642 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00006643 else
6644 CmdArgs.push_back(Args.MakeArgString(
6645 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006646 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00006647 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006648 }
6649
Bill Wendling08760582011-06-27 19:15:03 +00006650 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006651
Daniel Dunbarcc912342009-05-02 18:28:39 +00006652 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006653 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006654 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006655}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006656
6657void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6658 const InputInfo &Output,
6659 const InputInfoList &Inputs,
6660 const ArgList &Args,
6661 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006662 ArgStringList CmdArgs;
6663
6664 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006665 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6666 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006667 } else {
6668 assert(Output.isNothing() && "Invalid output.");
6669 }
6670
6671 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg32e3b722013-08-09 17:38:42 +00006672 !Args.hasArg(options::OPT_nostartfiles) &&
6673 !C.getDriver().IsCLMode()) {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006674 CmdArgs.push_back("-defaultlib:libcmt");
6675 }
6676
6677 CmdArgs.push_back("-nologo");
6678
Hans Wennborgf1a74252013-09-10 20:18:04 +00006679 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
6680
6681 if (DLL) {
6682 CmdArgs.push_back(Args.MakeArgString("-dll"));
6683
6684 SmallString<128> ImplibName(Output.getFilename());
6685 llvm::sys::path::replace_extension(ImplibName, "lib");
6686 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
6687 ImplibName.str()));
6688 }
6689
Hans Wennborg65f17522013-08-27 18:10:21 +00006690 if (getToolChain().getDriver().getOrParseSanitizerArgs(Args).needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00006691 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00006692 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborg65f17522013-08-27 18:10:21 +00006693 SmallString<128> LibSanitizer(getToolChain().getDriver().ResourceDir);
Hans Wennborgf1a74252013-09-10 20:18:04 +00006694 llvm::sys::path::append(LibSanitizer, "lib", "windows");
6695 if (DLL) {
Timur Iskhodzhanov3b6adcb62013-09-11 11:45:31 +00006696 llvm::sys::path::append(LibSanitizer, "clang_rt.asan_dll_thunk-i386.lib");
Hans Wennborgf1a74252013-09-10 20:18:04 +00006697 } else {
6698 llvm::sys::path::append(LibSanitizer, "clang_rt.asan-i386.lib");
6699 }
6700 // FIXME: Handle 64-bit.
Hans Wennborg65f17522013-08-27 18:10:21 +00006701 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
6702 }
6703
Michael J. Spencere2f49362012-06-18 16:56:04 +00006704 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg2e274592013-08-13 23:38:57 +00006705 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00006706
6707 // Add filenames immediately.
6708 for (InputInfoList::const_iterator
6709 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6710 if (it->isFilename())
6711 CmdArgs.push_back(it->getFilename());
Hans Wennborgbe4a6762013-08-14 01:24:35 +00006712 else
6713 it->getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencere2f49362012-06-18 16:56:04 +00006714 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006715
6716 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006717 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006718 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6719}
Hans Wennborg87cfa712013-09-19 20:32:16 +00006720
6721void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
6722 const InputInfo &Output,
6723 const InputInfoList &Inputs,
6724 const ArgList &Args,
6725 const char *LinkingOutput) const {
6726 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
6727}
6728
Hans Wennborg188382e2013-09-20 18:16:35 +00006729// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
6730// If one cannot be found, return FallbackName.
6731// We do this special search to prevent clang-cl from falling back onto itself
6732// if it's available as cl.exe on the path.
6733static std::string FindFallback(const char *FallbackName,
6734 const char *ClangProgramPath) {
6735 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
6736 if (!OptPath.hasValue())
6737 return FallbackName;
6738
6739#ifdef LLVM_ON_WIN32
6740 const StringRef PathSeparators = ";";
6741#else
6742 const StringRef PathSeparators = ":";
6743#endif
6744
6745 SmallVector<StringRef, 8> PathSegments;
6746 llvm::SplitString(OptPath.getValue(), PathSegments, PathSeparators);
6747
6748 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
6749 const StringRef &PathSegment = PathSegments[i];
6750 if (PathSegment.empty())
6751 continue;
6752
6753 SmallString<128> FilePath(PathSegment);
6754 llvm::sys::path::append(FilePath, FallbackName);
6755 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
6756 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
6757 return FilePath.str();
6758 }
6759
6760 return FallbackName;
6761}
6762
Hans Wennborg87cfa712013-09-19 20:32:16 +00006763Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
6764 const InputInfo &Output,
6765 const InputInfoList &Inputs,
6766 const ArgList &Args,
6767 const char *LinkingOutput) const {
6768 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00006769 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00006770 CmdArgs.push_back("/c"); // Compile only.
6771 CmdArgs.push_back("/W0"); // No warnings.
6772
6773 // The goal is to be able to invoke this tool correctly based on
6774 // any flag accepted by clang-cl.
6775
6776 // These are spelled the same way in clang and cl.exe,.
6777 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
6778 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00006779
6780 // Optimization level.
6781 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
6782 if (A->getOption().getID() == options::OPT_O0) {
6783 CmdArgs.push_back("/Od");
6784 } else {
6785 StringRef OptLevel = A->getValue();
6786 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
6787 A->render(Args, CmdArgs);
6788 else if (OptLevel == "3")
6789 CmdArgs.push_back("/Ox");
6790 }
6791 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00006792
6793 // Flags for which clang-cl have an alias.
6794 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
6795
6796 if (Arg *A = Args.getLastArg(options::OPT_frtti, options::OPT_fno_rtti))
6797 CmdArgs.push_back(A->getOption().getID() == options::OPT_frtti ? "/GR"
6798 : "/GR-");
6799 if (Args.hasArg(options::OPT_fsyntax_only))
6800 CmdArgs.push_back("/Zs");
6801
Hans Wennborg260ff402013-09-27 17:54:18 +00006802 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
6803 for (size_t I = 0, E = Includes.size(); I != E; ++I)
6804 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Includes[I]));
6805
Hans Wennborg87cfa712013-09-19 20:32:16 +00006806 // Flags that can simply be passed through.
6807 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
6808 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
6809
6810 // The order of these flags is relevant, so pick the last one.
6811 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
6812 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
6813 A->render(Args, CmdArgs);
6814
6815
6816 // Input filename.
6817 assert(Inputs.size() == 1);
6818 const InputInfo &II = Inputs[0];
6819 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
6820 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
6821 if (II.isFilename())
6822 CmdArgs.push_back(II.getFilename());
6823 else
6824 II.getInputArg().renderAsInput(Args, CmdArgs);
6825
6826 // Output filename.
6827 assert(Output.getType() == types::TY_Object);
6828 const char *Fo = Args.MakeArgString(std::string("/Fo") +
6829 Output.getFilename());
6830 CmdArgs.push_back(Fo);
6831
Hans Wennborg188382e2013-09-20 18:16:35 +00006832 const Driver &D = getToolChain().getDriver();
6833 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborg87cfa712013-09-19 20:32:16 +00006834
Hans Wennborg188382e2013-09-20 18:16:35 +00006835 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00006836}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00006837
6838
6839/// XCore Tools
6840// We pass assemble and link construction to the xcc tool.
6841
6842void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6843 const InputInfo &Output,
6844 const InputInfoList &Inputs,
6845 const ArgList &Args,
6846 const char *LinkingOutput) const {
6847 ArgStringList CmdArgs;
6848
6849 CmdArgs.push_back("-o");
6850 CmdArgs.push_back(Output.getFilename());
6851
6852 CmdArgs.push_back("-c");
6853
6854 if (Args.hasArg(options::OPT_g_Group)) {
6855 CmdArgs.push_back("-g");
6856 }
6857
6858 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6859 options::OPT_Xassembler);
6860
6861 for (InputInfoList::const_iterator
6862 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6863 const InputInfo &II = *it;
6864 CmdArgs.push_back(II.getFilename());
6865 }
6866
6867 const char *Exec =
6868 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
6869 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6870}
6871
6872void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
6873 const InputInfo &Output,
6874 const InputInfoList &Inputs,
6875 const ArgList &Args,
6876 const char *LinkingOutput) const {
6877 ArgStringList CmdArgs;
6878
6879 if (Output.isFilename()) {
6880 CmdArgs.push_back("-o");
6881 CmdArgs.push_back(Output.getFilename());
6882 } else {
6883 assert(Output.isNothing() && "Invalid output.");
6884 }
6885
6886 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6887
6888 const char *Exec =
6889 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
6890 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6891}