blob: ffaac21b4ed53c4f60d0769dcd7c283dccb6be44 [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")
Bernard Ogden021d7da2013-10-24 18:32:36 +0000471 .Cases("cortex-a53", "cortex-a57", "v8")
Chad Rosier9ac84512011-10-07 17:48:56 +0000472 .Default("");
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000473}
474
Benjamin Kramer09811c72012-06-26 22:20:06 +0000475/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
476//
477// FIXME: tblgen this.
478static std::string getARMTargetCPU(const ArgList &Args,
479 const llvm::Triple &Triple) {
480 // FIXME: Warn on inconsistent use of -mcpu and -march.
481
482 // If we have -mcpu=, use that.
483 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000484 StringRef MCPU = A->getValue();
Benjamin Kramer09811c72012-06-26 22:20:06 +0000485 // Handle -mcpu=native.
486 if (MCPU == "native")
487 return llvm::sys::getHostCPUName();
488 else
489 return MCPU;
490 }
491
492 StringRef MArch;
493 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
494 // Otherwise, if we have -march= choose the base CPU for that arch.
Richard Smithbd55daf2012-11-01 04:30:05 +0000495 MArch = A->getValue();
Benjamin Kramer09811c72012-06-26 22:20:06 +0000496 } else {
497 // Otherwise, use the Arch from the triple.
498 MArch = Triple.getArchName();
499 }
500
501 // Handle -march=native.
502 std::string NativeMArch;
503 if (MArch == "native") {
504 std::string CPU = llvm::sys::getHostCPUName();
505 if (CPU != "generic") {
506 // Translate the native cpu into the architecture. The switch below will
507 // then chose the minimum cpu for that arch.
508 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
509 MArch = NativeMArch;
510 }
511 }
512
513 return llvm::StringSwitch<const char *>(MArch)
514 .Cases("armv2", "armv2a","arm2")
515 .Case("armv3", "arm6")
516 .Case("armv3m", "arm7m")
Tim Northover92509c12013-06-13 15:02:46 +0000517 .Case("armv4", "strongarm")
518 .Case("armv4t", "arm7tdmi")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000519 .Cases("armv5", "armv5t", "arm10tdmi")
520 .Cases("armv5e", "armv5te", "arm1022e")
521 .Case("armv5tej", "arm926ej-s")
522 .Cases("armv6", "armv6k", "arm1136jf-s")
523 .Case("armv6j", "arm1136j-s")
524 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
525 .Case("armv6t2", "arm1156t2-s")
Bob Wilson743bf672013-03-04 22:37:49 +0000526 .Cases("armv6m", "armv6-m", "cortex-m0")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000527 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Bob Wilson743bf672013-03-04 22:37:49 +0000528 .Cases("armv7em", "armv7e-m", "cortex-m4")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000529 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
530 .Cases("armv7s", "armv7-s", "swift")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000531 .Cases("armv7r", "armv7-r", "cortex-r4")
532 .Cases("armv7m", "armv7-m", "cortex-m3")
Joey Goulyd077bc62013-06-26 17:19:48 +0000533 .Cases("armv8", "armv8a", "armv8-a", "cortex-a53")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000534 .Case("ep9312", "ep9312")
535 .Case("iwmmxt", "iwmmxt")
536 .Case("xscale", "xscale")
Tim Northover92509c12013-06-13 15:02:46 +0000537 // If all else failed, return the most base CPU with thumb interworking
538 // supported by LLVM.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000539 .Default("arm7tdmi");
540}
541
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000542// FIXME: Move to target hook.
543static bool isSignedCharDefault(const llvm::Triple &Triple) {
544 switch (Triple.getArch()) {
545 default:
546 return true;
547
Tim Northover9bb857a2013-01-31 12:13:10 +0000548 case llvm::Triple::aarch64:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000549 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000550 case llvm::Triple::ppc:
551 case llvm::Triple::ppc64:
Bob Wilson6524dd32011-10-14 05:03:44 +0000552 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000553 return true;
554 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000555
Bill Schmidt778d3872013-07-26 01:36:11 +0000556 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000557 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000558 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000559 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000560 }
561}
562
Robert Lytton0e076492013-08-13 09:43:10 +0000563static bool isNoCommonDefault(const llvm::Triple &Triple) {
564 switch (Triple.getArch()) {
565 default:
566 return false;
567
568 case llvm::Triple::xcore:
569 return true;
570 }
571}
572
Chad Rosiercfbfc582012-04-04 20:51:35 +0000573// Handle -mfpu=.
574//
575// FIXME: Centralize feature selection, defaulting shouldn't be also in the
576// frontend target.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000577static void getAArch64FPUFeatures(const Driver &D, const Arg *A,
578 const ArgList &Args,
579 std::vector<const char *> &Features) {
580 StringRef FPU = A->getValue();
581 if (FPU == "fp-armv8") {
582 Features.push_back("+fp-armv8");
583 } else if (FPU == "neon-fp-armv8") {
584 Features.push_back("+fp-armv8");
585 Features.push_back("+neon");
586 } else if (FPU == "crypto-neon-fp-armv8") {
587 Features.push_back("+fp-armv8");
588 Features.push_back("+neon");
589 Features.push_back("+crypto");
590 } else if (FPU == "neon") {
591 Features.push_back("+neon");
592 } else if (FPU == "none") {
593 Features.push_back("-fp-armv8");
594 Features.push_back("-crypto");
595 Features.push_back("-neon");
596 } else
597 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
598}
599
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000600// Handle -mhwdiv=.
601static void getARMHWDivFeatures(const Driver &D, const Arg *A,
602 const ArgList &Args,
603 std::vector<const char *> &Features) {
604 StringRef HWDiv = A->getValue();
605 if (HWDiv == "arm") {
606 Features.push_back("+hwdiv-arm");
607 Features.push_back("-hwdiv");
608 } else if (HWDiv == "thumb") {
609 Features.push_back("-hwdiv-arm");
610 Features.push_back("+hwdiv");
611 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
612 Features.push_back("+hwdiv-arm");
613 Features.push_back("+hwdiv");
614 } else if (HWDiv == "none") {
615 Features.push_back("-hwdiv-arm");
616 Features.push_back("-hwdiv");
617 } else
618 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
619}
620
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000621// Handle -mfpu=.
622//
623// FIXME: Centralize feature selection, defaulting shouldn't be also in the
624// frontend target.
625static void getARMFPUFeatures(const Driver &D, const Arg *A,
626 const ArgList &Args,
627 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000628 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000629
630 // Set the target features based on the FPU.
631 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
632 // Disable any default FPU support.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000633 Features.push_back("-vfp2");
634 Features.push_back("-vfp3");
635 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000636 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000637 Features.push_back("+vfp3");
638 Features.push_back("+d16");
639 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000640 } else if (FPU == "vfp") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000641 Features.push_back("+vfp2");
642 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000643 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000644 Features.push_back("+vfp3");
645 Features.push_back("-neon");
Joey Gouly7db275b2013-06-27 13:19:54 +0000646 } else if (FPU == "fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000647 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000648 Features.push_back("-neon");
649 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000650 } else if (FPU == "neon-fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000651 Features.push_back("+fp-armv8");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000652 Features.push_back("+neon");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000653 Features.push_back("-crypto");
Amara Emersonfc362c62013-09-19 13:54:03 +0000654 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersonfc362c62013-09-19 13:54:03 +0000655 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000656 Features.push_back("+neon");
657 Features.push_back("+crypto");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000658 } else if (FPU == "neon") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000659 Features.push_back("+neon");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000660 } else if (FPU == "none") {
661 Features.push_back("-vfp2");
662 Features.push_back("-vfp3");
663 Features.push_back("-vfp4");
664 Features.push_back("-fp-armv8");
665 Features.push_back("-crypto");
666 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000667 } else
668 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
669}
670
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000671// Select the float ABI as determined by -msoft-float, -mhard-float, and
672// -mfloat-abi=.
673static StringRef getARMFloatABI(const Driver &D,
674 const ArgList &Args,
675 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000676 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000677 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
678 options::OPT_mhard_float,
679 options::OPT_mfloat_abi_EQ)) {
680 if (A->getOption().matches(options::OPT_msoft_float))
681 FloatABI = "soft";
682 else if (A->getOption().matches(options::OPT_mhard_float))
683 FloatABI = "hard";
684 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000685 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000686 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000687 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000688 << A->getAsString(Args);
689 FloatABI = "soft";
690 }
691 }
692 }
693
694 // If unspecified, choose the default based on the platform.
695 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000696 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000697 case llvm::Triple::Darwin:
698 case llvm::Triple::MacOSX:
699 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000700 // Darwin defaults to "softfp" for v6 and v7.
701 //
702 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000703 std::string ArchName =
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000704 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000705 if (StringRef(ArchName).startswith("v6") ||
706 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000707 FloatABI = "softfp";
708 else
709 FloatABI = "soft";
710 break;
711 }
712
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000713 case llvm::Triple::FreeBSD:
714 // FreeBSD defaults to soft float
715 FloatABI = "soft";
716 break;
717
Daniel Dunbar78485922009-09-10 23:00:09 +0000718 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000719 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000720 case llvm::Triple::GNUEABIHF:
721 FloatABI = "hard";
722 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000723 case llvm::Triple::GNUEABI:
724 FloatABI = "softfp";
725 break;
726 case llvm::Triple::EABI:
727 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
728 FloatABI = "softfp";
729 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000730 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000731 std::string ArchName =
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000732 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000733 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000734 FloatABI = "softfp";
735 else
736 FloatABI = "soft";
737 break;
738 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000739 default:
740 // Assume "soft", but warn the user we are guessing.
741 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000742 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000743 break;
744 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000745 }
746 }
747
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000748 return FloatABI;
749}
750
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000751static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
752 const ArgList &Args,
753 std::vector<const char *> &Features) {
754 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
755 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
756 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
757 // stripped out by the ARM target.
758 // Use software floating point operations?
759 if (FloatABI == "soft")
760 Features.push_back("+soft-float");
761
762 // Use software floating point argument passing?
763 if (FloatABI != "hard")
764 Features.push_back("+soft-float-abi");
765
766 // Honor -mfpu=.
767 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000768 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000769 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
770 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000771
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000772 // Setting -msoft-float effectively disables NEON because of the GCC
773 // implementation, although the same isn't true of VFP or VFP3.
774 if (FloatABI == "soft")
775 Features.push_back("-neon");
Bernard Ogden18b57012013-10-29 09:47:51 +0000776
777 // En/disable crc
778 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
779 options::OPT_mnocrc)) {
780 if (A->getOption().matches(options::OPT_mcrc))
781 Features.push_back("+crc");
782 else
783 Features.push_back("-crc");
784 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000785}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000786
787void Clang::AddARMTargetArgs(const ArgList &Args,
788 ArgStringList &CmdArgs,
789 bool KernelOrKext) const {
790 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000791 // Get the effective triple, which takes into account the deployment target.
792 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
793 llvm::Triple Triple(TripleStr);
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000794 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000795
796 // Select the ABI to use.
797 //
798 // FIXME: Support -meabi.
799 const char *ABIName = 0;
800 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000801 ABIName = A->getValue();
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000802 } else if (Triple.isOSDarwin()) {
803 // The backend is hardwired to assume AAPCS for M-class processors, ensure
804 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000805 if (Triple.getEnvironment() == llvm::Triple::EABI ||
806 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000807 ABIName = "aapcs";
808 } else {
809 ABIName = "apcs-gnu";
810 }
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000811 } else {
812 // Select the default based on the platform.
813 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000814 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000815 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000816 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000817 ABIName = "aapcs-linux";
818 break;
819 case llvm::Triple::EABI:
820 ABIName = "aapcs";
821 break;
822 default:
823 ABIName = "apcs-gnu";
824 }
825 }
826 CmdArgs.push_back("-target-abi");
827 CmdArgs.push_back(ABIName);
828
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000829 // Determine floating point ABI from the options & target defaults.
830 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000831 if (FloatABI == "soft") {
832 // Floating point operations and argument passing are soft.
833 //
834 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000835 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000836 CmdArgs.push_back("-mfloat-abi");
837 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000838 } else if (FloatABI == "softfp") {
839 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000840 CmdArgs.push_back("-mfloat-abi");
841 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000842 } else {
843 // Floating point operations and argument passing are hard.
844 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000845 CmdArgs.push_back("-mfloat-abi");
846 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000847 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000848
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000849 // Kernel code has more strict alignment requirements.
850 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000851 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000852 CmdArgs.push_back("-backend-option");
853 CmdArgs.push_back("-arm-long-calls");
854 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000855
Daniel Dunbar12100e22011-03-22 16:48:17 +0000856 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000857 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000858
859 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000860 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000861 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000862 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000863
864 // Setting -mno-global-merge disables the codegen global merge pass. Setting
865 // -mglobal-merge has no effect as the pass is enabled by default.
866 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
867 options::OPT_mno_global_merge)) {
868 if (A->getOption().matches(options::OPT_mno_global_merge))
869 CmdArgs.push_back("-mno-global-merge");
870 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000871
Bob Wilson9c8af452013-04-11 18:53:25 +0000872 if (!Args.hasFlag(options::OPT_mimplicit_float,
873 options::OPT_mno_implicit_float,
874 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000875 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000876
877 // llvm does not support reserving registers in general. There is support
878 // for reserving r9 on ARM though (defined as a platform-specific register
879 // in ARM EABI).
880 if (Args.hasArg(options::OPT_ffixed_r9)) {
881 CmdArgs.push_back("-backend-option");
882 CmdArgs.push_back("-arm-reserve-r9");
883 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000884}
885
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000886// Get CPU and ABI names. They are not independent
887// so we have to calculate them together.
888static void getMipsCPUAndABI(const ArgList &Args,
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000889 const llvm::Triple &Triple,
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000890 StringRef &CPUName,
891 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000892 const char *DefMips32CPU = "mips32";
893 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000894
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000895 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000896 options::OPT_mcpu_EQ))
897 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000898
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000899 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000900 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000901 // Convert a GNU style Mips ABI name to the name
902 // accepted by LLVM Mips backend.
903 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
904 .Case("32", "o32")
905 .Case("64", "n64")
906 .Default(ABIName);
907 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000908
909 // Setup default CPU and ABI names.
910 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000911 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000912 default:
913 llvm_unreachable("Unexpected triple arch name");
914 case llvm::Triple::mips:
915 case llvm::Triple::mipsel:
916 CPUName = DefMips32CPU;
917 break;
918 case llvm::Triple::mips64:
919 case llvm::Triple::mips64el:
920 CPUName = DefMips64CPU;
921 break;
922 }
923 }
924
925 if (!ABIName.empty()) {
926 // Deduce CPU name from ABI name.
927 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000928 .Cases("32", "o32", "eabi", DefMips32CPU)
929 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000930 .Default("");
931 }
932 else if (!CPUName.empty()) {
933 // Deduce ABI name from CPU name.
934 ABIName = llvm::StringSwitch<const char *>(CPUName)
935 .Cases("mips32", "mips32r2", "o32")
936 .Cases("mips64", "mips64r2", "n64")
937 .Default("");
938 }
939
940 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000941}
942
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000943// Convert ABI name to the GNU tools acceptable variant.
944static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
945 return llvm::StringSwitch<llvm::StringRef>(ABI)
946 .Case("o32", "32")
947 .Case("n64", "64")
948 .Default(ABI);
949}
950
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000951// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
952// and -mfloat-abi=.
953static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000954 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000955 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000956 options::OPT_mhard_float,
957 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000958 if (A->getOption().matches(options::OPT_msoft_float))
959 FloatABI = "soft";
960 else if (A->getOption().matches(options::OPT_mhard_float))
961 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000962 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000963 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +0000964 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000965 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000966 FloatABI = "hard";
967 }
968 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000969 }
970
971 // If unspecified, choose the default based on the platform.
972 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000973 // Assume "hard", because it's a default value used by gcc.
974 // When we start to recognize specific target MIPS processors,
975 // we will be able to select the default more correctly.
976 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000977 }
978
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000979 return FloatABI;
980}
981
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000982static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000983 std::vector<const char *> &Features,
984 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000985 StringRef FeatureName) {
986 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000987 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000988 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000989 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000990 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000991 }
992}
993
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000994static void getMIPSTargetFeatures(const Driver &D, const ArgList &Args,
995 std::vector<const char *> &Features) {
996 StringRef FloatABI = getMipsFloatABI(D, Args);
997 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
998 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
999 // FIXME: Note, this is a hack. We need to pass the selected float
1000 // mode to the MipsTargetInfoBase to define appropriate macros there.
1001 // Now it is the only method.
1002 Features.push_back("+soft-float");
1003 }
1004
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001005 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
1006 if (StringRef(A->getValue()) == "2008")
1007 Features.push_back("+nan2008");
1008 }
1009
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001010 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1011 options::OPT_mdouble_float, "single-float");
1012 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1013 "mips16");
1014 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1015 options::OPT_mno_micromips, "micromips");
1016 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1017 "dsp");
1018 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1019 "dspr2");
1020 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1021 "msa");
Daniel Sanders94694172013-10-17 14:55:58 +00001022 AddTargetFeature(Args, Features, options::OPT_mfp64, options::OPT_mfp32,
1023 "fp64");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001024}
1025
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001026void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001027 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001028 const Driver &D = getToolChain().getDriver();
1029 StringRef CPUName;
1030 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001031 const llvm::Triple &Triple = getToolChain().getTriple();
1032 getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001033
1034 CmdArgs.push_back("-target-abi");
1035 CmdArgs.push_back(ABIName.data());
1036
1037 StringRef FloatABI = getMipsFloatABI(D, Args);
1038
Simon Atanasyan81c423c2013-01-10 12:36:19 +00001039 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
1040
1041 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001042 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001043 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001044 CmdArgs.push_back("-mfloat-abi");
1045 CmdArgs.push_back("soft");
1046
Simon Atanasyan81c423c2013-01-10 12:36:19 +00001047 if (FloatABI == "hard" && IsMips16) {
1048 CmdArgs.push_back("-mllvm");
1049 CmdArgs.push_back("-mips16-hard-float");
1050 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001051 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001052 else {
1053 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001054 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001055 CmdArgs.push_back("-mfloat-abi");
1056 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001057 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001058
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001059 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1060 if (A->getOption().matches(options::OPT_mxgot)) {
1061 CmdArgs.push_back("-mllvm");
1062 CmdArgs.push_back("-mxgot");
1063 }
1064 }
1065
Simon Atanasyanc580b322013-05-11 06:33:44 +00001066 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1067 options::OPT_mno_ldc1_sdc1)) {
1068 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1069 CmdArgs.push_back("-mllvm");
1070 CmdArgs.push_back("-mno-ldc1-sdc1");
1071 }
1072 }
1073
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001074 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1075 options::OPT_mno_check_zero_division)) {
1076 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1077 CmdArgs.push_back("-mllvm");
1078 CmdArgs.push_back("-mno-check-zero-division");
1079 }
1080 }
1081
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001082 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001083 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001084 CmdArgs.push_back("-mllvm");
1085 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1086 A->claim();
1087 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001088}
1089
Hal Finkel8eb59282012-06-11 22:35:19 +00001090/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1091static std::string getPPCTargetCPU(const ArgList &Args) {
1092 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001093 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001094
1095 if (CPUName == "native") {
1096 std::string CPU = llvm::sys::getHostCPUName();
1097 if (!CPU.empty() && CPU != "generic")
1098 return CPU;
1099 else
1100 return "";
1101 }
1102
1103 return llvm::StringSwitch<const char *>(CPUName)
1104 .Case("common", "generic")
1105 .Case("440", "440")
1106 .Case("440fp", "440")
1107 .Case("450", "450")
1108 .Case("601", "601")
1109 .Case("602", "602")
1110 .Case("603", "603")
1111 .Case("603e", "603e")
1112 .Case("603ev", "603ev")
1113 .Case("604", "604")
1114 .Case("604e", "604e")
1115 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001116 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001117 .Case("G3", "g3")
1118 .Case("7400", "7400")
1119 .Case("G4", "g4")
1120 .Case("7450", "7450")
1121 .Case("G4+", "g4+")
1122 .Case("750", "750")
1123 .Case("970", "970")
1124 .Case("G5", "g5")
1125 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001126 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001127 .Case("e500mc", "e500mc")
1128 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001129 .Case("power3", "pwr3")
1130 .Case("power4", "pwr4")
1131 .Case("power5", "pwr5")
1132 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001133 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001134 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001135 .Case("power7", "pwr7")
Bill Schmidt38378a02013-02-01 20:23:10 +00001136 .Case("pwr3", "pwr3")
1137 .Case("pwr4", "pwr4")
1138 .Case("pwr5", "pwr5")
1139 .Case("pwr5x", "pwr5x")
1140 .Case("pwr6", "pwr6")
1141 .Case("pwr6x", "pwr6x")
1142 .Case("pwr7", "pwr7")
Hal Finkel8eb59282012-06-11 22:35:19 +00001143 .Case("powerpc", "ppc")
1144 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001145 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001146 .Default("");
1147 }
1148
1149 return "";
1150}
1151
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001152static void getPPCTargetFeatures(const ArgList &Args,
1153 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001154 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1155 ie = Args.filtered_end();
1156 it != ie; ++it) {
1157 StringRef Name = (*it)->getOption().getName();
1158 (*it)->claim();
1159
1160 // Skip over "-m".
1161 assert(Name.startswith("m") && "Invalid feature name.");
1162 Name = Name.substr(1);
1163
1164 bool IsNegative = Name.startswith("no-");
1165 if (IsNegative)
1166 Name = Name.substr(3);
1167
1168 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1169 // pass the correct option to the backend while calling the frontend
1170 // option the same.
1171 // TODO: Change the LLVM backend option maybe?
1172 if (Name == "mfcrf")
1173 Name = "mfocrf";
1174
1175 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1176 }
1177
1178 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001179 AddTargetFeature(Args, Features, options::OPT_faltivec,
1180 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001181}
1182
Tom Stellard6674c702013-04-01 20:56:53 +00001183/// Get the (LLVM) name of the R600 gpu we are targeting.
1184static std::string getR600TargetGPU(const ArgList &Args) {
1185 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001186 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001187 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001188 .Cases("rv630", "rv635", "r600")
1189 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001190 .Case("rv740", "rv770")
1191 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001192 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001193 .Case("hemlock", "cypress")
1194 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001195 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001196 }
1197 return "";
1198}
1199
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001200static void getSparcTargetFeatures(const ArgList &Args,
1201 std::vector<const char *> Features) {
1202 bool SoftFloatABI = true;
1203 if (Arg *A =
1204 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1205 if (A->getOption().matches(options::OPT_mhard_float))
1206 SoftFloatABI = false;
1207 }
1208 if (SoftFloatABI)
1209 Features.push_back("+soft-float");
1210}
1211
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001212void Clang::AddSparcTargetArgs(const ArgList &Args,
1213 ArgStringList &CmdArgs) const {
1214 const Driver &D = getToolChain().getDriver();
1215
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001216 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001217 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001218 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1219 options::OPT_mhard_float)) {
1220 if (A->getOption().matches(options::OPT_msoft_float))
1221 FloatABI = "soft";
1222 else if (A->getOption().matches(options::OPT_mhard_float))
1223 FloatABI = "hard";
1224 }
1225
1226 // If unspecified, choose the default based on the platform.
1227 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001228 // Assume "soft", but warn the user we are guessing.
1229 FloatABI = "soft";
1230 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001231 }
1232
1233 if (FloatABI == "soft") {
1234 // Floating point operations and argument passing are soft.
1235 //
1236 // FIXME: This changes CPP defines, we need -target-soft-float.
1237 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001238 } else {
1239 assert(FloatABI == "hard" && "Invalid float abi!");
1240 CmdArgs.push_back("-mhard-float");
1241 }
1242}
1243
Richard Sandiford4652d892013-07-19 16:51:51 +00001244static const char *getSystemZTargetCPU(const ArgList &Args) {
1245 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1246 return A->getValue();
1247 return "z10";
1248}
1249
Chandler Carruth953fb082013-01-13 11:46:33 +00001250static const char *getX86TargetCPU(const ArgList &Args,
1251 const llvm::Triple &Triple) {
1252 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1253 if (StringRef(A->getValue()) != "native")
1254 return A->getValue();
1255
1256 // FIXME: Reject attempts to use -march=native unless the target matches
1257 // the host.
1258 //
1259 // FIXME: We should also incorporate the detected target features for use
1260 // with -native.
1261 std::string CPU = llvm::sys::getHostCPUName();
1262 if (!CPU.empty() && CPU != "generic")
1263 return Args.MakeArgString(CPU);
1264 }
1265
1266 // Select the default CPU if none was given (or detection failed).
1267
1268 if (Triple.getArch() != llvm::Triple::x86_64 &&
1269 Triple.getArch() != llvm::Triple::x86)
1270 return 0; // This routine is only handling x86 targets.
1271
1272 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1273
1274 // FIXME: Need target hooks.
1275 if (Triple.isOSDarwin())
1276 return Is64Bit ? "core2" : "yonah";
1277
Chandler Carruth953fb082013-01-13 11:46:33 +00001278 // 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
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001283 // Everything else goes to x86-64 in 64-bit mode.
1284 if (Is64Bit)
1285 return "x86-64";
1286
1287 switch (Triple.getOS()) {
1288 case llvm::Triple::FreeBSD:
1289 case llvm::Triple::NetBSD:
1290 case llvm::Triple::OpenBSD:
1291 return "i486";
1292 case llvm::Triple::Haiku:
1293 return "i586";
1294 case llvm::Triple::Bitrig:
1295 return "i686";
1296 default:
1297 // Fallback to p4.
1298 return "pentium4";
1299 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001300}
1301
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001302static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1303 switch(T.getArch()) {
1304 default:
1305 return "";
1306
1307 case llvm::Triple::arm:
1308 case llvm::Triple::thumb:
1309 return getARMTargetCPU(Args, T);
1310
1311 case llvm::Triple::mips:
1312 case llvm::Triple::mipsel:
1313 case llvm::Triple::mips64:
1314 case llvm::Triple::mips64el: {
1315 StringRef CPUName;
1316 StringRef ABIName;
1317 getMipsCPUAndABI(Args, T, CPUName, ABIName);
1318 return CPUName;
1319 }
1320
1321 case llvm::Triple::ppc:
1322 case llvm::Triple::ppc64:
1323 case llvm::Triple::ppc64le: {
1324 std::string TargetCPUName = getPPCTargetCPU(Args);
1325 // LLVM may default to generating code for the native CPU,
1326 // but, like gcc, we default to a more generic option for
1327 // each architecture. (except on Darwin)
1328 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1329 if (T.getArch() == llvm::Triple::ppc64)
1330 TargetCPUName = "ppc64";
1331 else if (T.getArch() == llvm::Triple::ppc64le)
1332 TargetCPUName = "ppc64le";
1333 else
1334 TargetCPUName = "ppc";
1335 }
1336 return TargetCPUName;
1337 }
1338
1339 case llvm::Triple::sparc:
1340 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1341 return A->getValue();
1342 return "";
1343
1344 case llvm::Triple::x86:
1345 case llvm::Triple::x86_64:
1346 return getX86TargetCPU(Args, T);
1347
1348 case llvm::Triple::hexagon:
1349 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1350
1351 case llvm::Triple::systemz:
1352 return getSystemZTargetCPU(Args);
1353
1354 case llvm::Triple::r600:
1355 return getR600TargetGPU(Args);
1356 }
1357}
1358
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001359static void getX86TargetFeatures(const ArgList &Args,
1360 std::vector<const char *> &Features) {
1361 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1362 ie = Args.filtered_end();
1363 it != ie; ++it) {
1364 StringRef Name = (*it)->getOption().getName();
1365 (*it)->claim();
1366
1367 // Skip over "-m".
1368 assert(Name.startswith("m") && "Invalid feature name.");
1369 Name = Name.substr(1);
1370
1371 bool IsNegative = Name.startswith("no-");
1372 if (IsNegative)
1373 Name = Name.substr(3);
1374
1375 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1376 }
1377}
1378
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001379void Clang::AddX86TargetArgs(const ArgList &Args,
1380 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001381 if (!Args.hasFlag(options::OPT_mred_zone,
1382 options::OPT_mno_red_zone,
1383 true) ||
1384 Args.hasArg(options::OPT_mkernel) ||
1385 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001386 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001387
Bob Wilson2616e2e2013-02-10 16:01:41 +00001388 // Default to avoid implicit floating-point for kernel/kext code, but allow
1389 // that to be overridden with -mno-soft-float.
1390 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1391 Args.hasArg(options::OPT_fapple_kext));
1392 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1393 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001394 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001395 options::OPT_mno_implicit_float)) {
1396 const Option &O = A->getOption();
1397 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1398 O.matches(options::OPT_msoft_float));
1399 }
1400 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001401 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001402}
1403
Matthew Curtise8f80a12012-12-06 17:49:03 +00001404static inline bool HasPICArg(const ArgList &Args) {
1405 return Args.hasArg(options::OPT_fPIC)
1406 || Args.hasArg(options::OPT_fpic);
1407}
1408
1409static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1410 return Args.getLastArg(options::OPT_G,
1411 options::OPT_G_EQ,
1412 options::OPT_msmall_data_threshold_EQ);
1413}
1414
1415static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1416 std::string value;
1417 if (HasPICArg(Args))
1418 value = "0";
1419 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1420 value = A->getValue();
1421 A->claim();
1422 }
1423 return value;
1424}
1425
Tony Linthicum76329bf2011-12-12 21:14:55 +00001426void Clang::AddHexagonTargetArgs(const ArgList &Args,
1427 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001428 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001429 CmdArgs.push_back("-mqdsp6-compat");
1430 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001431
Matthew Curtise8f80a12012-12-06 17:49:03 +00001432 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1433 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001434 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001435 CmdArgs.push_back(Args.MakeArgString(
1436 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001437 }
1438
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001439 if (!Args.hasArg(options::OPT_fno_short_enums))
1440 CmdArgs.push_back("-fshort-enums");
1441 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1442 CmdArgs.push_back ("-mllvm");
1443 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1444 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001445 CmdArgs.push_back ("-mllvm");
1446 CmdArgs.push_back ("-machine-sink-split=0");
1447}
1448
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001449static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1450 std::vector<const char *> &Features) {
Tim Northover2fe823a2013-08-01 09:23:19 +00001451 // Honor -mfpu=.
1452 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +00001453 getAArch64FPUFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001454}
1455
1456static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1457 const ArgList &Args, ArgStringList &CmdArgs) {
1458 std::vector<const char *> Features;
1459 switch (Triple.getArch()) {
1460 default:
1461 break;
1462 case llvm::Triple::mips:
1463 case llvm::Triple::mipsel:
1464 case llvm::Triple::mips64:
1465 case llvm::Triple::mips64el:
1466 getMIPSTargetFeatures(D, Args, Features);
1467 break;
1468
1469 case llvm::Triple::arm:
1470 case llvm::Triple::thumb:
1471 getARMTargetFeatures(D, Triple, Args, Features);
1472 break;
1473
1474 case llvm::Triple::ppc:
1475 case llvm::Triple::ppc64:
1476 case llvm::Triple::ppc64le:
1477 getPPCTargetFeatures(Args, Features);
1478 break;
1479 case llvm::Triple::sparc:
1480 getSparcTargetFeatures(Args, Features);
1481 break;
1482 case llvm::Triple::aarch64:
1483 getAArch64TargetFeatures(D, Args, Features);
1484 break;
1485 case llvm::Triple::x86:
1486 case llvm::Triple::x86_64:
1487 getX86TargetFeatures(Args, Features);
1488 break;
1489 }
Rafael Espindola43964802013-08-21 17:34:32 +00001490
1491 // Find the last of each feature.
1492 llvm::StringMap<unsigned> LastOpt;
1493 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1494 const char *Name = Features[I];
1495 assert(Name[0] == '-' || Name[0] == '+');
1496 LastOpt[Name + 1] = I;
1497 }
1498
1499 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1500 // If this feature was overridden, ignore it.
1501 const char *Name = Features[I];
1502 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1503 assert(LastI != LastOpt.end());
1504 unsigned Last = LastI->second;
1505 if (Last != I)
1506 continue;
1507
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001508 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001509 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001510 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001511}
1512
Eric Christopher84fbdb42011-08-19 00:30:14 +00001513static bool
John McCall5fb5df92012-06-20 06:18:46 +00001514shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001515 const llvm::Triple &Triple) {
1516 // We use the zero-cost exception tables for Objective-C if the non-fragile
1517 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1518 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001519 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001520 return true;
1521
Bob Wilson6524dd32011-10-14 05:03:44 +00001522 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001523 return false;
1524
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001525 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001526 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001527 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001528}
1529
Anders Carlssone96ab552011-02-28 02:27:16 +00001530/// addExceptionArgs - Adds exception related arguments to the driver command
1531/// arguments. There's a master flag, -fexceptions and also language specific
1532/// flags to enable/disable C++ and Objective-C exceptions.
1533/// This makes it possible to for example disable C++ exceptions but enable
1534/// Objective-C exceptions.
1535static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1536 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001537 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001538 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001539 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001540 if (KernelOrKext) {
1541 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1542 // arguments now to avoid warnings about unused arguments.
1543 Args.ClaimAllArgs(options::OPT_fexceptions);
1544 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1545 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1546 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1547 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1548 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001549 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001550 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001551
1552 // Exceptions are enabled by default.
1553 bool ExceptionsEnabled = true;
1554
1555 // This keeps track of whether exceptions were explicitly turned on or off.
1556 bool DidHaveExplicitExceptionFlag = false;
1557
Rafael Espindola00a66572009-10-01 13:33:33 +00001558 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1559 options::OPT_fno_exceptions)) {
1560 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001561 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001562 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001563 ExceptionsEnabled = false;
1564
1565 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001566 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001567
Anders Carlssone96ab552011-02-28 02:27:16 +00001568 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001569
Anders Carlssone96ab552011-02-28 02:27:16 +00001570 // Exception tables and cleanups can be enabled with -fexceptions even if the
1571 // language itself doesn't support exceptions.
1572 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1573 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001574
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001575 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1576 // is not necessarily sensible, but follows GCC.
1577 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001578 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001579 options::OPT_fno_objc_exceptions,
1580 true)) {
1581 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001582
Eric Christopher84fbdb42011-08-19 00:30:14 +00001583 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001584 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001585 }
1586
1587 if (types::isCXX(InputType)) {
1588 bool CXXExceptionsEnabled = ExceptionsEnabled;
1589
Eric Christopher84fbdb42011-08-19 00:30:14 +00001590 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1591 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001592 options::OPT_fexceptions,
1593 options::OPT_fno_exceptions)) {
1594 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1595 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001596 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001597 CXXExceptionsEnabled = false;
1598 }
1599
1600 if (CXXExceptionsEnabled) {
1601 CmdArgs.push_back("-fcxx-exceptions");
1602
1603 ShouldUseExceptionTables = true;
1604 }
1605 }
1606
1607 if (ShouldUseExceptionTables)
1608 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001609}
1610
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001611static bool ShouldDisableAutolink(const ArgList &Args,
1612 const ToolChain &TC) {
1613 bool Default = true;
1614 if (TC.getTriple().isOSDarwin()) {
1615 // The native darwin assembler doesn't support the linker_option directives,
1616 // so we disable them if we think the .s file will be passed to it.
1617 Default = TC.useIntegratedAs();
1618 }
1619 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1620 Default);
1621}
1622
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001623static bool ShouldDisableCFI(const ArgList &Args,
1624 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001625 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001626 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001627 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001628 // we disable them if we think the .s file will be passed to it.
Rafael Espindola84b588b2013-03-18 18:10:27 +00001629 Default = TC.useIntegratedAs();
Rafael Espindolaf934f982011-05-17 16:26:17 +00001630 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001631 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher45f2e712012-12-18 00:31:10 +00001632 options::OPT_fno_dwarf2_cfi_asm,
1633 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001634}
1635
Ted Kremenek62093662013-03-12 17:02:12 +00001636static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1637 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001638 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1639 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001640 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001641 return !UseDwarfDirectory;
1642}
1643
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001644/// \brief Check whether the given input tree contains any compilation actions.
1645static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001646 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001647 return true;
1648
1649 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1650 if (ContainsCompileAction(*it))
1651 return true;
1652
1653 return false;
1654}
1655
1656/// \brief Check if -relax-all should be passed to the internal assembler.
1657/// This is done by default when compiling non-assembler source with -O0.
1658static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1659 bool RelaxDefault = true;
1660
1661 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1662 RelaxDefault = A->getOption().matches(options::OPT_O0);
1663
1664 if (RelaxDefault) {
1665 RelaxDefault = false;
1666 for (ActionList::const_iterator it = C.getActions().begin(),
1667 ie = C.getActions().end(); it != ie; ++it) {
1668 if (ContainsCompileAction(*it)) {
1669 RelaxDefault = true;
1670 break;
1671 }
1672 }
1673 }
1674
1675 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1676 RelaxDefault);
1677}
1678
David Blaikie9260ed62013-07-25 21:19:01 +00001679static void CollectArgsForIntegratedAssembler(Compilation &C,
1680 const ArgList &Args,
1681 ArgStringList &CmdArgs,
1682 const Driver &D) {
1683 if (UseRelaxAll(C, Args))
1684 CmdArgs.push_back("-mrelax-all");
1685
1686 // When using an integrated assembler, translate -Wa, and -Xassembler
1687 // options.
1688 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1689 options::OPT_Xassembler),
1690 ie = Args.filtered_end(); it != ie; ++it) {
1691 const Arg *A = *it;
1692 A->claim();
1693
1694 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1695 StringRef Value = A->getValue(i);
1696
1697 if (Value == "-force_cpusubtype_ALL") {
1698 // Do nothing, this is the default and we don't support anything else.
1699 } else if (Value == "-L") {
1700 CmdArgs.push_back("-msave-temp-labels");
1701 } else if (Value == "--fatal-warnings") {
1702 CmdArgs.push_back("-mllvm");
1703 CmdArgs.push_back("-fatal-assembler-warnings");
1704 } else if (Value == "--noexecstack") {
1705 CmdArgs.push_back("-mnoexecstack");
1706 } else {
1707 D.Diag(diag::err_drv_unsupported_option_argument)
1708 << A->getOption().getName() << Value;
1709 }
1710 }
1711 }
1712}
1713
Chandler Carruth36381702013-06-23 11:28:48 +00001714static void addProfileRTLinux(
1715 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1716 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1717 Args.hasArg(options::OPT_fprofile_generate) ||
1718 Args.hasArg(options::OPT_fcreate_profile) ||
1719 Args.hasArg(options::OPT_coverage)))
1720 return;
1721
1722 // The profile runtime is located in the Linux library directory and has name
1723 // "libclang_rt.profile-<ArchName>.a".
1724 SmallString<128> LibProfile(TC.getDriver().ResourceDir);
1725 llvm::sys::path::append(
1726 LibProfile, "lib", "linux",
1727 Twine("libclang_rt.profile-") + TC.getArchName() + ".a");
1728
1729 CmdArgs.push_back(Args.MakeArgString(LibProfile));
1730}
1731
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001732static void addSanitizerRTLinkFlagsLinux(
1733 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smithf3e624c2013-03-23 00:30:08 +00001734 const StringRef Sanitizer, bool BeforeLibStdCXX,
1735 bool ExportSymbols = true) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001736 // Sanitizer runtime is located in the Linux library directory and
1737 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1738 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1739 llvm::sys::path::append(
1740 LibSanitizer, "lib", "linux",
1741 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
Richard Smithcff3cde2013-03-20 23:49:07 +00001742
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001743 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1744 // etc.) so that the linker picks custom versions of the global 'operator
1745 // new' and 'operator delete' symbols. We take the extreme (but simple)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001746 // strategy of inserting it at the front of the link command. It also
1747 // needs to be forced to end up in the executable, so wrap it in
1748 // whole-archive.
Richard Smithcff3cde2013-03-20 23:49:07 +00001749 SmallVector<const char *, 3> LibSanitizerArgs;
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001750 LibSanitizerArgs.push_back("-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001751 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001752 LibSanitizerArgs.push_back("-no-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001753
1754 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1755 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1756
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001757 CmdArgs.push_back("-lpthread");
Evgeniy Stepanov758b5072013-05-24 14:28:03 +00001758 CmdArgs.push_back("-lrt");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001759 CmdArgs.push_back("-ldl");
Richard Smithf3e624c2013-03-23 00:30:08 +00001760
1761 // If possible, use a dynamic symbols file to export the symbols from the
1762 // runtime library. If we can't do so, use -export-dynamic instead to export
1763 // all symbols from the binary.
1764 if (ExportSymbols) {
1765 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1766 CmdArgs.push_back(
1767 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1768 else
1769 CmdArgs.push_back("-export-dynamic");
1770 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001771}
1772
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001773/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1774/// This needs to be called before we add the C run-time (malloc, etc).
1775static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001776 ArgStringList &CmdArgs) {
Nick Lewycky609dd662013-10-11 03:33:53 +00001777 if (TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001778 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1779 llvm::sys::path::append(LibAsan, "lib", "linux",
1780 (Twine("libclang_rt.asan-") +
1781 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay35439df2012-12-04 21:18:26 +00001782 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001783 } else {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001784 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001785 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001786 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001787}
1788
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001789/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1790/// This needs to be called before we add the C run-time (malloc, etc).
1791static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1792 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001793 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001794 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001795}
1796
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001797/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1798/// This needs to be called before we add the C run-time (malloc, etc).
1799static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1800 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001801 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001802 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001803}
1804
1805/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
1806/// This needs to be called before we add the C run-time (malloc, etc).
1807static void addLsanRTLinux(const ToolChain &TC, const ArgList &Args,
1808 ArgStringList &CmdArgs) {
1809 if (!Args.hasArg(options::OPT_shared))
1810 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001811}
1812
Richard Smithe30752c2012-10-09 19:52:38 +00001813/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1814/// (Linux).
1815static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
Richard Smithcff3cde2013-03-20 23:49:07 +00001816 ArgStringList &CmdArgs, bool IsCXX,
1817 bool HasOtherSanitizerRt) {
Nick Lewycky24921692013-10-19 00:27:23 +00001818 // Need a copy of sanitizer_common. This could come from another sanitizer
1819 // runtime; if we're not including one, include our own copy.
1820 if (!HasOtherSanitizerRt)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001821 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
1822
1823 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
1824
1825 // Only include the bits of the runtime which need a C++ ABI library if
1826 // we're linking in C++ mode.
1827 if (IsCXX)
1828 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smithe30752c2012-10-09 19:52:38 +00001829}
1830
Peter Collingbournec3772752013-08-07 22:47:34 +00001831static void addDfsanRTLinux(const ToolChain &TC, const ArgList &Args,
1832 ArgStringList &CmdArgs) {
1833 if (!Args.hasArg(options::OPT_shared))
1834 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "dfsan", true);
1835}
1836
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001837static bool shouldUseFramePointerForTarget(const ArgList &Args,
1838 const llvm::Triple &Triple) {
1839 switch (Triple.getArch()) {
1840 // Don't use a frame pointer on linux if optimizing for certain targets.
1841 case llvm::Triple::mips64:
1842 case llvm::Triple::mips64el:
1843 case llvm::Triple::mips:
1844 case llvm::Triple::mipsel:
1845 case llvm::Triple::systemz:
1846 case llvm::Triple::x86:
1847 case llvm::Triple::x86_64:
1848 if (Triple.isOSLinux())
1849 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1850 if (!A->getOption().matches(options::OPT_O0))
1851 return false;
1852 return true;
1853 case llvm::Triple::xcore:
1854 return false;
1855 default:
1856 return true;
1857 }
1858}
1859
Rafael Espindola224dd632011-12-14 21:02:23 +00001860static bool shouldUseFramePointer(const ArgList &Args,
1861 const llvm::Triple &Triple) {
1862 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1863 options::OPT_fomit_frame_pointer))
1864 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1865
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001866 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00001867}
1868
Eric Christopherb7d97e92013-04-03 01:58:53 +00001869static bool shouldUseLeafFramePointer(const ArgList &Args,
1870 const llvm::Triple &Triple) {
1871 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1872 options::OPT_momit_leaf_frame_pointer))
1873 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1874
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001875 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00001876}
1877
Rafael Espindolac7367ff2013-08-10 01:40:10 +00001878/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001879static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00001880 SmallString<128> cwd;
1881 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00001882 CmdArgs.push_back("-fdebug-compilation-dir");
1883 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001884 }
1885}
1886
Eric Christopherd3804002013-02-22 20:12:52 +00001887static const char *SplitDebugName(const ArgList &Args,
1888 const InputInfoList &Inputs) {
1889 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1890 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1891 SmallString<128> T(FinalOutput->getValue());
1892 llvm::sys::path::replace_extension(T, "dwo");
1893 return Args.MakeArgString(T);
1894 } else {
1895 // Use the compilation dir.
1896 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1897 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1898 llvm::sys::path::replace_extension(F, "dwo");
1899 T += F;
1900 return Args.MakeArgString(F);
1901 }
1902}
1903
1904static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1905 const Tool &T, const JobAction &JA,
1906 const ArgList &Args, const InputInfo &Output,
1907 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00001908 ArgStringList ExtractArgs;
1909 ExtractArgs.push_back("--extract-dwo");
1910
1911 ArgStringList StripArgs;
1912 StripArgs.push_back("--strip-dwo");
1913
1914 // Grabbing the output of the earlier compile step.
1915 StripArgs.push_back(Output.getFilename());
1916 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00001917 ExtractArgs.push_back(OutFile);
1918
1919 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00001920 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00001921
1922 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00001923 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001924
1925 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00001926 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001927}
1928
Chad Rosierb71f6aa2013-04-24 18:09:54 +00001929static bool isOptimizationLevelFast(const ArgList &Args) {
1930 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1931 if (A->getOption().matches(options::OPT_Ofast))
1932 return true;
1933 return false;
1934}
1935
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001936/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
1937static bool shouldEnableVectorizerAtOLevel(const ArgList &Args) {
1938 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00001939 if (A->getOption().matches(options::OPT_O4) ||
1940 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001941 return true;
1942
1943 if (A->getOption().matches(options::OPT_O0))
1944 return false;
1945
1946 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
1947
Rafael Espindola91780de2013-08-26 14:05:41 +00001948 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001949 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00001950 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001951 return true;
1952
1953 // Don't vectorize -Oz.
1954 if (S == "z")
1955 return false;
1956
1957 unsigned OptLevel = 0;
1958 if (S.getAsInteger(10, OptLevel))
1959 return false;
1960
1961 return OptLevel > 1;
1962 }
1963
1964 return false;
1965}
1966
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001967void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001968 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001969 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001970 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001971 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001972 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1973 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001974 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001975 ArgStringList CmdArgs;
1976
Daniel Dunbare521a892009-03-31 20:53:55 +00001977 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1978
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001979 // Invoke ourselves in -cc1 mode.
1980 //
1981 // FIXME: Implement custom jobs for internal actions.
1982 CmdArgs.push_back("-cc1");
1983
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001984 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001985 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001986 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001987 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001988
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001989 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001990 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001991
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001992 if (isa<AnalyzeJobAction>(JA)) {
1993 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1994 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001995 } else if (isa<MigrateJobAction>(JA)) {
1996 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001997 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001998 if (Output.getType() == types::TY_Dependencies)
1999 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002000 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002001 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002002 if (Args.hasArg(options::OPT_rewrite_objc) &&
2003 !Args.hasArg(options::OPT_g_Group))
2004 CmdArgs.push_back("-P");
2005 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002006 } else if (isa<AssembleJobAction>(JA)) {
2007 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002008
David Blaikie9260ed62013-07-25 21:19:01 +00002009 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002010
2011 // Also ignore explicit -force_cpusubtype_ALL option.
2012 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002013 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002014 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002015 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002016
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002017 if (JA.getType() == types::TY_Nothing)
2018 CmdArgs.push_back("-fsyntax-only");
2019 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002020 CmdArgs.push_back("-emit-pch");
2021 else
2022 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002023 } else {
2024 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002025
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002026 if (JA.getType() == types::TY_Nothing) {
2027 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002028 } else if (JA.getType() == types::TY_LLVM_IR ||
2029 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002030 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002031 } else if (JA.getType() == types::TY_LLVM_BC ||
2032 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002033 CmdArgs.push_back("-emit-llvm-bc");
2034 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002035 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002036 } else if (JA.getType() == types::TY_AST) {
2037 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002038 } else if (JA.getType() == types::TY_ModuleFile) {
2039 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002040 } else if (JA.getType() == types::TY_RewrittenObjC) {
2041 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002042 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002043 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2044 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002045 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002046 } else {
2047 assert(JA.getType() == types::TY_PP_Asm &&
2048 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002049 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002050 }
2051
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002052 // The make clang go fast button.
2053 CmdArgs.push_back("-disable-free");
2054
John McCallbb79b5f2010-02-13 03:50:24 +00002055 // Disable the verification pass in -asserts builds.
2056#ifdef NDEBUG
2057 CmdArgs.push_back("-disable-llvm-verifier");
2058#endif
2059
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002060 // Set the main file name, so that debug info works even with
2061 // -save-temps.
2062 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002063 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002064
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002065 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002066 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002067 if (Args.hasArg(options::OPT_static))
2068 CmdArgs.push_back("-static-define");
2069
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002070 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002071 // Enable region store model by default.
2072 CmdArgs.push_back("-analyzer-store=region");
2073
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002074 // Treat blocks as analysis entry points.
2075 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2076
Ted Kremenek49c79792011-03-24 00:28:47 +00002077 CmdArgs.push_back("-analyzer-eagerly-assume");
2078
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002079 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002080 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002081 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002082
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002083 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
2084 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002085
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002086 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002087 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002088
2089 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002090
Jordan Rose10ad0812013-04-05 17:55:07 +00002091 if (types::isCXX(Inputs[0].getType()))
2092 CmdArgs.push_back("-analyzer-checker=cplusplus");
2093
Ted Kremenek37e96522012-01-26 02:27:38 +00002094 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00002095 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2096 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2097 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2098 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2099 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2100 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002101 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002102
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002103 // Set the output format. The default is plist, for (lame) historical
2104 // reasons.
2105 CmdArgs.push_back("-analyzer-output");
2106 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002107 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002108 else
2109 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002110
Ted Kremenekfe449a22010-03-22 22:32:05 +00002111 // Disable the presentation of standard compiler warnings when
2112 // using --analyze. We only want to show static analyzer diagnostics
2113 // or frontend errors.
2114 CmdArgs.push_back("-w");
2115
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002116 // Add -Xanalyzer arguments when running as analyzer.
2117 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002118 }
2119
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002120 CheckCodeGenerationOptions(D, Args);
2121
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002122 bool PIE = getToolChain().isPIEDefault();
2123 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002124 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002125
Alexey Samsonov090301e2013-04-09 12:28:19 +00002126 // For the PIC and PIE flag options, this logic is different from the
2127 // legacy logic in very old versions of GCC, as that logic was just
2128 // a bug no one had ever fixed. This logic is both more rational and
2129 // consistent with GCC's new logic now that the bugs are fixed. The last
2130 // argument relating to either PIC or PIE wins, and no other argument is
2131 // used. If the last argument is any flavor of the '-fno-...' arguments,
2132 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2133 // at the same level.
2134 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2135 options::OPT_fpic, options::OPT_fno_pic,
2136 options::OPT_fPIE, options::OPT_fno_PIE,
2137 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002138 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2139 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002140 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002141 if (LastPICArg) {
2142 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002143 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2144 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2145 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2146 PIC = PIE || O.matches(options::OPT_fPIC) ||
2147 O.matches(options::OPT_fpic);
2148 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2149 O.matches(options::OPT_fPIC);
2150 } else {
2151 PIE = PIC = false;
2152 }
2153 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002154 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002155
Nick Lewycky609dd662013-10-11 03:33:53 +00002156 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002157 // specified while enabling PIC enabled level 1 PIC, just force it back to
2158 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2159 // informal testing).
2160 if (PIC && getToolChain().getTriple().isOSDarwin())
2161 IsPICLevelTwo |= getToolChain().isPICDefault();
2162
Chandler Carruthc0c04552012-04-08 16:40:35 +00002163 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2164 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002165 llvm::Triple Triple(TripleStr);
Eric Christopher8d56caa2013-02-18 01:16:37 +00002166 if (KernelOrKext &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002167 (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002168 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002169 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002170 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002171
Chandler Carruth76a943b2012-11-19 03:52:03 +00002172 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2173 // This is a very special mode. It trumps the other modes, almost no one
2174 // uses it, and it isn't even valid on any OS but Darwin.
2175 if (!getToolChain().getTriple().isOSDarwin())
2176 D.Diag(diag::err_drv_unsupported_opt_for_target)
2177 << A->getSpelling() << getToolChain().getTriple().str();
2178
2179 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2180
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002181 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002182 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002183
Chandler Carruth76a943b2012-11-19 03:52:03 +00002184 // Only a forced PIC mode can cause the actual compile to have PIC defines
2185 // etc., no flags are sufficient. This behavior was selected to closely
2186 // match that of llvm-gcc and Apple GCC before that.
2187 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2188 CmdArgs.push_back("-pic-level");
2189 CmdArgs.push_back("2");
2190 }
2191 } else {
2192 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2193 // handled in Clang's IRGen by the -pie-level flag.
2194 CmdArgs.push_back("-mrelocation-model");
2195 CmdArgs.push_back(PIC ? "pic" : "static");
2196
2197 if (PIC) {
2198 CmdArgs.push_back("-pic-level");
2199 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2200 if (PIE) {
2201 CmdArgs.push_back("-pie-level");
2202 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2203 }
2204 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002205 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002206
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002207 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2208 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002209 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002210
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002211 // LLVM Code Generator Options.
2212
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002213 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2214 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002215 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002216 }
2217
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002218 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2219 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002220 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002221 D.Diag(diag::err_drv_unsupported_opt_for_target)
2222 << A->getSpelling() << getToolChain().getTriple().str();
2223 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2224 CmdArgs.push_back("-fpcc-struct-return");
2225 } else {
2226 assert(A->getOption().matches(options::OPT_freg_struct_return));
2227 CmdArgs.push_back("-freg-struct-return");
2228 }
2229 }
2230
Roman Divacky65b88cd2011-03-01 17:40:53 +00002231 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2232 CmdArgs.push_back("-mrtd");
2233
Rafael Espindola224dd632011-12-14 21:02:23 +00002234 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002235 CmdArgs.push_back("-mdisable-fp-elim");
2236 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2237 options::OPT_fno_zero_initialized_in_bss))
2238 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002239
2240 bool OFastEnabled = isOptimizationLevelFast(Args);
2241 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2242 // enabled. This alias option is being used to simplify the hasFlag logic.
2243 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2244 options::OPT_fstrict_aliasing;
2245 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00002246 options::OPT_fno_strict_aliasing,
2247 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00002248 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002249 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2250 options::OPT_fno_struct_path_tbaa))
2251 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002252 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2253 false))
2254 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002255 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2256 options::OPT_fno_optimize_sibling_calls))
2257 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002258
Eric Christopher006208c2013-04-04 06:29:47 +00002259 // Handle segmented stacks.
2260 if (Args.hasArg(options::OPT_fsplit_stack))
2261 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002262
2263 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2264 // This alias option is being used to simplify the getLastArg logic.
2265 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2266 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002267
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002268 // Handle various floating point optimization flags, mapping them to the
2269 // appropriate LLVM code generation flags. The pattern for all of these is to
2270 // default off the codegen optimizations, and if any flag enables them and no
2271 // flag disables them after the flag enabling them, enable the codegen
2272 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002273 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002274 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002275 options::OPT_ffinite_math_only,
2276 options::OPT_fno_finite_math_only,
2277 options::OPT_fhonor_infinities,
2278 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002279 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2280 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002281 A->getOption().getID() != options::OPT_fhonor_infinities)
2282 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002283 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002284 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002285 options::OPT_ffinite_math_only,
2286 options::OPT_fno_finite_math_only,
2287 options::OPT_fhonor_nans,
2288 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002289 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2290 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002291 A->getOption().getID() != options::OPT_fhonor_nans)
2292 CmdArgs.push_back("-menable-no-nans");
2293
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002294 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2295 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002296 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002297 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002298 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002299 options::OPT_fno_math_errno)) {
2300 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2301 // However, turning *off* -ffast_math merely restores the toolchain default
2302 // (which may be false).
2303 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2304 A->getOption().getID() == options::OPT_ffast_math ||
2305 A->getOption().getID() == options::OPT_Ofast)
2306 MathErrno = false;
2307 else if (A->getOption().getID() == options::OPT_fmath_errno)
2308 MathErrno = true;
2309 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002310 if (MathErrno)
2311 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002312
2313 // There are several flags which require disabling very specific
2314 // optimizations. Any of these being disabled forces us to turn off the
2315 // entire set of LLVM optimizations, so collect them through all the flag
2316 // madness.
2317 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002318 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002319 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002320 options::OPT_funsafe_math_optimizations,
2321 options::OPT_fno_unsafe_math_optimizations,
2322 options::OPT_fassociative_math,
2323 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002324 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2325 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002326 A->getOption().getID() != options::OPT_fno_associative_math)
2327 AssociativeMath = true;
2328 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002329 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002330 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002331 options::OPT_funsafe_math_optimizations,
2332 options::OPT_fno_unsafe_math_optimizations,
2333 options::OPT_freciprocal_math,
2334 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002335 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2336 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002337 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2338 ReciprocalMath = true;
2339 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002340 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002341 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002342 options::OPT_funsafe_math_optimizations,
2343 options::OPT_fno_unsafe_math_optimizations,
2344 options::OPT_fsigned_zeros,
2345 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002346 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2347 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002348 A->getOption().getID() != options::OPT_fsigned_zeros)
2349 SignedZeros = false;
2350 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002351 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002352 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002353 options::OPT_funsafe_math_optimizations,
2354 options::OPT_fno_unsafe_math_optimizations,
2355 options::OPT_ftrapping_math,
2356 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002357 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2358 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002359 A->getOption().getID() != options::OPT_ftrapping_math)
2360 TrappingMath = false;
2361 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2362 !TrappingMath)
2363 CmdArgs.push_back("-menable-unsafe-fp-math");
2364
Lang Hamesaa53b932012-07-06 00:59:19 +00002365
2366 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002367 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002368 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002369 options::OPT_ffp_contract)) {
2370 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002371 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002372 if (Val == "fast" || Val == "on" || Val == "off") {
2373 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2374 } else {
2375 D.Diag(diag::err_drv_unsupported_option_argument)
2376 << A->getOption().getName() << Val;
2377 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002378 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2379 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002380 // If fast-math is set then set the fp-contract mode to fast.
2381 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2382 }
2383 }
2384
Bob Wilson6a039162012-07-19 03:52:53 +00002385 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2386 // and if we find them, tell the frontend to provide the appropriate
2387 // preprocessor macros. This is distinct from enabling any optimizations as
2388 // these options induce language changes which must survive serialization
2389 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002390 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2391 options::OPT_fno_fast_math))
2392 if (!A->getOption().matches(options::OPT_fno_fast_math))
2393 CmdArgs.push_back("-ffast-math");
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002394 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2395 if (A->getOption().matches(options::OPT_ffinite_math_only))
2396 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002397
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002398 // Decide whether to use verbose asm. Verbose assembly is the default on
2399 // toolchains which have the integrated assembler on by default.
2400 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2401 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002402 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002403 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002404 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002405
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002406 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2407 CmdArgs.push_back("-mdebug-pass");
2408 CmdArgs.push_back("Structure");
2409 }
2410 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2411 CmdArgs.push_back("-mdebug-pass");
2412 CmdArgs.push_back("Arguments");
2413 }
2414
John McCall8517abc2010-02-19 02:45:38 +00002415 // Enable -mconstructor-aliases except on darwin, where we have to
2416 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002417 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002418 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002419
John McCall7ef5cb32011-03-18 02:56:14 +00002420 // Darwin's kernel doesn't support guard variables; just die if we
2421 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002422 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002423 CmdArgs.push_back("-fforbid-guard-variables");
2424
Douglas Gregordbe39272011-02-01 15:15:22 +00002425 if (Args.hasArg(options::OPT_mms_bitfields)) {
2426 CmdArgs.push_back("-mms-bitfields");
2427 }
John McCall8517abc2010-02-19 02:45:38 +00002428
Daniel Dunbar306945d2009-09-16 06:17:29 +00002429 // This is a coarse approximation of what llvm-gcc actually does, both
2430 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2431 // complicated ways.
2432 bool AsynchronousUnwindTables =
2433 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2434 options::OPT_fno_asynchronous_unwind_tables,
2435 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002436 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002437 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2438 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002439 CmdArgs.push_back("-munwind-tables");
2440
Chandler Carruth05fb5852012-11-21 23:40:23 +00002441 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002442
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002443 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2444 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002445 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002446 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002447
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002448 // FIXME: Handle -mtune=.
2449 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002450
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002451 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002452 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002453 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002454 }
2455
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002456 // Add the target cpu
2457 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2458 llvm::Triple ETriple(ETripleStr);
2459 std::string CPU = getCPUName(Args, ETriple);
2460 if (!CPU.empty()) {
2461 CmdArgs.push_back("-target-cpu");
2462 CmdArgs.push_back(Args.MakeArgString(CPU));
2463 }
2464
Rafael Espindolaeb265472013-08-21 21:59:03 +00002465 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2466 CmdArgs.push_back("-mfpmath");
2467 CmdArgs.push_back(A->getValue());
2468 }
2469
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002470 // Add the target features
2471 getTargetFeatures(D, ETriple, Args, CmdArgs);
2472
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002473 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002474 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002475 default:
2476 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002477
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002478 case llvm::Triple::arm:
2479 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002480 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002481 break;
2482
Eric Christopher0b26a612010-03-02 02:41:08 +00002483 case llvm::Triple::mips:
2484 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002485 case llvm::Triple::mips64:
2486 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002487 AddMIPSTargetArgs(Args, CmdArgs);
2488 break;
2489
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002490 case llvm::Triple::sparc:
2491 AddSparcTargetArgs(Args, CmdArgs);
2492 break;
2493
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002494 case llvm::Triple::x86:
2495 case llvm::Triple::x86_64:
2496 AddX86TargetArgs(Args, CmdArgs);
2497 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002498
2499 case llvm::Triple::hexagon:
2500 AddHexagonTargetArgs(Args, CmdArgs);
2501 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002502 }
2503
Hans Wennborg75958c42013-08-08 00:17:41 +00002504 // Add clang-cl arguments.
2505 if (getToolChain().getDriver().IsCLMode())
2506 AddClangCLArgs(Args, CmdArgs);
2507
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002508 // Pass the linker version in use.
2509 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2510 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002511 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002512 }
2513
Eric Christopherb7d97e92013-04-03 01:58:53 +00002514 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002515 CmdArgs.push_back("-momit-leaf-frame-pointer");
2516
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002517 // Explicitly error on some things we know we don't support and can't just
2518 // ignore.
2519 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002520 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2521 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002522 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002523 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002524 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002525 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2526 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002527 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002528 << Unsupported->getOption().getName();
2529 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002530 }
2531
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002532 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002533 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002534 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002535 CmdArgs.push_back("-header-include-file");
2536 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2537 D.CCPrintHeadersFilename : "-");
2538 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002539 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002540 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002541
Chad Rosierbe10f982011-08-02 17:58:04 +00002542 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002543 CmdArgs.push_back("-diagnostic-log-file");
2544 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2545 D.CCLogDiagnosticsFilename : "-");
2546 }
2547
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002548 // Use the last option from "-g" group. "-gline-tables-only"
2549 // is preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002550 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002551 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002552 if (A->getOption().matches(options::OPT_gline_tables_only))
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002553 CmdArgs.push_back("-gline-tables-only");
Manman Ren9691f7f2013-06-19 01:46:49 +00002554 else if (A->getOption().matches(options::OPT_gdwarf_2))
2555 CmdArgs.push_back("-gdwarf-2");
2556 else if (A->getOption().matches(options::OPT_gdwarf_3))
2557 CmdArgs.push_back("-gdwarf-3");
2558 else if (A->getOption().matches(options::OPT_gdwarf_4))
2559 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002560 else if (!A->getOption().matches(options::OPT_g0) &&
Manman Ren38db0922013-07-02 23:15:25 +00002561 !A->getOption().matches(options::OPT_ggdb0)) {
2562 // Default is dwarf-2 for darwin.
2563 if (getToolChain().getTriple().isOSDarwin())
2564 CmdArgs.push_back("-gdwarf-2");
2565 else
2566 CmdArgs.push_back("-g");
2567 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002568 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002569
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002570 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2571 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002572 if (Args.hasArg(options::OPT_gcolumn_info))
2573 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002574
Eric Christopher138c32b2013-09-13 22:37:55 +00002575 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002576 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2577 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00002578 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002579 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00002580 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002581 CmdArgs.push_back("-g");
2582 CmdArgs.push_back("-backend-option");
2583 CmdArgs.push_back("-split-dwarf=Enable");
2584 }
2585
Eric Christopher138c32b2013-09-13 22:37:55 +00002586 // -ggnu-pubnames turns on gnu style pubnames in the backend.
2587 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2588 CmdArgs.push_back("-backend-option");
2589 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2590 }
Eric Christophereec89c22013-06-18 00:03:50 +00002591
2592 Args.AddAllArgs(CmdArgs, options::OPT_fdebug_types_section);
2593
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002594 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2595 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2596
Chris Lattner3c77a352010-06-22 00:03:40 +00002597 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2598
Nick Lewycky207bce32011-04-21 23:44:07 +00002599 if (Args.hasArg(options::OPT_ftest_coverage) ||
2600 Args.hasArg(options::OPT_coverage))
2601 CmdArgs.push_back("-femit-coverage-notes");
2602 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2603 Args.hasArg(options::OPT_coverage))
2604 CmdArgs.push_back("-femit-coverage-data");
2605
Nick Lewycky480cb992011-05-04 20:46:58 +00002606 if (C.getArgs().hasArg(options::OPT_c) ||
2607 C.getArgs().hasArg(options::OPT_S)) {
2608 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002609 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00002610 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00002611 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002612 SmallString<128> Pwd;
2613 if (!llvm::sys::fs::current_path(Pwd)) {
2614 llvm::sys::path::append(Pwd, CoverageFilename.str());
2615 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00002616 }
2617 }
Eric Christophere30f61c2013-02-22 00:24:40 +00002618 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002619 }
2620 }
2621
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002622 // Pass options for controlling the default header search paths.
2623 if (Args.hasArg(options::OPT_nostdinc)) {
2624 CmdArgs.push_back("-nostdsysteminc");
2625 CmdArgs.push_back("-nobuiltininc");
2626 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002627 if (Args.hasArg(options::OPT_nostdlibinc))
2628 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002629 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2630 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2631 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002632
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002633 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002634 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002635 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002636
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002637 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2638
Ted Kremenekf7639e12012-03-06 20:06:33 +00002639 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00002640 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002641 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002642 options::OPT_ccc_arcmt_modify,
2643 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002644 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002645 switch (A->getOption().getID()) {
2646 default:
2647 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002648 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002649 CmdArgs.push_back("-arcmt-check");
2650 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002651 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002652 CmdArgs.push_back("-arcmt-modify");
2653 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002654 case options::OPT_ccc_arcmt_migrate:
2655 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002656 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002657 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002658
2659 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2660 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002661 break;
John McCalld70fb982011-06-15 23:25:17 +00002662 }
2663 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00002664 } else {
2665 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2666 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2667 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00002668 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002669
Ted Kremenekf7639e12012-03-06 20:06:33 +00002670 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2671 if (ARCMTEnabled) {
2672 D.Diag(diag::err_drv_argument_not_allowed_with)
2673 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2674 }
2675 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002676 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002677
2678 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002679 options::OPT_objcmt_migrate_subscripting,
2680 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002681 // None specified, means enable them all.
2682 CmdArgs.push_back("-objcmt-migrate-literals");
2683 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002684 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002685 } else {
2686 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2687 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002688 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00002689 }
2690 }
2691
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002692 // Add preprocessing options like -I, -D, etc. if we are using the
2693 // preprocessor.
2694 //
2695 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002696 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00002697 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002698
Rafael Espindolaa7431922011-07-21 23:40:37 +00002699 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2700 // that "The compiler can only warn and ignore the option if not recognized".
2701 // When building with ccache, it will pass -D options to clang even on
2702 // preprocessed inputs and configure concludes that -fPIC is not supported.
2703 Args.ClaimAllArgs(options::OPT_D);
2704
Rafael Espindolaad70d962013-08-27 16:58:15 +00002705 // Manually translate -O4 to -O3; let clang reject others.
2706 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2707 if (A->getOption().matches(options::OPT_O4)) {
2708 CmdArgs.push_back("-O3");
2709 D.Diag(diag::warn_O4_is_O3);
2710 } else {
2711 A->render(Args, CmdArgs);
2712 }
2713 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002714
Chad Rosier86b82082012-12-12 20:06:31 +00002715 // Don't warn about unused -flto. This can happen when we're preprocessing or
2716 // precompiling.
2717 Args.ClaimAllArgs(options::OPT_flto);
2718
Daniel Dunbar945577c2009-10-29 02:24:45 +00002719 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002720 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2721 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002722 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002723 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002724
2725 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00002726 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002727 //
2728 // If a std is supplied, only add -trigraphs if it follows the
2729 // option.
2730 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2731 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002732 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002733 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002734 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002735 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002736 else
2737 Std->render(Args, CmdArgs);
2738
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002739 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2740 options::OPT_trigraphs))
2741 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002742 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002743 } else {
2744 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002745 //
2746 // FIXME: Clang doesn't correctly handle -std= when the input language
2747 // doesn't match. For the time being just ignore this for C++ inputs;
2748 // eventually we want to do all the standard defaulting here instead of
2749 // splitting it between the driver and clang -cc1.
2750 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002751 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2752 "-std=", /*Joined=*/true);
2753 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2754 CmdArgs.push_back("-std=c++11");
2755
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002756 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002757 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002758
Richard Smith282b4492013-09-04 22:50:31 +00002759 // GCC's behavior for -Wwrite-strings is a bit strange:
2760 // * In C, this "warning flag" changes the types of string literals from
2761 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
2762 // for the discarded qualifier.
2763 // * In C++, this is just a normal warning flag.
2764 //
2765 // Implementing this warning correctly in C is hard, so we follow GCC's
2766 // behavior for now. FIXME: Directly diagnose uses of a string literal as
2767 // a non-const char* in C, rather than using this crude hack.
2768 if (!types::isCXX(InputType)) {
2769 // FIXME: This should behave just like a warning flag, and thus should also
2770 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
2771 Arg *WriteStrings =
2772 Args.getLastArg(options::OPT_Wwrite_strings,
2773 options::OPT_Wno_write_strings, options::OPT_w);
2774 if (WriteStrings &&
2775 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
2776 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00002777 }
2778
Chandler Carruth61fbf622011-04-23 09:27:53 +00002779 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002780 // during C++ compilation, which it is by default. GCC keeps this define even
2781 // in the presence of '-w', match this behavior bug-for-bug.
2782 if (types::isCXX(InputType) &&
2783 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2784 true)) {
2785 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002786 }
2787
Chandler Carruthe0391482010-05-22 02:21:53 +00002788 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2789 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2790 if (Asm->getOption().matches(options::OPT_fasm))
2791 CmdArgs.push_back("-fgnu-keywords");
2792 else
2793 CmdArgs.push_back("-fno-gnu-keywords");
2794 }
2795
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002796 if (ShouldDisableCFI(Args, getToolChain()))
2797 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002798
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002799 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2800 CmdArgs.push_back("-fno-dwarf-directory-asm");
2801
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002802 if (ShouldDisableAutolink(Args, getToolChain()))
2803 CmdArgs.push_back("-fno-autolink");
2804
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002805 // Add in -fdebug-compilation-dir if necessary.
2806 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00002807
Richard Smith9a568822011-11-21 19:36:32 +00002808 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2809 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002810 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002811 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002812 }
2813
Richard Smith9a568822011-11-21 19:36:32 +00002814 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2815 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002816 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00002817 }
2818
Richard Smitha3d3bd22013-05-08 02:12:03 +00002819 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
2820 CmdArgs.push_back("-fconstexpr-steps");
2821 CmdArgs.push_back(A->getValue());
2822 }
2823
Richard Smithb3a14522013-02-22 01:59:51 +00002824 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2825 CmdArgs.push_back("-fbracket-depth");
2826 CmdArgs.push_back(A->getValue());
2827 }
2828
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002829 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2830 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002831 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002832 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002833 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2834 } else
2835 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002836 }
2837
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002838
Michael J. Spencer929fccd2012-10-22 22:13:48 +00002839 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002840 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002841
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002842 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2843 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00002844 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002845 }
David Chisnall5778fce2009-08-31 16:41:57 +00002846
Chris Lattnere23003d2010-01-09 21:54:33 +00002847 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2848 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00002849 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00002850 }
2851
Chris Lattnerb35583d2010-04-07 20:49:23 +00002852 CmdArgs.push_back("-ferror-limit");
2853 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00002854 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00002855 else
2856 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002857
Chandler Carrutha77a7272010-05-06 04:55:18 +00002858 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2859 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002860 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002861 }
2862
2863 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2864 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002865 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002866 }
2867
Richard Smithf6f003a2011-12-16 19:06:07 +00002868 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2869 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002870 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00002871 }
2872
Daniel Dunbar2c978472009-11-04 06:24:47 +00002873 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002874 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002875 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002876 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00002877 } else {
2878 // If -fmessage-length=N was not specified, determine whether this is a
2879 // terminal and, if so, implicitly define -fmessage-length appropriately.
2880 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002881 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002882 }
2883
John McCallb4a99d32013-02-19 01:57:35 +00002884 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2885 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2886 options::OPT_fvisibility_ms_compat)) {
2887 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2888 CmdArgs.push_back("-fvisibility");
2889 CmdArgs.push_back(A->getValue());
2890 } else {
2891 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2892 CmdArgs.push_back("-fvisibility");
2893 CmdArgs.push_back("hidden");
2894 CmdArgs.push_back("-ftype-visibility");
2895 CmdArgs.push_back("default");
2896 }
Daniel Dunbare357d562009-12-03 18:42:11 +00002897 }
2898
Douglas Gregor08329632010-06-15 17:05:35 +00002899 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002900
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002901 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2902
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002903 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002904 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2905 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002906 CmdArgs.push_back("-ffreestanding");
2907
Daniel Dunbare357d562009-12-03 18:42:11 +00002908 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002909 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002910 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002911 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002912 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002913 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00002914 // AltiVec language extensions aren't relevant for assembling.
2915 if (!isa<PreprocessJobAction>(JA) ||
2916 Output.getType() != types::TY_PP_Asm)
2917 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002918 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2919 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002920
Alexey Samsonov609213f92013-08-19 09:14:21 +00002921 const SanitizerArgs &Sanitize = D.getOrParseSanitizerArgs(Args);
Alexey Samsonove6203662013-08-09 07:42:13 +00002922 Sanitize.addArgs(getToolChain(), Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00002923
Will Dietz3676d562012-12-30 20:53:28 +00002924 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2925 options::OPT_fno_sanitize_recover,
2926 true))
2927 CmdArgs.push_back("-fno-sanitize-recover");
2928
Chad Rosierae229d52013-01-29 23:31:22 +00002929 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2930 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2931 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2932 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2933
Eric Christopher459d2712013-02-19 06:16:53 +00002934 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00002935 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002936 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00002937 getToolChain().getArch() == llvm::Triple::ppc64 ||
2938 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00002939 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00002940 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00002941
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002942 if (getToolChain().SupportsProfiling())
2943 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002944
2945 // -flax-vector-conversions is default.
2946 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2947 options::OPT_fno_lax_vector_conversions))
2948 CmdArgs.push_back("-fno-lax-vector-conversions");
2949
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002950 if (Args.getLastArg(options::OPT_fapple_kext))
2951 CmdArgs.push_back("-fapple-kext");
2952
David Blaikie690f21e2012-06-14 18:55:27 +00002953 if (Args.hasFlag(options::OPT_frewrite_includes,
2954 options::OPT_fno_rewrite_includes, false))
2955 CmdArgs.push_back("-frewrite-includes");
2956
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002957 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002958 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002959 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002960 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2961 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002962
2963 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2964 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00002965 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00002966 }
2967
Bob Wilson14adb362012-02-03 06:27:22 +00002968 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002969
Chandler Carruth6e501032011-03-27 00:04:55 +00002970 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2971 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2972 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2973 options::OPT_fno_wrapv)) {
2974 if (A->getOption().matches(options::OPT_fwrapv))
2975 CmdArgs.push_back("-fwrapv");
2976 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2977 options::OPT_fno_strict_overflow)) {
2978 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2979 CmdArgs.push_back("-fwrapv");
2980 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002981 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00002982 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
2983 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002984
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002985 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2986
Mahesha S6a682be42012-10-27 07:47:56 +00002987
Daniel Dunbar4930e332009-11-17 08:07:36 +00002988 // -stack-protector=0 is default.
2989 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002990 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2991 options::OPT_fstack_protector_all,
2992 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002993 if (A->getOption().matches(options::OPT_fstack_protector))
2994 StackProtectorLevel = 1;
2995 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2996 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002997 } else {
2998 StackProtectorLevel =
2999 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3000 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003001 if (StackProtectorLevel) {
3002 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003003 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003004 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003005
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003006 // --param ssp-buffer-size=
3007 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3008 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003009 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003010 if (Str.startswith("ssp-buffer-size=")) {
3011 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003012 CmdArgs.push_back("-stack-protector-buffer-size");
3013 // FIXME: Verify the argument is a valid integer.
3014 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003015 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003016 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003017 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003018 }
3019
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003020 // Translate -mstackrealign
3021 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3022 false)) {
3023 CmdArgs.push_back("-backend-option");
3024 CmdArgs.push_back("-force-align-stack");
3025 }
3026 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3027 false)) {
3028 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3029 }
3030
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003031 if (Args.hasArg(options::OPT_mstack_alignment)) {
3032 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3033 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003034 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00003035 // -mkernel implies -mstrict-align; don't add the redundant option.
Renato Golina146a482013-08-24 14:44:41 +00003036 if (!KernelOrKext) {
Renato Golin8d5f3142013-08-28 23:56:07 +00003037 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3038 options::OPT_munaligned_access)) {
3039 if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3040 CmdArgs.push_back("-backend-option");
3041 CmdArgs.push_back("-arm-strict-align");
3042 } else {
3043 CmdArgs.push_back("-backend-option");
3044 CmdArgs.push_back("-arm-no-strict-align");
3045 }
Renato Golina146a482013-08-24 14:44:41 +00003046 }
Chad Rosier60027022012-11-09 17:29:19 +00003047 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003048
Daniel Dunbard18049a2009-04-07 21:16:11 +00003049 // Forward -f options with positive and negative forms; we translate
3050 // these by hand.
3051
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003052 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003053 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003054 CmdArgs.push_back("-fapple-kext");
3055 if (!Args.hasArg(options::OPT_fbuiltin))
3056 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003057 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003058 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003059 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003060 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003061 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003062
Nuno Lopes13c88c72009-12-16 16:59:22 +00003063 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3064 options::OPT_fno_assume_sane_operator_new))
3065 CmdArgs.push_back("-fno-assume-sane-operator-new");
3066
Daniel Dunbar4930e332009-11-17 08:07:36 +00003067 // -fblocks=0 is default.
3068 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003069 getToolChain().IsBlocksDefault()) ||
3070 (Args.hasArg(options::OPT_fgnu_runtime) &&
3071 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3072 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003073 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003074
3075 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3076 !getToolChain().hasBlocksRuntime())
3077 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003078 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003079
Douglas Gregor226173a2012-01-18 15:19:58 +00003080 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3081 // users must also pass -fcxx-modules. The latter flag will disappear once the
3082 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003083 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003084 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3085 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3086 options::OPT_fno_cxx_modules,
3087 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003088 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003089 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003090 HaveModules = true;
3091 }
3092 }
3093
Daniel Jasper07e6c402013-08-05 20:26:17 +00003094 // -fmodule-maps enables module map processing (off by default) for header
3095 // checking. It is implied by -fmodules.
3096 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3097 false)) {
3098 CmdArgs.push_back("-fmodule-maps");
3099 }
3100
Daniel Jasperac42b752013-10-21 06:34:34 +00003101 // -fmodules-decluse checks that modules used are declared so (off by
3102 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003103 if (Args.hasFlag(options::OPT_fmodules_decluse,
3104 options::OPT_fno_modules_decluse,
3105 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003106 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003107 }
3108
Daniel Jasperac42b752013-10-21 06:34:34 +00003109 // -fmodule-name specifies the module that is currently being built (or
3110 // used for header checking by -fmodule-maps).
3111 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name)) {
3112 A->claim();
3113 A->render(Args, CmdArgs);
3114 }
3115
3116 // -fmodule-map-file can be used to specify a file containing module
3117 // definitions.
3118 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file)) {
3119 A->claim();
3120 A->render(Args, CmdArgs);
3121 }
3122
Douglas Gregor35b04d62013-02-07 19:01:24 +00003123 // If a module path was provided, pass it along. Otherwise, use a temporary
3124 // directory.
3125 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3126 A->claim();
3127 if (HaveModules) {
3128 A->render(Args, CmdArgs);
3129 }
3130 } else if (HaveModules) {
3131 SmallString<128> DefaultModuleCache;
3132 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3133 DefaultModuleCache);
Douglas Gregor23c7d672013-03-21 21:48:48 +00003134 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3135 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor4bedb492013-02-07 22:59:12 +00003136 const char Arg[] = "-fmodules-cache-path=";
3137 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3138 Arg, Arg + strlen(Arg));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003139 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3140 }
3141
3142 // Pass through all -fmodules-ignore-macro arguments.
3143 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003144 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3145 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003146
John McCalldfea9982010-04-09 19:12:06 +00003147 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003148 if (Args.hasFlag(options::OPT_fno_access_control,
3149 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003150 false))
John McCall3155f572010-04-09 19:03:51 +00003151 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003152
Anders Carlssond470fef2010-11-21 00:09:52 +00003153 // -felide-constructors is the default.
3154 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3155 options::OPT_felide_constructors,
3156 false))
3157 CmdArgs.push_back("-fno-elide-constructors");
3158
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003159 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003160 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00003161 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00003162 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00003163
Richard Smith52be6192012-11-05 22:04:41 +00003164 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003165 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00003166 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00003167 Args.getLastArg(options::OPT_mkernel,
3168 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00003169 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00003170 D.Diag(diag::err_drv_argument_not_allowed_with)
3171 << "-fsanitize=vptr" << NoRttiArg;
3172 }
3173 }
3174
Tony Linthicum76329bf2011-12-12 21:14:55 +00003175 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003176 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003177 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003178 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00003179 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003180 CmdArgs.push_back("-fshort-enums");
3181
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003182 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003183 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003184 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00003185 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00003186
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003187 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003188 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003189 options::OPT_fno_threadsafe_statics))
3190 CmdArgs.push_back("-fno-threadsafe-statics");
3191
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003192 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003193 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3194 options::OPT_fno_use_cxa_atexit,
3195 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00003196 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003197 getToolChain().getArch() != llvm::Triple::hexagon) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00003198 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003199 CmdArgs.push_back("-fno-use-cxa-atexit");
3200
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003201 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003202 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003203 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3204 CmdArgs.push_back("-fms-extensions");
3205
Francois Pichet1b4f1632011-09-17 04:32:15 +00003206 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003207 if (Args.hasFlag(options::OPT_fms_compatibility,
3208 options::OPT_fno_ms_compatibility,
3209 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3210 Args.hasFlag(options::OPT_fms_extensions,
3211 options::OPT_fno_ms_extensions,
3212 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003213 CmdArgs.push_back("-fms-compatibility");
3214
Reid Klecknerc106fda2013-09-18 00:33:59 +00003215 // -fmsc-version=1700 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003216 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3217 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3218 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003219 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003220 if (msc_ver.empty())
Reid Klecknerc106fda2013-09-18 00:33:59 +00003221 CmdArgs.push_back("-fmsc-version=1700");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003222 else
3223 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3224 }
3225
3226
Eric Christopher5ecce122013-02-18 00:38:31 +00003227 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00003228 if (Args.hasFlag(options::OPT_fborland_extensions,
3229 options::OPT_fno_borland_extensions, false))
3230 CmdArgs.push_back("-fborland-extensions");
3231
Francois Pichet02744872011-09-01 16:38:08 +00003232 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3233 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003234 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3235 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00003236 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003237 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003238
Chandler Carruthe03aa552010-04-17 20:17:31 +00003239 // -fgnu-keywords default varies depending on language; only pass if
3240 // specified.
3241 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003242 options::OPT_fno_gnu_keywords))
3243 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00003244
Rafael Espindola922a6242011-06-02 17:30:53 +00003245 if (Args.hasFlag(options::OPT_fgnu89_inline,
3246 options::OPT_fno_gnu89_inline,
3247 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00003248 CmdArgs.push_back("-fgnu89-inline");
3249
Chad Rosier9c76d242012-03-15 22:31:42 +00003250 if (Args.hasArg(options::OPT_fno_inline))
3251 CmdArgs.push_back("-fno-inline");
3252
Chad Rosier64d6be92012-03-06 21:17:19 +00003253 if (Args.hasArg(options::OPT_fno_inline_functions))
3254 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00003255
John McCall5fb5df92012-06-20 06:18:46 +00003256 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00003257
John McCall5fb5df92012-06-20 06:18:46 +00003258 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahaniandaf48312013-10-15 17:16:30 +00003259 // legacy is the default. Next runtime is always legacy dispatch and
3260 // -fno-objc-legacy-dispatch gets ignored silently.
3261 if (objcRuntime.isNonFragile() && !objcRuntime.isNeXTFamily()) {
David Chisnall3154e682011-09-30 13:32:35 +00003262 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3263 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00003264 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003265 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00003266 if (getToolChain().UseObjCMixedDispatch())
3267 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3268 else
3269 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3270 }
3271 }
3272
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00003273 // -fencode-extended-block-signature=1 is default.
3274 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3275 CmdArgs.push_back("-fencode-extended-block-signature");
3276 }
3277
John McCall24fc0de2011-07-06 00:26:06 +00003278 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3279 // NOTE: This logic is duplicated in ToolChains.cpp.
3280 bool ARC = isObjCAutoRefCount(Args);
3281 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00003282 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00003283
John McCall24fc0de2011-07-06 00:26:06 +00003284 CmdArgs.push_back("-fobjc-arc");
3285
Chandler Carruth491db322011-11-04 07:34:47 +00003286 // FIXME: It seems like this entire block, and several around it should be
3287 // wrapped in isObjC, but for now we just use it here as this is where it
3288 // was being used previously.
3289 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3290 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3291 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3292 else
3293 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3294 }
3295
John McCall24fc0de2011-07-06 00:26:06 +00003296 // Allow the user to enable full exceptions code emission.
3297 // We define off for Objective-CC, on for Objective-C++.
3298 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3299 options::OPT_fno_objc_arc_exceptions,
3300 /*default*/ types::isCXX(InputType)))
3301 CmdArgs.push_back("-fobjc-arc-exceptions");
3302 }
3303
3304 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3305 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00003306 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00003307 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003308
John McCall24fc0de2011-07-06 00:26:06 +00003309 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3310 // takes precedence.
3311 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3312 if (!GCArg)
3313 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3314 if (GCArg) {
3315 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003316 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00003317 << GCArg->getAsString(Args);
3318 } else if (getToolChain().SupportsObjCGC()) {
3319 GCArg->render(Args, CmdArgs);
3320 } else {
3321 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003322 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00003323 << GCArg->getAsString(Args);
3324 }
3325 }
3326
John McCallb5f652e2011-06-22 00:53:57 +00003327 // Add exception args.
3328 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00003329 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00003330
3331 if (getToolChain().UseSjLjExceptions())
3332 CmdArgs.push_back("-fsjlj-exceptions");
3333
3334 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00003335 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3336 options::OPT_fno_assume_sane_operator_new))
3337 CmdArgs.push_back("-fno-assume-sane-operator-new");
3338
Daniel Dunbar34d7a992010-04-27 15:34:57 +00003339 // -fconstant-cfstrings is default, and may be subject to argument translation
3340 // on Darwin.
3341 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3342 options::OPT_fno_constant_cfstrings) ||
3343 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3344 options::OPT_mno_constant_cfstrings))
3345 CmdArgs.push_back("-fno-constant-cfstrings");
3346
John Thompsoned4e2952009-11-05 20:14:16 +00003347 // -fshort-wchar default varies depending on platform; only
3348 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00003349 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3350 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00003351
Hans Wennborg28c96312013-07-31 23:39:13 +00003352 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003353 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003354 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003355 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003356 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003357
Daniel Dunbar096ed292011-10-05 21:04:55 +00003358 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3359 // -fno-pack-struct doesn't apply to -fpack-struct=.
3360 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00003361 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00003362 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00003363 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00003364 } else if (Args.hasFlag(options::OPT_fpack_struct,
3365 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00003366 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00003367 }
3368
Robert Lytton0e076492013-08-13 09:43:10 +00003369 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003370 if (!Args.hasArg(options::OPT_fcommon))
3371 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00003372 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003373 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00003374
Daniel Dunbard18049a2009-04-07 21:16:11 +00003375 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003376 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003377 CmdArgs.push_back("-fno-common");
3378
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003379 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00003380 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00003381 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003382 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003383 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003384 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3385
Daniel Dunbar6358d682010-10-15 22:30:42 +00003386 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3387 if (!Args.hasFlag(options::OPT_ffor_scope,
3388 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003389 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00003390 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3391
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00003392 // -fcaret-diagnostics is default.
3393 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3394 options::OPT_fno_caret_diagnostics, true))
3395 CmdArgs.push_back("-fno-caret-diagnostics");
3396
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003397 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00003398 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003399 options::OPT_fno_diagnostics_fixit_info))
3400 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003401
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003402 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00003403 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003404 options::OPT_fno_diagnostics_show_option))
3405 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003406
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003407 if (const Arg *A =
3408 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3409 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00003410 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003411 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003412
Douglas Gregor643c9222011-05-21 17:07:29 +00003413 if (const Arg *A =
3414 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3415 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003416 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003417 }
3418
Chandler Carruthb6766f02011-03-27 01:50:55 +00003419 if (Arg *A = Args.getLastArg(
3420 options::OPT_fdiagnostics_show_note_include_stack,
3421 options::OPT_fno_diagnostics_show_note_include_stack)) {
3422 if (A->getOption().matches(
3423 options::OPT_fdiagnostics_show_note_include_stack))
3424 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3425 else
3426 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3427 }
3428
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003429 // Color diagnostics are the default, unless the terminal doesn't support
3430 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00003431 // Support both clang's -f[no-]color-diagnostics and gcc's
3432 // -f[no-]diagnostics-colors[=never|always|auto].
3433 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3434 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3435 it != ie; ++it) {
3436 const Option &O = (*it)->getOption();
3437 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3438 !O.matches(options::OPT_fdiagnostics_color) &&
3439 !O.matches(options::OPT_fno_color_diagnostics) &&
3440 !O.matches(options::OPT_fno_diagnostics_color) &&
3441 !O.matches(options::OPT_fdiagnostics_color_EQ))
3442 continue;
3443
3444 (*it)->claim();
3445 if (O.matches(options::OPT_fcolor_diagnostics) ||
3446 O.matches(options::OPT_fdiagnostics_color)) {
3447 ShowColors = Colors_On;
3448 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3449 O.matches(options::OPT_fno_diagnostics_color)) {
3450 ShowColors = Colors_Off;
3451 } else {
3452 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3453 StringRef value((*it)->getValue());
3454 if (value == "always")
3455 ShowColors = Colors_On;
3456 else if (value == "never")
3457 ShowColors = Colors_Off;
3458 else if (value == "auto")
3459 ShowColors = Colors_Auto;
3460 else
3461 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3462 << ("-fdiagnostics-color=" + value).str();
3463 }
3464 }
3465 if (ShowColors == Colors_On ||
3466 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003467 CmdArgs.push_back("-fcolor-diagnostics");
3468
Nico Rieck7857d462013-09-11 00:38:02 +00003469 if (Args.hasArg(options::OPT_fansi_escape_codes))
3470 CmdArgs.push_back("-fansi-escape-codes");
3471
Daniel Dunbardb097022009-06-08 21:13:54 +00003472 if (!Args.hasFlag(options::OPT_fshow_source_location,
3473 options::OPT_fno_show_source_location))
3474 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003475
Douglas Gregor643c9222011-05-21 17:07:29 +00003476 if (!Args.hasFlag(options::OPT_fshow_column,
3477 options::OPT_fno_show_column,
3478 true))
3479 CmdArgs.push_back("-fno-show-column");
3480
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00003481 if (!Args.hasFlag(options::OPT_fspell_checking,
3482 options::OPT_fno_spell_checking))
3483 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003484
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003485
Chad Rosierc8e56e82012-12-05 21:08:21 +00003486 // -fno-asm-blocks is default.
3487 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3488 false))
3489 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003490
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003491 // Enable vectorization per default according to the optimization level
3492 // selected. For optimization levels that want vectorization we use the alias
3493 // option to simplify the hasFlag logic.
3494 bool EnableVec = shouldEnableVectorizerAtOLevel(Args);
3495 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00003496 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00003497 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00003498 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003499 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003500
Rafael Espindolaf818ef42013-08-01 23:56:42 +00003501 // -fslp-vectorize is default.
3502 if (Args.hasFlag(options::OPT_fslp_vectorize,
3503 options::OPT_fno_slp_vectorize, true))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00003504 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00003505
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003506 // -fno-slp-vectorize-aggressive is default.
3507 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003508 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003509 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003510
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00003511 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3512 A->render(Args, CmdArgs);
3513
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003514 // -fdollars-in-identifiers default varies depending on platform and
3515 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00003516 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003517 options::OPT_fno_dollars_in_identifiers)) {
3518 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003519 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003520 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003521 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003522 }
3523
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003524 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3525 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00003526 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003527 options::OPT_fno_unit_at_a_time)) {
3528 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003529 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003530 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003531
Eli Friedman055c9702011-11-02 01:53:16 +00003532 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3533 options::OPT_fno_apple_pragma_pack, false))
3534 CmdArgs.push_back("-fapple-pragma-pack");
3535
Eli Benderskyc95cfe82013-07-24 18:20:14 +00003536 // le32-specific flags:
3537 // -fno-math-builtin: clang should not convert math builtins to intrinsics
3538 // by default.
3539 if (getToolChain().getArch() == llvm::Triple::le32) {
3540 CmdArgs.push_back("-fno-math-builtin");
3541 }
3542
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003543 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003544 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003545 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003546#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003547 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003548 (getToolChain().getArch() == llvm::Triple::arm ||
3549 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003550 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3551 CmdArgs.push_back("-fno-builtin-strcat");
3552 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3553 CmdArgs.push_back("-fno-builtin-strcpy");
3554 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003555#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003556
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003557 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003558 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003559 options::OPT_traditional_cpp)) {
3560 if (isa<PreprocessJobAction>(JA))
3561 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003562 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003563 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003564 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003565
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003566 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003567 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003568
3569 // Handle serialized diagnostics.
3570 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3571 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003572 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003573 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003574
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003575 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3576 CmdArgs.push_back("-fretain-comments-from-system-headers");
3577
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003578 // Forward -fcomment-block-commands to -cc1.
3579 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00003580 // Forward -fparse-all-comments to -cc1.
3581 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003582
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003583 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3584 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003585 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003586 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3587 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003588 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003589
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003590 // We translate this by hand to the -cc1 argument, since nightly test uses
3591 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003592 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003593 CmdArgs.push_back("-disable-llvm-optzns");
3594 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003595 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003596 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003597
Daniel Dunbard67a3222009-03-30 06:36:42 +00003598 if (Output.getType() == types::TY_Dependencies) {
3599 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003600 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003601 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003602 CmdArgs.push_back(Output.getFilename());
3603 } else {
3604 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003605 }
3606
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003607 for (InputInfoList::const_iterator
3608 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3609 const InputInfo &II = *it;
3610 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00003611 if (Args.hasArg(options::OPT_rewrite_objc))
3612 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3613 else
3614 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00003615 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003616 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003617 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003618 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003619 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003620
Chris Lattnere9d7d782009-11-03 19:50:27 +00003621 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3622
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003623 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003624
3625 // Optionally embed the -cc1 level arguments into the debug info, for build
3626 // analysis.
3627 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003628 ArgStringList OriginalArgs;
3629 for (ArgList::const_iterator it = Args.begin(),
3630 ie = Args.end(); it != ie; ++it)
3631 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003632
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003633 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003634 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003635 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003636 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003637 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003638 }
3639 CmdArgs.push_back("-dwarf-debug-flags");
3640 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3641 }
3642
Eric Christopherd3804002013-02-22 20:12:52 +00003643 // Add the split debug info name to the command lines here so we
3644 // can propagate it to the backend.
3645 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003646 getToolChain().getTriple().isOSLinux() &&
Eric Christopherf1545832013-02-22 23:50:16 +00003647 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00003648 const char *SplitDwarfOut;
3649 if (SplitDwarf) {
3650 CmdArgs.push_back("-split-dwarf-file");
3651 SplitDwarfOut = SplitDebugName(Args, Inputs);
3652 CmdArgs.push_back(SplitDwarfOut);
3653 }
3654
3655 // Finally add the compile command to the compilation.
Hans Wennborg87cfa712013-09-19 20:32:16 +00003656 if (Args.hasArg(options::OPT__SLASH_fallback)) {
3657 tools::visualstudio::Compile CL(getToolChain());
3658 Command *CLCommand = CL.GetCommand(C, JA, Output, Inputs, Args,
3659 LinkingOutput);
3660 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
3661 } else {
3662 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3663 }
3664
Daniel Dunbar17731772009-03-23 19:03:36 +00003665
Eric Christopherf1545832013-02-22 23:50:16 +00003666 // Handle the debug info splitting at object creation time if we're
3667 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00003668 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00003669 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00003670 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00003671
Roman Divacky178e01602011-02-10 16:52:03 +00003672 if (Arg *A = Args.getLastArg(options::OPT_pg))
3673 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003674 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00003675 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003676
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003677 // Claim some arguments which clang supports automatically.
3678
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00003679 // -fpch-preprocess is used with gcc to add a special marker in the output to
3680 // include the PCH file. Clang's PTH solution is completely transparent, so we
3681 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003682 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003683
Daniel Dunbar17731772009-03-23 19:03:36 +00003684 // Claim some arguments which clang doesn't support, but we don't
3685 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003686 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3687 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00003688
Rafael Espindolab0092d72013-09-04 19:37:35 +00003689 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00003690 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003691}
3692
John McCall5fb5df92012-06-20 06:18:46 +00003693/// Add options related to the Objective-C runtime/ABI.
3694///
3695/// Returns true if the runtime is non-fragile.
3696ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3697 ArgStringList &cmdArgs,
3698 RewriteKind rewriteKind) const {
3699 // Look for the controlling runtime option.
3700 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3701 options::OPT_fgnu_runtime,
3702 options::OPT_fobjc_runtime_EQ);
3703
3704 // Just forward -fobjc-runtime= to the frontend. This supercedes
3705 // options about fragility.
3706 if (runtimeArg &&
3707 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3708 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003709 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003710 if (runtime.tryParse(value)) {
3711 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3712 << value;
3713 }
3714
3715 runtimeArg->render(args, cmdArgs);
3716 return runtime;
3717 }
3718
3719 // Otherwise, we'll need the ABI "version". Version numbers are
3720 // slightly confusing for historical reasons:
3721 // 1 - Traditional "fragile" ABI
3722 // 2 - Non-fragile ABI, version 1
3723 // 3 - Non-fragile ABI, version 2
3724 unsigned objcABIVersion = 1;
3725 // If -fobjc-abi-version= is present, use that to set the version.
3726 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003727 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003728 if (value == "1")
3729 objcABIVersion = 1;
3730 else if (value == "2")
3731 objcABIVersion = 2;
3732 else if (value == "3")
3733 objcABIVersion = 3;
3734 else
3735 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3736 << value;
3737 } else {
3738 // Otherwise, determine if we are using the non-fragile ABI.
3739 bool nonFragileABIIsDefault =
3740 (rewriteKind == RK_NonFragile ||
3741 (rewriteKind == RK_None &&
3742 getToolChain().IsObjCNonFragileABIDefault()));
3743 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3744 options::OPT_fno_objc_nonfragile_abi,
3745 nonFragileABIIsDefault)) {
3746 // Determine the non-fragile ABI version to use.
3747#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3748 unsigned nonFragileABIVersion = 1;
3749#else
3750 unsigned nonFragileABIVersion = 2;
3751#endif
3752
3753 if (Arg *abiArg = args.getLastArg(
3754 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003755 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003756 if (value == "1")
3757 nonFragileABIVersion = 1;
3758 else if (value == "2")
3759 nonFragileABIVersion = 2;
3760 else
3761 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3762 << value;
3763 }
3764
3765 objcABIVersion = 1 + nonFragileABIVersion;
3766 } else {
3767 objcABIVersion = 1;
3768 }
3769 }
3770
3771 // We don't actually care about the ABI version other than whether
3772 // it's non-fragile.
3773 bool isNonFragile = objcABIVersion != 1;
3774
3775 // If we have no runtime argument, ask the toolchain for its default runtime.
3776 // However, the rewriter only really supports the Mac runtime, so assume that.
3777 ObjCRuntime runtime;
3778 if (!runtimeArg) {
3779 switch (rewriteKind) {
3780 case RK_None:
3781 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3782 break;
3783 case RK_Fragile:
3784 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3785 break;
3786 case RK_NonFragile:
3787 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3788 break;
3789 }
3790
3791 // -fnext-runtime
3792 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3793 // On Darwin, make this use the default behavior for the toolchain.
3794 if (getToolChain().getTriple().isOSDarwin()) {
3795 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3796
3797 // Otherwise, build for a generic macosx port.
3798 } else {
3799 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3800 }
3801
3802 // -fgnu-runtime
3803 } else {
3804 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003805 // Legacy behaviour is to target the gnustep runtime if we are i
3806 // non-fragile mode or the GCC runtime in fragile mode.
3807 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003808 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003809 else
3810 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003811 }
3812
3813 cmdArgs.push_back(args.MakeArgString(
3814 "-fobjc-runtime=" + runtime.getAsString()));
3815 return runtime;
3816}
3817
Hans Wennborg75958c42013-08-08 00:17:41 +00003818void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
3819 unsigned RTOptionID = options::OPT__SLASH_MT;
3820
Hans Wennborgf1a74252013-09-10 20:18:04 +00003821 if (Args.hasArg(options::OPT__SLASH_LDd))
3822 // The /LDd option implies /MTd. The dependent lib part can be overridden,
3823 // but defining _DEBUG is sticky.
3824 RTOptionID = options::OPT__SLASH_MTd;
3825
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00003826 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00003827 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00003828
Hans Wennborg75958c42013-08-08 00:17:41 +00003829 switch(RTOptionID) {
3830 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00003831 if (Args.hasArg(options::OPT__SLASH_LDd))
3832 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00003833 CmdArgs.push_back("-D_MT");
3834 CmdArgs.push_back("-D_DLL");
3835 CmdArgs.push_back("--dependent-lib=msvcrt");
3836 break;
3837 case options::OPT__SLASH_MDd:
3838 CmdArgs.push_back("-D_DEBUG");
3839 CmdArgs.push_back("-D_MT");
3840 CmdArgs.push_back("-D_DLL");
3841 CmdArgs.push_back("--dependent-lib=msvcrtd");
3842 break;
3843 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00003844 if (Args.hasArg(options::OPT__SLASH_LDd))
3845 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00003846 CmdArgs.push_back("-D_MT");
3847 CmdArgs.push_back("--dependent-lib=libcmt");
3848 break;
3849 case options::OPT__SLASH_MTd:
3850 CmdArgs.push_back("-D_DEBUG");
3851 CmdArgs.push_back("-D_MT");
3852 CmdArgs.push_back("--dependent-lib=libcmtd");
3853 break;
3854 default:
3855 llvm_unreachable("Unexpected option ID.");
3856 }
3857
Reid Kleckner6beca0e2013-08-08 19:33:10 +00003858 // This provides POSIX compatibility (maps 'open' to '_open'), which most
3859 // users want. The /Za flag to cl.exe turns this off, but it's not
3860 // implemented in clang.
3861 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00003862
3863 // FIXME: Make this default for the win32 triple.
3864 CmdArgs.push_back("-cxx-abi");
3865 CmdArgs.push_back("microsoft");
Hans Wennborg0fd62072013-08-09 00:32:23 +00003866
3867 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
3868 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00003869
3870 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
3871 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00003872 if (Args.hasArg(options::OPT__SLASH_fallback))
3873 CmdArgs.push_back("msvc-fallback");
3874 else
3875 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00003876 }
Hans Wennborg75958c42013-08-08 00:17:41 +00003877}
3878
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003879void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003880 const InputInfo &Output,
3881 const InputInfoList &Inputs,
3882 const ArgList &Args,
3883 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003884 ArgStringList CmdArgs;
3885
3886 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3887 const InputInfo &Input = Inputs[0];
3888
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003889 // Don't warn about "clang -w -c foo.s"
3890 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003891 // and "clang -emit-llvm -c foo.s"
3892 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003893
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003894 // Invoke ourselves in -cc1as mode.
3895 //
3896 // FIXME: Implement custom jobs for internal actions.
3897 CmdArgs.push_back("-cc1as");
3898
3899 // Add the "effective" target triple.
3900 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003901 std::string TripleStr =
3902 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003903 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3904
3905 // Set the output mode, we currently only expect to be used as a real
3906 // assembler.
3907 CmdArgs.push_back("-filetype");
3908 CmdArgs.push_back("obj");
3909
Eric Christopher45f2e712012-12-18 00:31:10 +00003910 // Set the main file name, so that debug info works even with
3911 // -save-temps or preprocessed assembly.
3912 CmdArgs.push_back("-main-file-name");
3913 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3914
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003915 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003916 const llvm::Triple &Triple = getToolChain().getTriple();
3917 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003918 if (!CPU.empty()) {
3919 CmdArgs.push_back("-target-cpu");
3920 CmdArgs.push_back(Args.MakeArgString(CPU));
3921 }
3922
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003923 // Add the target features
3924 const Driver &D = getToolChain().getDriver();
3925 getTargetFeatures(D, Triple, Args, CmdArgs);
Jim Grosbach576452b2012-02-10 20:37:10 +00003926
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003927 // Ignore explicit -force_cpusubtype_ALL option.
3928 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003929
Eric Christopherfc3ee562012-01-10 00:38:01 +00003930 // Determine the original source input.
3931 const Action *SourceAction = &JA;
3932 while (SourceAction->getKind() != Action::InputClass) {
3933 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3934 SourceAction = SourceAction->getInputs()[0];
3935 }
3936
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003937 // Forward -g and handle debug info related flags, assuming we are dealing
3938 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00003939 if (SourceAction->getType() == types::TY_Asm ||
3940 SourceAction->getType() == types::TY_PP_Asm) {
3941 Args.ClaimAllArgs(options::OPT_g_Group);
3942 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3943 if (!A->getOption().matches(options::OPT_g0))
3944 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003945
3946 // Add the -fdebug-compilation-dir flag if needed.
3947 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00003948
3949 // Set the AT_producer to the clang version when using the integrated
3950 // assembler on assembly source files.
3951 CmdArgs.push_back("-dwarf-debug-producer");
3952 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00003953 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003954
3955 // Optionally embed the -cc1as level arguments into the debug info, for build
3956 // analysis.
3957 if (getToolChain().UseDwarfDebugFlags()) {
3958 ArgStringList OriginalArgs;
3959 for (ArgList::const_iterator it = Args.begin(),
3960 ie = Args.end(); it != ie; ++it)
3961 (*it)->render(Args, OriginalArgs);
3962
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003963 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003964 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3965 Flags += Exec;
3966 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3967 Flags += " ";
3968 Flags += OriginalArgs[i];
3969 }
3970 CmdArgs.push_back("-dwarf-debug-flags");
3971 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3972 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003973
3974 // FIXME: Add -static support, once we have it.
3975
David Blaikie9260ed62013-07-25 21:19:01 +00003976 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
3977 getToolChain().getDriver());
3978
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003979 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003980
3981 assert(Output.isFilename() && "Unexpected lipo output.");
3982 CmdArgs.push_back("-o");
3983 CmdArgs.push_back(Output.getFilename());
3984
Daniel Dunbarb440f562010-08-02 02:38:21 +00003985 assert(Input.isFilename() && "Invalid input.");
3986 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003987
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003988 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003989 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00003990
3991 // Handle the debug info splitting at object creation time if we're
3992 // creating an object.
3993 // TODO: Currently only works on linux with newer objcopy.
3994 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003995 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00003996 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
3997 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003998}
3999
Daniel Dunbara3246a02009-03-18 08:07:30 +00004000void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004001 const InputInfo &Output,
4002 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004003 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004004 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004005 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00004006 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004007
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004008 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004009 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004010 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00004011 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00004012 // Don't forward any -g arguments to assembly steps.
4013 if (isa<AssembleJobAction>(JA) &&
4014 A->getOption().matches(options::OPT_g_Group))
4015 continue;
4016
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00004017 // Don't forward any -W arguments to assembly and link steps.
4018 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4019 A->getOption().matches(options::OPT_W_Group))
4020 continue;
4021
Daniel Dunbar2da02722009-03-19 07:55:12 +00004022 // It is unfortunate that we have to claim here, as this means
4023 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00004024 // platforms using a generic gcc, even if we are just using gcc
4025 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00004026 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004027 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00004028 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004029 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004030
Daniel Dunbar4e295052010-01-25 22:35:08 +00004031 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004032
4033 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004034 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00004035 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004036 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00004037
4038 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004039 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004040 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004041 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004042 CmdArgs.push_back("ppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00004043 else if (Arch == llvm::Triple::ppc64le)
4044 CmdArgs.push_back("ppc64le");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004045 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004046 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00004047 }
4048
Daniel Dunbar5716d872009-05-02 21:41:52 +00004049 // Try to force gcc to match the tool chain we want, if we recognize
4050 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004051 //
4052 // FIXME: The triple class should directly provide the information we want
4053 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004054 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004055 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00004056 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4057 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004058 CmdArgs.push_back("-m64");
4059
Daniel Dunbarb440f562010-08-02 02:38:21 +00004060 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004061 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004062 CmdArgs.push_back(Output.getFilename());
4063 } else {
4064 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004065 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004066 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004067
Tony Linthicum76329bf2011-12-12 21:14:55 +00004068 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4069 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004070
4071 // Only pass -x if gcc will understand it; otherwise hope gcc
4072 // understands the suffix correctly. The main use case this would go
4073 // wrong in is for linker inputs if they happened to have an odd
4074 // suffix; really the only way to get this to happen is a command
4075 // like '-x foobar a.c' which will treat a.c like a linker input.
4076 //
4077 // FIXME: For the linker case specifically, can we safely convert
4078 // inputs into '-Wl,' options?
4079 for (InputInfoList::const_iterator
4080 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4081 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004082
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004083 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004084 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4085 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004086 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004087 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004088 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004089 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004090 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004091 else if (II.getType() == types::TY_ModuleFile)
4092 D.Diag(diag::err_drv_no_module_support)
4093 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004094
Daniel Dunbara3246a02009-03-18 08:07:30 +00004095 if (types::canTypeBeUserSpecified(II.getType())) {
4096 CmdArgs.push_back("-x");
4097 CmdArgs.push_back(types::getTypeName(II.getType()));
4098 }
4099
Daniel Dunbarb440f562010-08-02 02:38:21 +00004100 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004101 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00004102 else {
4103 const Arg &A = II.getInputArg();
4104
4105 // Reverse translate some rewritten options.
4106 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4107 CmdArgs.push_back("-lstdc++");
4108 continue;
4109 }
4110
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004111 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00004112 A.render(Args, CmdArgs);
4113 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004114 }
4115
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004116 const std::string customGCCName = D.getCCCGenericGCCName();
4117 const char *GCCName;
4118 if (!customGCCName.empty())
4119 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00004120 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004121 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004122 } else
4123 GCCName = "gcc";
4124
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004125 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004126 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004127 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004128}
4129
Daniel Dunbar4e295052010-01-25 22:35:08 +00004130void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4131 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004132 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004133}
4134
Daniel Dunbar4e295052010-01-25 22:35:08 +00004135void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
4136 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004137 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004138}
4139
Daniel Dunbar4e295052010-01-25 22:35:08 +00004140void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4141 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004142 const Driver &D = getToolChain().getDriver();
4143
Daniel Dunbar4e295052010-01-25 22:35:08 +00004144 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004145 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4146 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00004147 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004148 else {
4149 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004150 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004151 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004152
Daniel Dunbar4e295052010-01-25 22:35:08 +00004153 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004154 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004155}
4156
Daniel Dunbar4e295052010-01-25 22:35:08 +00004157void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
4158 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004159 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004160}
Daniel Dunbara3246a02009-03-18 08:07:30 +00004161
Daniel Dunbar4e295052010-01-25 22:35:08 +00004162void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4163 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004164 // The types are (hopefully) good enough.
4165}
4166
Tony Linthicum76329bf2011-12-12 21:14:55 +00004167// Hexagon tools start.
4168void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4169 ArgStringList &CmdArgs) const {
4170
4171}
4172void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4173 const InputInfo &Output,
4174 const InputInfoList &Inputs,
4175 const ArgList &Args,
4176 const char *LinkingOutput) const {
4177
4178 const Driver &D = getToolChain().getDriver();
4179 ArgStringList CmdArgs;
4180
4181 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00004182 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00004183 CmdArgs.push_back(Args.MakeArgString(MarchString));
4184
4185 RenderExtraToolArgs(JA, CmdArgs);
4186
4187 if (Output.isFilename()) {
4188 CmdArgs.push_back("-o");
4189 CmdArgs.push_back(Output.getFilename());
4190 } else {
4191 assert(Output.isNothing() && "Unexpected output");
4192 CmdArgs.push_back("-fsyntax-only");
4193 }
4194
Matthew Curtise8f80a12012-12-06 17:49:03 +00004195 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4196 if (!SmallDataThreshold.empty())
4197 CmdArgs.push_back(
4198 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004199
Matthew Curtise5df3812012-12-07 17:23:04 +00004200 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4201 options::OPT_Xassembler);
4202
Tony Linthicum76329bf2011-12-12 21:14:55 +00004203 // Only pass -x if gcc will understand it; otherwise hope gcc
4204 // understands the suffix correctly. The main use case this would go
4205 // wrong in is for linker inputs if they happened to have an odd
4206 // suffix; really the only way to get this to happen is a command
4207 // like '-x foobar a.c' which will treat a.c like a linker input.
4208 //
4209 // FIXME: For the linker case specifically, can we safely convert
4210 // inputs into '-Wl,' options?
4211 for (InputInfoList::const_iterator
4212 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4213 const InputInfo &II = *it;
4214
4215 // Don't try to pass LLVM or AST inputs to a generic gcc.
4216 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4217 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4218 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4219 << getToolChain().getTripleString();
4220 else if (II.getType() == types::TY_AST)
4221 D.Diag(clang::diag::err_drv_no_ast_support)
4222 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004223 else if (II.getType() == types::TY_ModuleFile)
4224 D.Diag(diag::err_drv_no_module_support)
4225 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00004226
4227 if (II.isFilename())
4228 CmdArgs.push_back(II.getFilename());
4229 else
4230 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4231 II.getInputArg().render(Args, CmdArgs);
4232 }
4233
4234 const char *GCCName = "hexagon-as";
4235 const char *Exec =
4236 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4237 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4238
4239}
4240void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4241 ArgStringList &CmdArgs) const {
4242 // The types are (hopefully) good enough.
4243}
4244
4245void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4246 const InputInfo &Output,
4247 const InputInfoList &Inputs,
4248 const ArgList &Args,
4249 const char *LinkingOutput) const {
4250
Matthew Curtise689b052012-12-06 15:46:07 +00004251 const toolchains::Hexagon_TC& ToolChain =
4252 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4253 const Driver &D = ToolChain.getDriver();
4254
Tony Linthicum76329bf2011-12-12 21:14:55 +00004255 ArgStringList CmdArgs;
4256
Matthew Curtise689b052012-12-06 15:46:07 +00004257 //----------------------------------------------------------------------------
4258 //
4259 //----------------------------------------------------------------------------
4260 bool hasStaticArg = Args.hasArg(options::OPT_static);
4261 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00004262 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00004263 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4264 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4265 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4266 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004267
Matthew Curtise689b052012-12-06 15:46:07 +00004268 //----------------------------------------------------------------------------
4269 // Silence warnings for various options
4270 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00004271
Matthew Curtise689b052012-12-06 15:46:07 +00004272 Args.ClaimAllArgs(options::OPT_g_Group);
4273 Args.ClaimAllArgs(options::OPT_emit_llvm);
4274 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4275 // handled somewhere else.
4276 Args.ClaimAllArgs(options::OPT_static_libgcc);
4277
4278 //----------------------------------------------------------------------------
4279 //
4280 //----------------------------------------------------------------------------
4281 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4282 e = ToolChain.ExtraOpts.end();
4283 i != e; ++i)
4284 CmdArgs.push_back(i->c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004285
Matthew Curtisf10a5952012-12-06 14:16:43 +00004286 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4287 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00004288
Matthew Curtise689b052012-12-06 15:46:07 +00004289 if (buildingLib) {
4290 CmdArgs.push_back("-shared");
4291 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4292 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00004293 }
4294
Matthew Curtise689b052012-12-06 15:46:07 +00004295 if (hasStaticArg)
4296 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004297
Matthew Curtise8f80a12012-12-06 17:49:03 +00004298 if (buildPIE && !buildingLib)
4299 CmdArgs.push_back("-pie");
4300
4301 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4302 if (!SmallDataThreshold.empty()) {
4303 CmdArgs.push_back(
4304 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4305 }
4306
Matthew Curtise689b052012-12-06 15:46:07 +00004307 //----------------------------------------------------------------------------
4308 //
4309 //----------------------------------------------------------------------------
4310 CmdArgs.push_back("-o");
4311 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004312
Matthew Curtise689b052012-12-06 15:46:07 +00004313 const std::string MarchSuffix = "/" + MarchString;
4314 const std::string G0Suffix = "/G0";
4315 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4316 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4317 + "/";
4318 const std::string StartFilesDir = RootDir
4319 + "hexagon/lib"
4320 + (buildingLib
4321 ? MarchG0Suffix : MarchSuffix);
4322
4323 //----------------------------------------------------------------------------
4324 // moslib
4325 //----------------------------------------------------------------------------
4326 std::vector<std::string> oslibs;
4327 bool hasStandalone= false;
4328
4329 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4330 ie = Args.filtered_end(); it != ie; ++it) {
4331 (*it)->claim();
4332 oslibs.push_back((*it)->getValue());
4333 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004334 }
Matthew Curtise689b052012-12-06 15:46:07 +00004335 if (oslibs.empty()) {
4336 oslibs.push_back("standalone");
4337 hasStandalone = true;
4338 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004339
Matthew Curtise689b052012-12-06 15:46:07 +00004340 //----------------------------------------------------------------------------
4341 // Start Files
4342 //----------------------------------------------------------------------------
4343 if (incStdLib && incStartFiles) {
4344
4345 if (!buildingLib) {
4346 if (hasStandalone) {
4347 CmdArgs.push_back(
4348 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4349 }
4350 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4351 }
4352 std::string initObj = useShared ? "/initS.o" : "/init.o";
4353 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4354 }
4355
4356 //----------------------------------------------------------------------------
4357 // Library Search Paths
4358 //----------------------------------------------------------------------------
4359 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4360 for (ToolChain::path_list::const_iterator
4361 i = LibPaths.begin(),
4362 e = LibPaths.end();
4363 i != e;
4364 ++i)
4365 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4366
4367 //----------------------------------------------------------------------------
4368 //
4369 //----------------------------------------------------------------------------
4370 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4371 Args.AddAllArgs(CmdArgs, options::OPT_e);
4372 Args.AddAllArgs(CmdArgs, options::OPT_s);
4373 Args.AddAllArgs(CmdArgs, options::OPT_t);
4374 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4375
4376 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4377
4378 //----------------------------------------------------------------------------
4379 // Libraries
4380 //----------------------------------------------------------------------------
4381 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00004382 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00004383 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4384 CmdArgs.push_back("-lm");
4385 }
4386
4387 CmdArgs.push_back("--start-group");
4388
4389 if (!buildingLib) {
4390 for(std::vector<std::string>::iterator i = oslibs.begin(),
4391 e = oslibs.end(); i != e; ++i)
4392 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4393 CmdArgs.push_back("-lc");
4394 }
4395 CmdArgs.push_back("-lgcc");
4396
4397 CmdArgs.push_back("--end-group");
4398 }
4399
4400 //----------------------------------------------------------------------------
4401 // End files
4402 //----------------------------------------------------------------------------
4403 if (incStdLib && incStartFiles) {
4404 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4405 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4406 }
4407
4408 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00004409 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004410}
4411// Hexagon tools end.
4412
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004413llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4414 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4415 // archs which Darwin doesn't use.
4416
4417 // The matching this routine does is fairly pointless, since it is neither the
4418 // complete architecture list, nor a reasonable subset. The problem is that
4419 // historically the driver driver accepts this and also ties its -march=
4420 // handling to the architecture name, so we need to be careful before removing
4421 // support for it.
4422
4423 // This code must be kept in sync with Clang's Darwin specific argument
4424 // translation.
4425
4426 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4427 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4428 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4429 .Case("ppc64", llvm::Triple::ppc64)
4430 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4431 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4432 llvm::Triple::x86)
4433 .Case("x86_64", llvm::Triple::x86_64)
4434 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00004435 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4436 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4437 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004438 .Case("r600", llvm::Triple::r600)
4439 .Case("nvptx", llvm::Triple::nvptx)
4440 .Case("nvptx64", llvm::Triple::nvptx64)
4441 .Case("amdil", llvm::Triple::amdil)
4442 .Case("spir", llvm::Triple::spir)
4443 .Default(llvm::Triple::UnknownArch);
4444}
Tony Linthicum76329bf2011-12-12 21:14:55 +00004445
Bob Wilsondecc03e2012-11-23 06:14:39 +00004446const char *Clang::getBaseInputName(const ArgList &Args,
4447 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00004448 return Args.MakeArgString(
4449 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004450}
4451
Bob Wilsondecc03e2012-11-23 06:14:39 +00004452const char *Clang::getBaseInputStem(const ArgList &Args,
4453 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004454 const char *Str = getBaseInputName(Args, Inputs);
4455
Chris Lattner906bb902011-01-16 08:14:11 +00004456 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004457 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004458
4459 return Str;
4460}
4461
Bob Wilsondecc03e2012-11-23 06:14:39 +00004462const char *Clang::getDependencyFileName(const ArgList &Args,
4463 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004464 // FIXME: Think about this more.
4465 std::string Res;
4466
4467 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004468 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004469 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004470 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00004471 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004472 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004473 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004474}
4475
Daniel Dunbarbe220842009-03-20 16:06:39 +00004476void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004477 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004478 const InputInfoList &Inputs,
4479 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004480 const char *LinkingOutput) const {
4481 ArgStringList CmdArgs;
4482
4483 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4484 const InputInfo &Input = Inputs[0];
4485
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004486 // Determine the original source input.
4487 const Action *SourceAction = &JA;
4488 while (SourceAction->getKind() != Action::InputClass) {
4489 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4490 SourceAction = SourceAction->getInputs()[0];
4491 }
4492
4493 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004494 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004495 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004496 if (Args.hasArg(options::OPT_gstabs))
4497 CmdArgs.push_back("--gstabs");
4498 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004499 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004500 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004501
Daniel Dunbarbe220842009-03-20 16:06:39 +00004502 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004503 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004504
Daniel Dunbar6d484762010-07-22 01:47:22 +00004505 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004506 if (getToolChain().getArch() == llvm::Triple::x86 ||
4507 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004508 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4509 CmdArgs.push_back("-force_cpusubtype_ALL");
4510
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004511 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004512 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00004513 Args.hasArg(options::OPT_fapple_kext)) &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004514 (!getDarwinToolChain().isTargetIPhoneOS() ||
4515 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4516 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004517 CmdArgs.push_back("-static");
4518
Daniel Dunbarbe220842009-03-20 16:06:39 +00004519 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4520 options::OPT_Xassembler);
4521
4522 assert(Output.isFilename() && "Unexpected lipo output.");
4523 CmdArgs.push_back("-o");
4524 CmdArgs.push_back(Output.getFilename());
4525
Daniel Dunbarb440f562010-08-02 02:38:21 +00004526 assert(Input.isFilename() && "Invalid input.");
4527 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004528
4529 // asm_final spec is empty.
4530
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004531 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004532 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004533 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004534}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004535
David Blaikie68e081d2011-12-20 02:48:34 +00004536void darwin::DarwinTool::anchor() {}
4537
Daniel Dunbare9ded432009-09-09 18:36:20 +00004538void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4539 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004540 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004541
Daniel Dunbarc1964212009-03-26 16:23:12 +00004542 // Derived from darwin_arch spec.
4543 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004544 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004545
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004546 // FIXME: Is this needed anymore?
4547 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004548 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004549}
4550
Bill Wendling3b2000f2012-10-02 18:02:50 +00004551bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4552 // We only need to generate a temp path for LTO if we aren't compiling object
4553 // files. When compiling source files, we run 'dsymutil' after linking. We
4554 // don't run 'dsymutil' when compiling object files.
4555 for (InputInfoList::const_iterator
4556 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4557 if (it->getType() != types::TY_Object)
4558 return true;
4559
4560 return false;
4561}
4562
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004563void darwin::Link::AddLinkArgs(Compilation &C,
4564 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004565 ArgStringList &CmdArgs,
4566 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004567 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004568 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004569
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004570 unsigned Version[3] = { 0, 0, 0 };
4571 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4572 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00004573 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004574 Version[1], Version[2], HadExtra) ||
4575 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004576 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004577 << A->getAsString(Args);
4578 }
4579
4580 // Newer linkers support -demangle, pass it if supported and not disabled by
4581 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004582 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004583 // Don't pass -demangle to ld_classic.
4584 //
4585 // FIXME: This is a temporary workaround, ld should be handling this.
4586 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4587 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004588 if (getToolChain().getArch() == llvm::Triple::x86) {
4589 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4590 options::OPT_Wl_COMMA),
4591 ie = Args.filtered_end(); it != ie; ++it) {
4592 const Arg *A = *it;
4593 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smithbd55daf2012-11-01 04:30:05 +00004594 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004595 UsesLdClassic = true;
4596 }
4597 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004598 if (!UsesLdClassic)
4599 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004600 }
4601
Bob Wilson3d27dad2013-08-02 22:25:34 +00004602 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
4603 CmdArgs.push_back("-export_dynamic");
4604
Bill Wendling313b6bf2012-11-16 23:03:00 +00004605 // If we are using LTO, then automatically create a temporary file path for
4606 // the linker to use, so that it's lifetime will extend past a possible
4607 // dsymutil step.
4608 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4609 const char *TmpPath = C.getArgs().MakeArgString(
4610 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4611 C.addTempFile(TmpPath);
4612 CmdArgs.push_back("-object_path_lto");
4613 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00004614 }
4615
Daniel Dunbarc1964212009-03-26 16:23:12 +00004616 // Derived from the "link" spec.
4617 Args.AddAllArgs(CmdArgs, options::OPT_static);
4618 if (!Args.hasArg(options::OPT_static))
4619 CmdArgs.push_back("-dynamic");
4620 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4621 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4622 // here. How do we wish to handle such things?
4623 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004624
Daniel Dunbarc1964212009-03-26 16:23:12 +00004625 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004626 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004627 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004628 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004629
4630 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4631 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4632 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4633
4634 Arg *A;
4635 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4636 (A = Args.getLastArg(options::OPT_current__version)) ||
4637 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004638 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004639 << A->getAsString(Args) << "-dynamiclib";
4640
4641 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4642 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4643 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4644 } else {
4645 CmdArgs.push_back("-dylib");
4646
4647 Arg *A;
4648 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4649 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4650 (A = Args.getLastArg(options::OPT_client__name)) ||
4651 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4652 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4653 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004654 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004655 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004656
Daniel Dunbarc1964212009-03-26 16:23:12 +00004657 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4658 "-dylib_compatibility_version");
4659 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4660 "-dylib_current_version");
4661
Daniel Dunbara48823f2010-01-22 02:04:52 +00004662 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004663
4664 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4665 "-dylib_install_name");
4666 }
4667
4668 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4669 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4670 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004671 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004672 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004673 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4674 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4675 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4676 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4677 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4678 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004679 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004680 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4681 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4682 Args.AddAllArgs(CmdArgs, options::OPT_init);
4683
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004684 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004685 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004686
4687 // If we had an explicit -mios-simulator-version-min argument, honor that,
4688 // otherwise use the traditional deployment targets. We can't just check the
4689 // is-sim attribute because existing code follows this path, and the linker
4690 // may not handle the argument.
4691 //
4692 // FIXME: We may be able to remove this, once we can verify no one depends on
4693 // it.
4694 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4695 CmdArgs.push_back("-ios_simulator_version_min");
4696 else if (DarwinTC.isTargetIPhoneOS())
4697 CmdArgs.push_back("-iphoneos_version_min");
4698 else
4699 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004700 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004701
Daniel Dunbarc1964212009-03-26 16:23:12 +00004702 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4703 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4704 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4705 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4706 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004707
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004708 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4709 options::OPT_fno_pie,
4710 options::OPT_fno_PIE)) {
4711 if (A->getOption().matches(options::OPT_fpie) ||
4712 A->getOption().matches(options::OPT_fPIE))
4713 CmdArgs.push_back("-pie");
4714 else
4715 CmdArgs.push_back("-no_pie");
4716 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004717
4718 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4719 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4720 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4721 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4722 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4723 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4724 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4725 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4726 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4727 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4728 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4729 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4730 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4731 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4732 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4733 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004734
Daniel Dunbar84384642011-05-02 21:03:47 +00004735 // Give --sysroot= preference, over the Apple specific behavior to also use
4736 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004737 StringRef sysroot = C.getSysRoot();
4738 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004739 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004740 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004741 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4742 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00004743 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004744 }
4745
Daniel Dunbarc1964212009-03-26 16:23:12 +00004746 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4747 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4748 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4749 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4750 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004751 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004752 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4753 Args.AddAllArgs(CmdArgs, options::OPT_y);
4754 Args.AddLastArg(CmdArgs, options::OPT_w);
4755 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4756 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4757 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4758 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4759 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4760 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4761 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4762 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4763 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4764 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4765 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4766 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4767}
4768
4769void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004770 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004771 const InputInfoList &Inputs,
4772 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004773 const char *LinkingOutput) const {
4774 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004775
Daniel Dunbarc1964212009-03-26 16:23:12 +00004776 // The logic here is derived from gcc's behavior; most of which
4777 // comes from specs (starting with link_command). Consult gcc for
4778 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004779 ArgStringList CmdArgs;
4780
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004781 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4782 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4783 options::OPT_ccc_arcmt_migrate)) {
4784 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4785 (*I)->claim();
4786 const char *Exec =
4787 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4788 CmdArgs.push_back(Output.getFilename());
4789 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4790 return;
4791 }
4792
Daniel Dunbarc1964212009-03-26 16:23:12 +00004793 // I'm not sure why this particular decomposition exists in gcc, but
4794 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004795 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004796
Daniel Dunbarc1964212009-03-26 16:23:12 +00004797 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4798 Args.AddAllArgs(CmdArgs, options::OPT_s);
4799 Args.AddAllArgs(CmdArgs, options::OPT_t);
4800 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4801 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004802 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004803 Args.AddAllArgs(CmdArgs, options::OPT_r);
4804
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004805 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4806 // members of static archive libraries which implement Objective-C classes or
4807 // categories.
4808 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4809 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004810
Daniel Dunbarc1964212009-03-26 16:23:12 +00004811 CmdArgs.push_back("-o");
4812 CmdArgs.push_back(Output.getFilename());
4813
Chad Rosier06fd3c62012-05-16 23:45:12 +00004814 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004815 !Args.hasArg(options::OPT_nostartfiles)) {
4816 // Derived from startfile spec.
4817 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004818 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004819 if (getDarwinToolChain().isTargetIOSSimulator()) {
4820 // The simulator doesn't have a versioned crt1 file.
4821 CmdArgs.push_back("-ldylib1.o");
4822 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004823 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4824 CmdArgs.push_back("-ldylib1.o");
4825 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004826 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004827 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004828 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004829 CmdArgs.push_back("-ldylib1.10.5.o");
4830 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004831 } else {
4832 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004833 if (!Args.hasArg(options::OPT_static)) {
4834 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004835 if (getDarwinToolChain().isTargetIOSSimulator()) {
4836 // The simulator doesn't have a versioned crt1 file.
4837 CmdArgs.push_back("-lbundle1.o");
4838 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004839 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4840 CmdArgs.push_back("-lbundle1.o");
4841 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004842 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004843 CmdArgs.push_back("-lbundle1.o");
4844 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004845 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004846 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004847 if (Args.hasArg(options::OPT_pg) &&
4848 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004849 if (Args.hasArg(options::OPT_static) ||
4850 Args.hasArg(options::OPT_object) ||
4851 Args.hasArg(options::OPT_preload)) {
4852 CmdArgs.push_back("-lgcrt0.o");
4853 } else {
4854 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004855
Daniel Dunbarc1964212009-03-26 16:23:12 +00004856 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004857 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004858 // By default on OS X 10.8 and later, we don't link with a crt1.o
4859 // file and the linker knows to use _main as the entry point. But,
4860 // when compiling with -pg, we need to link with the gcrt1.o file,
4861 // so pass the -no_new_main option to tell the linker to use the
4862 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004863 if (getDarwinToolChain().isTargetMacOS() &&
4864 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4865 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004866 } else {
4867 if (Args.hasArg(options::OPT_static) ||
4868 Args.hasArg(options::OPT_object) ||
4869 Args.hasArg(options::OPT_preload)) {
4870 CmdArgs.push_back("-lcrt0.o");
4871 } else {
4872 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004873 if (getDarwinToolChain().isTargetIOSSimulator()) {
4874 // The simulator doesn't have a versioned crt1 file.
4875 CmdArgs.push_back("-lcrt1.o");
4876 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004877 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4878 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004879 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00004880 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004881 } else {
4882 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4883 CmdArgs.push_back("-lcrt1.o");
4884 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4885 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004886 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004887 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004888
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004889 // darwin_crt2 spec is empty.
4890 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004891 }
4892 }
4893 }
4894 }
4895
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004896 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4897 Args.hasArg(options::OPT_shared_libgcc) &&
4898 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004899 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004900 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004901 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004902 }
4903 }
4904
4905 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004906
Daniel Dunbarc1964212009-03-26 16:23:12 +00004907 if (Args.hasArg(options::OPT_fopenmp))
4908 // This is more complicated in gcc...
4909 CmdArgs.push_back("-lgomp");
4910
Douglas Gregor9295df02012-05-15 21:00:27 +00004911 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4912
Bob Wilson16d93952012-05-15 18:57:39 +00004913 if (isObjCRuntimeLinked(Args) &&
4914 !Args.hasArg(options::OPT_nostdlib) &&
4915 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004916 // Avoid linking compatibility stubs on i386 mac.
4917 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004918 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004919 // If we don't have ARC or subscripting runtime support, link in the
4920 // runtime stubs. We have to do this *before* adding any of the normal
4921 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004922 ObjCRuntime runtime =
4923 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004924 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004925 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004926 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004927 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004928 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004929 CmdArgs.push_back("-framework");
4930 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004931 // Link libobj.
4932 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004933 }
John McCall31168b02011-06-15 23:02:42 +00004934
Daniel Dunbarc1964212009-03-26 16:23:12 +00004935 if (LinkingOutput) {
4936 CmdArgs.push_back("-arch_multiple");
4937 CmdArgs.push_back("-final_output");
4938 CmdArgs.push_back(LinkingOutput);
4939 }
4940
Daniel Dunbarc1964212009-03-26 16:23:12 +00004941 if (Args.hasArg(options::OPT_fnested_functions))
4942 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004943
Daniel Dunbarc1964212009-03-26 16:23:12 +00004944 if (!Args.hasArg(options::OPT_nostdlib) &&
4945 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00004946 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004947 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004948
Daniel Dunbarc1964212009-03-26 16:23:12 +00004949 // link_ssp spec is empty.
4950
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004951 // Let the tool chain choose which runtime library to link.
4952 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004953 }
4954
Chad Rosier06fd3c62012-05-16 23:45:12 +00004955 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004956 !Args.hasArg(options::OPT_nostartfiles)) {
4957 // endfile_spec is empty.
4958 }
4959
4960 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4961 Args.AddAllArgs(CmdArgs, options::OPT_F);
4962
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004963 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004964 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004965 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004966}
4967
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004968void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004969 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004970 const InputInfoList &Inputs,
4971 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004972 const char *LinkingOutput) const {
4973 ArgStringList CmdArgs;
4974
4975 CmdArgs.push_back("-create");
4976 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004977
4978 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004979 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004980
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004981 for (InputInfoList::const_iterator
4982 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4983 const InputInfo &II = *it;
4984 assert(II.isFilename() && "Unexpected lipo input.");
4985 CmdArgs.push_back(II.getFilename());
4986 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004987 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004988 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004989 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004990}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004991
Daniel Dunbar88299622010-06-04 18:28:36 +00004992void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004993 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004994 const InputInfoList &Inputs,
4995 const ArgList &Args,
4996 const char *LinkingOutput) const {
4997 ArgStringList CmdArgs;
4998
Daniel Dunbareb86b042011-05-09 17:23:16 +00004999 CmdArgs.push_back("-o");
5000 CmdArgs.push_back(Output.getFilename());
5001
Daniel Dunbar88299622010-06-04 18:28:36 +00005002 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5003 const InputInfo &Input = Inputs[0];
5004 assert(Input.isFilename() && "Unexpected dsymutil input.");
5005 CmdArgs.push_back(Input.getFilename());
5006
Daniel Dunbar88299622010-06-04 18:28:36 +00005007 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005008 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005009 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00005010}
5011
Eric Christopher551ef452011-08-23 17:56:55 +00005012void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00005013 const InputInfo &Output,
5014 const InputInfoList &Inputs,
5015 const ArgList &Args,
5016 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00005017 ArgStringList CmdArgs;
5018 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00005019 CmdArgs.push_back("--debug-info");
5020 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00005021 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00005022
5023 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5024 const InputInfo &Input = Inputs[0];
5025 assert(Input.isFilename() && "Unexpected verify input");
5026
5027 // Grabbing the output of the earlier dsymutil run.
5028 CmdArgs.push_back(Input.getFilename());
5029
5030 const char *Exec =
5031 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5032 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5033}
5034
David Chisnallf571cde2012-02-15 13:39:01 +00005035void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5036 const InputInfo &Output,
5037 const InputInfoList &Inputs,
5038 const ArgList &Args,
5039 const char *LinkingOutput) const {
5040 ArgStringList CmdArgs;
5041
5042 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5043 options::OPT_Xassembler);
5044
5045 CmdArgs.push_back("-o");
5046 CmdArgs.push_back(Output.getFilename());
5047
5048 for (InputInfoList::const_iterator
5049 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5050 const InputInfo &II = *it;
5051 CmdArgs.push_back(II.getFilename());
5052 }
5053
5054 const char *Exec =
5055 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5056 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5057}
5058
5059
5060void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5061 const InputInfo &Output,
5062 const InputInfoList &Inputs,
5063 const ArgList &Args,
5064 const char *LinkingOutput) const {
5065 // FIXME: Find a real GCC, don't hard-code versions here
5066 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5067 const llvm::Triple &T = getToolChain().getTriple();
5068 std::string LibPath = "/usr/lib/";
5069 llvm::Triple::ArchType Arch = T.getArch();
5070 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005071 case llvm::Triple::x86:
5072 GCCLibPath +=
5073 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5074 break;
5075 case llvm::Triple::x86_64:
5076 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5077 GCCLibPath += "/4.5.2/amd64/";
5078 LibPath += "amd64/";
5079 break;
5080 default:
5081 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00005082 }
5083
5084 ArgStringList CmdArgs;
5085
David Chisnall272a0712012-02-29 15:06:12 +00005086 // Demangle C++ names in errors
5087 CmdArgs.push_back("-C");
5088
David Chisnallf571cde2012-02-15 13:39:01 +00005089 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5090 (!Args.hasArg(options::OPT_shared))) {
5091 CmdArgs.push_back("-e");
5092 CmdArgs.push_back("_start");
5093 }
5094
5095 if (Args.hasArg(options::OPT_static)) {
5096 CmdArgs.push_back("-Bstatic");
5097 CmdArgs.push_back("-dn");
5098 } else {
5099 CmdArgs.push_back("-Bdynamic");
5100 if (Args.hasArg(options::OPT_shared)) {
5101 CmdArgs.push_back("-shared");
5102 } else {
5103 CmdArgs.push_back("--dynamic-linker");
5104 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5105 }
5106 }
5107
5108 if (Output.isFilename()) {
5109 CmdArgs.push_back("-o");
5110 CmdArgs.push_back(Output.getFilename());
5111 } else {
5112 assert(Output.isNothing() && "Invalid output.");
5113 }
5114
5115 if (!Args.hasArg(options::OPT_nostdlib) &&
5116 !Args.hasArg(options::OPT_nostartfiles)) {
5117 if (!Args.hasArg(options::OPT_shared)) {
5118 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5119 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005120 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005121 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5122 } else {
5123 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005124 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5125 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005126 }
Hans Wennborg70850d82013-07-18 20:29:38 +00005127 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00005128 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005129 }
5130
5131 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5132
5133 Args.AddAllArgs(CmdArgs, options::OPT_L);
5134 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5135 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00005136 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00005137
5138 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5139
5140 if (!Args.hasArg(options::OPT_nostdlib) &&
5141 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005142 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00005143 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00005144 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005145 if (!Args.hasArg(options::OPT_shared)) {
5146 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00005147 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00005148 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005149 }
David Chisnallf571cde2012-02-15 13:39:01 +00005150 }
5151
5152 if (!Args.hasArg(options::OPT_nostdlib) &&
5153 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00005154 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005155 }
David Chisnall96de9932012-02-16 16:00:47 +00005156 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005157
5158 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5159
5160 const char *Exec =
5161 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5162 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5163}
5164
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005165void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005166 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005167 const InputInfoList &Inputs,
5168 const ArgList &Args,
5169 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005170 ArgStringList CmdArgs;
5171
5172 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5173 options::OPT_Xassembler);
5174
5175 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005176 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005177
5178 for (InputInfoList::const_iterator
5179 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5180 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005181 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005182 }
5183
5184 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005185 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005186 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005187}
5188
5189void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005190 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005191 const InputInfoList &Inputs,
5192 const ArgList &Args,
5193 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005194 ArgStringList CmdArgs;
5195
5196 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005197 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005198 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005199 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005200 }
5201
5202 if (Args.hasArg(options::OPT_static)) {
5203 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005204 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005205 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005206// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005207 CmdArgs.push_back("-Bdynamic");
5208 if (Args.hasArg(options::OPT_shared)) {
5209 CmdArgs.push_back("-shared");
5210 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00005211 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005212 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5213 }
5214 }
5215
Daniel Dunbarb440f562010-08-02 02:38:21 +00005216 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005217 CmdArgs.push_back("-o");
5218 CmdArgs.push_back(Output.getFilename());
5219 } else {
5220 assert(Output.isNothing() && "Invalid output.");
5221 }
5222
5223 if (!Args.hasArg(options::OPT_nostdlib) &&
5224 !Args.hasArg(options::OPT_nostartfiles)) {
5225 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005226 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005227 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005228 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005229 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005230 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005231 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005232 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005233 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005234 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005235 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005236 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005237 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005238 }
5239
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005240 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5241 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005242 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005243
5244 Args.AddAllArgs(CmdArgs, options::OPT_L);
5245 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5246 Args.AddAllArgs(CmdArgs, options::OPT_e);
5247
Daniel Dunbar54423b22010-09-17 00:24:54 +00005248 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005249
5250 if (!Args.hasArg(options::OPT_nostdlib) &&
5251 !Args.hasArg(options::OPT_nodefaultlibs)) {
5252 // FIXME: For some reason GCC passes -lgcc before adding
5253 // the default system libraries. Just mimic this for now.
5254 CmdArgs.push_back("-lgcc");
5255
5256 if (Args.hasArg(options::OPT_pthread))
5257 CmdArgs.push_back("-pthread");
5258 if (!Args.hasArg(options::OPT_shared))
5259 CmdArgs.push_back("-lc");
5260 CmdArgs.push_back("-lgcc");
5261 }
5262
5263 if (!Args.hasArg(options::OPT_nostdlib) &&
5264 !Args.hasArg(options::OPT_nostartfiles)) {
5265 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005266 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005267 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005268 }
5269
Bill Wendling08760582011-06-27 19:15:03 +00005270 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005271
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005272 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005273 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005274 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005275}
5276
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005277void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005278 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005279 const InputInfoList &Inputs,
5280 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005281 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005282 ArgStringList CmdArgs;
5283
5284 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5285 options::OPT_Xassembler);
5286
5287 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005288 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005289
5290 for (InputInfoList::const_iterator
5291 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5292 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005293 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005294 }
5295
5296 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005297 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005298 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005299}
5300
5301void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005302 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005303 const InputInfoList &Inputs,
5304 const ArgList &Args,
5305 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005306 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005307 ArgStringList CmdArgs;
5308
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005309 // Silence warning for "clang -g foo.o -o foo"
5310 Args.ClaimAllArgs(options::OPT_g_Group);
5311 // and "clang -emit-llvm foo.o -o foo"
5312 Args.ClaimAllArgs(options::OPT_emit_llvm);
5313 // and for "clang -w foo.o -o foo". Other warning options are already
5314 // handled somewhere else.
5315 Args.ClaimAllArgs(options::OPT_w);
5316
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005317 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005318 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005319 CmdArgs.push_back("-e");
5320 CmdArgs.push_back("__start");
5321 }
5322
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005323 if (Args.hasArg(options::OPT_static)) {
5324 CmdArgs.push_back("-Bstatic");
5325 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005326 if (Args.hasArg(options::OPT_rdynamic))
5327 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005328 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005329 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005330 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005331 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005332 } else {
5333 CmdArgs.push_back("-dynamic-linker");
5334 CmdArgs.push_back("/usr/libexec/ld.so");
5335 }
5336 }
5337
Rafael Espindola044f7832013-06-05 04:28:55 +00005338 if (Args.hasArg(options::OPT_nopie))
5339 CmdArgs.push_back("-nopie");
5340
Daniel Dunbarb440f562010-08-02 02:38:21 +00005341 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005342 CmdArgs.push_back("-o");
5343 CmdArgs.push_back(Output.getFilename());
5344 } else {
5345 assert(Output.isNothing() && "Invalid output.");
5346 }
5347
5348 if (!Args.hasArg(options::OPT_nostdlib) &&
5349 !Args.hasArg(options::OPT_nostartfiles)) {
5350 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00005351 if (Args.hasArg(options::OPT_pg))
5352 CmdArgs.push_back(Args.MakeArgString(
5353 getToolChain().GetFilePath("gcrt0.o")));
5354 else
5355 CmdArgs.push_back(Args.MakeArgString(
5356 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005357 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005358 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005359 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005360 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005361 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005362 }
5363 }
5364
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005365 std::string Triple = getToolChain().getTripleString();
5366 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005367 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005368 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005369 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005370
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005371 Args.AddAllArgs(CmdArgs, options::OPT_L);
5372 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5373 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005374 Args.AddAllArgs(CmdArgs, options::OPT_s);
5375 Args.AddAllArgs(CmdArgs, options::OPT_t);
5376 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5377 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005378
Daniel Dunbar54423b22010-09-17 00:24:54 +00005379 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005380
5381 if (!Args.hasArg(options::OPT_nostdlib) &&
5382 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005383 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005384 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005385 if (Args.hasArg(options::OPT_pg))
5386 CmdArgs.push_back("-lm_p");
5387 else
5388 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005389 }
5390
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005391 // FIXME: For some reason GCC passes -lgcc before adding
5392 // the default system libraries. Just mimic this for now.
5393 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005394
Eric Christopher17674ec2012-09-13 06:32:34 +00005395 if (Args.hasArg(options::OPT_pthread)) {
5396 if (!Args.hasArg(options::OPT_shared) &&
5397 Args.hasArg(options::OPT_pg))
5398 CmdArgs.push_back("-lpthread_p");
5399 else
5400 CmdArgs.push_back("-lpthread");
5401 }
5402
Chandler Carruth45661652011-12-17 22:32:42 +00005403 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005404 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005405 CmdArgs.push_back("-lc_p");
5406 else
5407 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005408 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005409
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005410 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005411 }
5412
5413 if (!Args.hasArg(options::OPT_nostdlib) &&
5414 !Args.hasArg(options::OPT_nostartfiles)) {
5415 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005416 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005417 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005418 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005419 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005420 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005421 }
5422
5423 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005424 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005425 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005426}
Ed Schoutene33194b2009-04-02 19:13:12 +00005427
Eli Friedman9fa28852012-08-08 23:57:20 +00005428void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5429 const InputInfo &Output,
5430 const InputInfoList &Inputs,
5431 const ArgList &Args,
5432 const char *LinkingOutput) const {
5433 ArgStringList CmdArgs;
5434
5435 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5436 options::OPT_Xassembler);
5437
5438 CmdArgs.push_back("-o");
5439 CmdArgs.push_back(Output.getFilename());
5440
5441 for (InputInfoList::const_iterator
5442 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5443 const InputInfo &II = *it;
5444 CmdArgs.push_back(II.getFilename());
5445 }
5446
5447 const char *Exec =
5448 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5449 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5450}
5451
5452void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5453 const InputInfo &Output,
5454 const InputInfoList &Inputs,
5455 const ArgList &Args,
5456 const char *LinkingOutput) const {
5457 const Driver &D = getToolChain().getDriver();
5458 ArgStringList CmdArgs;
5459
5460 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5461 (!Args.hasArg(options::OPT_shared))) {
5462 CmdArgs.push_back("-e");
5463 CmdArgs.push_back("__start");
5464 }
5465
5466 if (Args.hasArg(options::OPT_static)) {
5467 CmdArgs.push_back("-Bstatic");
5468 } else {
5469 if (Args.hasArg(options::OPT_rdynamic))
5470 CmdArgs.push_back("-export-dynamic");
5471 CmdArgs.push_back("--eh-frame-hdr");
5472 CmdArgs.push_back("-Bdynamic");
5473 if (Args.hasArg(options::OPT_shared)) {
5474 CmdArgs.push_back("-shared");
5475 } else {
5476 CmdArgs.push_back("-dynamic-linker");
5477 CmdArgs.push_back("/usr/libexec/ld.so");
5478 }
5479 }
5480
5481 if (Output.isFilename()) {
5482 CmdArgs.push_back("-o");
5483 CmdArgs.push_back(Output.getFilename());
5484 } else {
5485 assert(Output.isNothing() && "Invalid output.");
5486 }
5487
5488 if (!Args.hasArg(options::OPT_nostdlib) &&
5489 !Args.hasArg(options::OPT_nostartfiles)) {
5490 if (!Args.hasArg(options::OPT_shared)) {
5491 if (Args.hasArg(options::OPT_pg))
5492 CmdArgs.push_back(Args.MakeArgString(
5493 getToolChain().GetFilePath("gcrt0.o")));
5494 else
5495 CmdArgs.push_back(Args.MakeArgString(
5496 getToolChain().GetFilePath("crt0.o")));
5497 CmdArgs.push_back(Args.MakeArgString(
5498 getToolChain().GetFilePath("crtbegin.o")));
5499 } else {
5500 CmdArgs.push_back(Args.MakeArgString(
5501 getToolChain().GetFilePath("crtbeginS.o")));
5502 }
5503 }
5504
5505 Args.AddAllArgs(CmdArgs, options::OPT_L);
5506 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5507 Args.AddAllArgs(CmdArgs, options::OPT_e);
5508
5509 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5510
5511 if (!Args.hasArg(options::OPT_nostdlib) &&
5512 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005513 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00005514 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5515 if (Args.hasArg(options::OPT_pg))
5516 CmdArgs.push_back("-lm_p");
5517 else
5518 CmdArgs.push_back("-lm");
5519 }
5520
Rafael Espindola1ad26f02012-10-23 17:07:31 +00005521 if (Args.hasArg(options::OPT_pthread)) {
5522 if (!Args.hasArg(options::OPT_shared) &&
5523 Args.hasArg(options::OPT_pg))
5524 CmdArgs.push_back("-lpthread_p");
5525 else
5526 CmdArgs.push_back("-lpthread");
5527 }
5528
Eli Friedman9fa28852012-08-08 23:57:20 +00005529 if (!Args.hasArg(options::OPT_shared)) {
5530 if (Args.hasArg(options::OPT_pg))
5531 CmdArgs.push_back("-lc_p");
5532 else
5533 CmdArgs.push_back("-lc");
5534 }
5535
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005536 StringRef MyArch;
5537 switch (getToolChain().getTriple().getArch()) {
5538 case llvm::Triple::arm:
5539 MyArch = "arm";
5540 break;
5541 case llvm::Triple::x86:
5542 MyArch = "i386";
5543 break;
5544 case llvm::Triple::x86_64:
5545 MyArch = "amd64";
5546 break;
5547 default:
5548 llvm_unreachable("Unsupported architecture");
5549 }
5550 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00005551 }
5552
5553 if (!Args.hasArg(options::OPT_nostdlib) &&
5554 !Args.hasArg(options::OPT_nostartfiles)) {
5555 if (!Args.hasArg(options::OPT_shared))
5556 CmdArgs.push_back(Args.MakeArgString(
5557 getToolChain().GetFilePath("crtend.o")));
5558 else
5559 CmdArgs.push_back(Args.MakeArgString(
5560 getToolChain().GetFilePath("crtendS.o")));
5561 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005562
5563 const char *Exec =
5564 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5565 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005566}
5567
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005568void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005569 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005570 const InputInfoList &Inputs,
5571 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005572 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005573 ArgStringList CmdArgs;
5574
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005575 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5576 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005577 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005578 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005579 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005580 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005581 else if (getToolChain().getArch() == llvm::Triple::mips ||
5582 getToolChain().getArch() == llvm::Triple::mipsel ||
5583 getToolChain().getArch() == llvm::Triple::mips64 ||
5584 getToolChain().getArch() == llvm::Triple::mips64el) {
5585 StringRef CPUName;
5586 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005587 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005588
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005589 CmdArgs.push_back("-march");
5590 CmdArgs.push_back(CPUName.data());
5591
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005592 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005593 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005594
5595 if (getToolChain().getArch() == llvm::Triple::mips ||
5596 getToolChain().getArch() == llvm::Triple::mips64)
5597 CmdArgs.push_back("-EB");
5598 else
5599 CmdArgs.push_back("-EL");
5600
5601 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5602 options::OPT_fpic, options::OPT_fno_pic,
5603 options::OPT_fPIE, options::OPT_fno_PIE,
5604 options::OPT_fpie, options::OPT_fno_pie);
5605 if (LastPICArg &&
5606 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5607 LastPICArg->getOption().matches(options::OPT_fpic) ||
5608 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5609 LastPICArg->getOption().matches(options::OPT_fpie))) {
5610 CmdArgs.push_back("-KPIC");
5611 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005612 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5613 getToolChain().getArch() == llvm::Triple::thumb) {
5614 CmdArgs.push_back("-mfpu=softvfp");
5615 switch(getToolChain().getTriple().getEnvironment()) {
5616 case llvm::Triple::GNUEABI:
5617 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00005618 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005619 break;
5620
5621 default:
5622 CmdArgs.push_back("-matpcs");
5623 }
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005624 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005625
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005626 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5627 options::OPT_Xassembler);
5628
5629 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005630 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005631
5632 for (InputInfoList::const_iterator
5633 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5634 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005635 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005636 }
5637
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005638 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005639 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005640 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005641}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005642
5643void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005644 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005645 const InputInfoList &Inputs,
5646 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005647 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005648 const toolchains::FreeBSD& ToolChain =
5649 static_cast<const toolchains::FreeBSD&>(getToolChain());
5650 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005651 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005652
5653 // Silence warning for "clang -g foo.o -o foo"
5654 Args.ClaimAllArgs(options::OPT_g_Group);
5655 // and "clang -emit-llvm foo.o -o foo"
5656 Args.ClaimAllArgs(options::OPT_emit_llvm);
5657 // and for "clang -w foo.o -o foo". Other warning options are already
5658 // handled somewhere else.
5659 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005660
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005661 if (!D.SysRoot.empty())
5662 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5663
Roman Divackyafe2f232012-08-28 15:09:03 +00005664 if (Args.hasArg(options::OPT_pie))
5665 CmdArgs.push_back("-pie");
5666
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005667 if (Args.hasArg(options::OPT_static)) {
5668 CmdArgs.push_back("-Bstatic");
5669 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005670 if (Args.hasArg(options::OPT_rdynamic))
5671 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005672 CmdArgs.push_back("--eh-frame-hdr");
5673 if (Args.hasArg(options::OPT_shared)) {
5674 CmdArgs.push_back("-Bshareable");
5675 } else {
5676 CmdArgs.push_back("-dynamic-linker");
5677 CmdArgs.push_back("/libexec/ld-elf.so.1");
5678 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005679 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5680 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005681 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5682 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5683 CmdArgs.push_back("--hash-style=both");
5684 }
5685 }
5686 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005687 }
5688
5689 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5690 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005691 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005692 CmdArgs.push_back("-m");
5693 CmdArgs.push_back("elf_i386_fbsd");
5694 }
5695
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005696 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005697 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005698 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005699 }
5700
Daniel Dunbarb440f562010-08-02 02:38:21 +00005701 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005702 CmdArgs.push_back("-o");
5703 CmdArgs.push_back(Output.getFilename());
5704 } else {
5705 assert(Output.isNothing() && "Invalid output.");
5706 }
5707
5708 if (!Args.hasArg(options::OPT_nostdlib) &&
5709 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005710 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005711 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005712 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005713 crt1 = "gcrt1.o";
5714 else if (Args.hasArg(options::OPT_pie))
5715 crt1 = "Scrt1.o";
5716 else
5717 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005718 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005719 if (crt1)
5720 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5721
5722 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5723
5724 const char *crtbegin = NULL;
5725 if (Args.hasArg(options::OPT_static))
5726 crtbegin = "crtbeginT.o";
5727 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5728 crtbegin = "crtbeginS.o";
5729 else
5730 crtbegin = "crtbegin.o";
5731
5732 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005733 }
5734
5735 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005736 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005737 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5738 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005739 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005740 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5741 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005742 Args.AddAllArgs(CmdArgs, options::OPT_s);
5743 Args.AddAllArgs(CmdArgs, options::OPT_t);
5744 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5745 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005746
Roman Divackyafe2f232012-08-28 15:09:03 +00005747 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005748
5749 if (!Args.hasArg(options::OPT_nostdlib) &&
5750 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005751 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005752 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005753 if (Args.hasArg(options::OPT_pg))
5754 CmdArgs.push_back("-lm_p");
5755 else
5756 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005757 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005758 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5759 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005760 if (Args.hasArg(options::OPT_pg))
5761 CmdArgs.push_back("-lgcc_p");
5762 else
5763 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005764 if (Args.hasArg(options::OPT_static)) {
5765 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005766 } else if (Args.hasArg(options::OPT_pg)) {
5767 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005768 } else {
5769 CmdArgs.push_back("--as-needed");
5770 CmdArgs.push_back("-lgcc_s");
5771 CmdArgs.push_back("--no-as-needed");
5772 }
5773
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005774 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005775 if (Args.hasArg(options::OPT_pg))
5776 CmdArgs.push_back("-lpthread_p");
5777 else
5778 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005779 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005780
Roman Divacky66f22762011-02-10 16:59:40 +00005781 if (Args.hasArg(options::OPT_pg)) {
5782 if (Args.hasArg(options::OPT_shared))
5783 CmdArgs.push_back("-lc");
5784 else
5785 CmdArgs.push_back("-lc_p");
5786 CmdArgs.push_back("-lgcc_p");
5787 } else {
5788 CmdArgs.push_back("-lc");
5789 CmdArgs.push_back("-lgcc");
5790 }
5791
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005792 if (Args.hasArg(options::OPT_static)) {
5793 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005794 } else if (Args.hasArg(options::OPT_pg)) {
5795 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005796 } else {
5797 CmdArgs.push_back("--as-needed");
5798 CmdArgs.push_back("-lgcc_s");
5799 CmdArgs.push_back("--no-as-needed");
5800 }
5801 }
5802
5803 if (!Args.hasArg(options::OPT_nostdlib) &&
5804 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005805 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005806 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005807 else
5808 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005809 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005810 }
5811
Roman Divackyafe2f232012-08-28 15:09:03 +00005812 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005813
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005814 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005815 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005816 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005817}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005818
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005819void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5820 const InputInfo &Output,
5821 const InputInfoList &Inputs,
5822 const ArgList &Args,
5823 const char *LinkingOutput) const {
5824 ArgStringList CmdArgs;
5825
5826 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5827 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005828 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005829 CmdArgs.push_back("--32");
5830
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005831 // Set byte order explicitly
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005832 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005833 CmdArgs.push_back("-EB");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005834 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005835 CmdArgs.push_back("-EL");
5836
5837 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5838 options::OPT_Xassembler);
5839
5840 CmdArgs.push_back("-o");
5841 CmdArgs.push_back(Output.getFilename());
5842
5843 for (InputInfoList::const_iterator
5844 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5845 const InputInfo &II = *it;
5846 CmdArgs.push_back(II.getFilename());
5847 }
5848
David Chisnallddbd68f2011-09-27 22:03:18 +00005849 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005850 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5851}
5852
5853void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5854 const InputInfo &Output,
5855 const InputInfoList &Inputs,
5856 const ArgList &Args,
5857 const char *LinkingOutput) const {
5858 const Driver &D = getToolChain().getDriver();
5859 ArgStringList CmdArgs;
5860
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005861 if (!D.SysRoot.empty())
5862 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5863
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005864 if (Args.hasArg(options::OPT_static)) {
5865 CmdArgs.push_back("-Bstatic");
5866 } else {
5867 if (Args.hasArg(options::OPT_rdynamic))
5868 CmdArgs.push_back("-export-dynamic");
5869 CmdArgs.push_back("--eh-frame-hdr");
5870 if (Args.hasArg(options::OPT_shared)) {
5871 CmdArgs.push_back("-Bshareable");
5872 } else {
5873 CmdArgs.push_back("-dynamic-linker");
5874 CmdArgs.push_back("/libexec/ld.elf_so");
5875 }
5876 }
5877
5878 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5879 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005880 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005881 CmdArgs.push_back("-m");
5882 CmdArgs.push_back("elf_i386");
5883 }
5884
5885 if (Output.isFilename()) {
5886 CmdArgs.push_back("-o");
5887 CmdArgs.push_back(Output.getFilename());
5888 } else {
5889 assert(Output.isNothing() && "Invalid output.");
5890 }
5891
5892 if (!Args.hasArg(options::OPT_nostdlib) &&
5893 !Args.hasArg(options::OPT_nostartfiles)) {
5894 if (!Args.hasArg(options::OPT_shared)) {
5895 CmdArgs.push_back(Args.MakeArgString(
5896 getToolChain().GetFilePath("crt0.o")));
5897 CmdArgs.push_back(Args.MakeArgString(
5898 getToolChain().GetFilePath("crti.o")));
5899 CmdArgs.push_back(Args.MakeArgString(
5900 getToolChain().GetFilePath("crtbegin.o")));
5901 } else {
5902 CmdArgs.push_back(Args.MakeArgString(
5903 getToolChain().GetFilePath("crti.o")));
5904 CmdArgs.push_back(Args.MakeArgString(
5905 getToolChain().GetFilePath("crtbeginS.o")));
5906 }
5907 }
5908
5909 Args.AddAllArgs(CmdArgs, options::OPT_L);
5910 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5911 Args.AddAllArgs(CmdArgs, options::OPT_e);
5912 Args.AddAllArgs(CmdArgs, options::OPT_s);
5913 Args.AddAllArgs(CmdArgs, options::OPT_t);
5914 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5915 Args.AddAllArgs(CmdArgs, options::OPT_r);
5916
5917 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5918
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00005919 unsigned Major, Minor, Micro;
5920 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
5921 bool useLibgcc = true;
5922 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) {
5923 if (getToolChain().getArch() == llvm::Triple::x86 ||
5924 getToolChain().getArch() == llvm::Triple::x86_64)
5925 useLibgcc = false;
5926 }
5927
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005928 if (!Args.hasArg(options::OPT_nostdlib) &&
5929 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005930 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005931 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5932 CmdArgs.push_back("-lm");
5933 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005934 if (Args.hasArg(options::OPT_pthread))
5935 CmdArgs.push_back("-lpthread");
5936 CmdArgs.push_back("-lc");
5937
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00005938 if (useLibgcc) {
5939 if (Args.hasArg(options::OPT_static)) {
5940 // libgcc_eh depends on libc, so resolve as much as possible,
5941 // pull in any new requirements from libc and then get the rest
5942 // of libgcc.
5943 CmdArgs.push_back("-lgcc_eh");
5944 CmdArgs.push_back("-lc");
5945 CmdArgs.push_back("-lgcc");
5946 } else {
5947 CmdArgs.push_back("-lgcc");
5948 CmdArgs.push_back("--as-needed");
5949 CmdArgs.push_back("-lgcc_s");
5950 CmdArgs.push_back("--no-as-needed");
5951 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005952 }
5953 }
5954
5955 if (!Args.hasArg(options::OPT_nostdlib) &&
5956 !Args.hasArg(options::OPT_nostartfiles)) {
5957 if (!Args.hasArg(options::OPT_shared))
5958 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5959 "crtend.o")));
5960 else
5961 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5962 "crtendS.o")));
5963 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5964 "crtn.o")));
5965 }
5966
Bill Wendling08760582011-06-27 19:15:03 +00005967 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005968
David Chisnallddbd68f2011-09-27 22:03:18 +00005969 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005970 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5971}
5972
Thomas Schwinge4e555262013-03-28 19:04:25 +00005973void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5974 const InputInfo &Output,
5975 const InputInfoList &Inputs,
5976 const ArgList &Args,
5977 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00005978 ArgStringList CmdArgs;
5979
5980 // Add --32/--64 to make sure we get the format we want.
5981 // This is incomplete
5982 if (getToolChain().getArch() == llvm::Triple::x86) {
5983 CmdArgs.push_back("--32");
5984 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5985 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005986 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5987 CmdArgs.push_back("-a32");
5988 CmdArgs.push_back("-mppc");
5989 CmdArgs.push_back("-many");
5990 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5991 CmdArgs.push_back("-a64");
5992 CmdArgs.push_back("-mppc64");
5993 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00005994 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
5995 CmdArgs.push_back("-a64");
5996 CmdArgs.push_back("-mppc64le");
5997 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005998 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005999 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00006000 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
6001 CmdArgs.push_back("-mfpu=neon");
Bernard Ogdena58ef052013-10-24 18:32:41 +00006002 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a")
6003 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006004
6005 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
6006 getToolChain().getTriple());
6007 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006008
6009 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
6010 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
6011 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006012 } else if (getToolChain().getArch() == llvm::Triple::mips ||
6013 getToolChain().getArch() == llvm::Triple::mipsel ||
6014 getToolChain().getArch() == llvm::Triple::mips64 ||
6015 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006016 StringRef CPUName;
6017 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006018 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006019
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006020 CmdArgs.push_back("-march");
6021 CmdArgs.push_back(CPUName.data());
6022
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006023 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006024 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00006025
6026 if (getToolChain().getArch() == llvm::Triple::mips ||
6027 getToolChain().getArch() == llvm::Triple::mips64)
6028 CmdArgs.push_back("-EB");
6029 else
6030 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006031
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006032 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6033 if (StringRef(A->getValue()) == "2008")
6034 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6035 }
6036
Simon Atanasyan036d16d2013-04-30 07:47:13 +00006037 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6038 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6039 options::OPT_mno_micromips);
6040 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6041 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6042
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006043 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6044 options::OPT_fpic, options::OPT_fno_pic,
6045 options::OPT_fPIE, options::OPT_fno_PIE,
6046 options::OPT_fpie, options::OPT_fno_pie);
6047 if (LastPICArg &&
6048 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6049 LastPICArg->getOption().matches(options::OPT_fpic) ||
6050 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6051 LastPICArg->getOption().matches(options::OPT_fpie))) {
6052 CmdArgs.push_back("-KPIC");
6053 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006054 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
Richard Sandiford4652d892013-07-19 16:51:51 +00006055 // Always pass an -march option, since our default of z10 is later
6056 // than the GNU assembler's default.
6057 StringRef CPUName = getSystemZTargetCPU(Args);
6058 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Rafael Espindola92b00932010-08-10 00:25:48 +00006059 }
6060
6061 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6062 options::OPT_Xassembler);
6063
6064 CmdArgs.push_back("-o");
6065 CmdArgs.push_back(Output.getFilename());
6066
6067 for (InputInfoList::const_iterator
6068 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6069 const InputInfo &II = *it;
6070 CmdArgs.push_back(II.getFilename());
6071 }
6072
6073 const char *Exec =
6074 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6075 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00006076
6077 // Handle the debug info splitting at object creation time if we're
6078 // creating an object.
6079 // TODO: Currently only works on linux with newer objcopy.
6080 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006081 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00006082 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6083 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00006084}
6085
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006086static void AddLibgcc(llvm::Triple Triple, const Driver &D,
6087 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00006088 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00006089 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6090 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00006091 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006092 CmdArgs.push_back("-lgcc");
6093
Logan Chien3d3373c2012-11-19 12:04:11 +00006094 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006095 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006096 CmdArgs.push_back("-lgcc");
6097 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00006098 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006099 CmdArgs.push_back("--as-needed");
6100 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00006101 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006102 CmdArgs.push_back("--no-as-needed");
6103 }
6104
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006105 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00006106 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00006107 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006108 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00006109
6110 // According to Android ABI, we have to link with libdl if we are
6111 // linking with non-static libgcc.
6112 //
6113 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6114 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6115 if (isAndroid && !StaticLibgcc)
6116 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00006117}
6118
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006119static bool hasMipsN32ABIArg(const ArgList &Args) {
6120 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smithbd55daf2012-11-01 04:30:05 +00006121 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006122}
6123
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006124static StringRef getLinuxDynamicLinker(const ArgList &Args,
6125 const toolchains::Linux &ToolChain) {
6126 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android)
6127 return "/system/bin/linker";
6128 else if (ToolChain.getArch() == llvm::Triple::x86)
6129 return "/lib/ld-linux.so.2";
6130 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6131 return "/lib/ld-linux-aarch64.so.1";
6132 else if (ToolChain.getArch() == llvm::Triple::arm ||
6133 ToolChain.getArch() == llvm::Triple::thumb) {
6134 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6135 return "/lib/ld-linux-armhf.so.3";
6136 else
6137 return "/lib/ld-linux.so.3";
6138 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6139 ToolChain.getArch() == llvm::Triple::mipsel)
6140 return "/lib/ld.so.1";
6141 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6142 ToolChain.getArch() == llvm::Triple::mips64el) {
6143 if (hasMipsN32ABIArg(Args))
6144 return "/lib32/ld.so.1";
6145 else
6146 return "/lib64/ld.so.1";
6147 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6148 return "/lib/ld.so.1";
6149 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
Bill Schmidt778d3872013-07-26 01:36:11 +00006150 ToolChain.getArch() == llvm::Triple::ppc64le ||
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006151 ToolChain.getArch() == llvm::Triple::systemz)
6152 return "/lib64/ld64.so.1";
6153 else
6154 return "/lib64/ld-linux-x86-64.so.2";
6155}
6156
Thomas Schwinge4e555262013-03-28 19:04:25 +00006157void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6158 const InputInfo &Output,
6159 const InputInfoList &Inputs,
6160 const ArgList &Args,
6161 const char *LinkingOutput) const {
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006162 const toolchains::Linux& ToolChain =
6163 static_cast<const toolchains::Linux&>(getToolChain());
6164 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00006165 const bool isAndroid =
6166 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Alexey Samsonov609213f92013-08-19 09:14:21 +00006167 const SanitizerArgs &Sanitize = D.getOrParseSanitizerArgs(Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006168 const bool IsPIE =
6169 !Args.hasArg(options::OPT_shared) &&
Alexey Samsonove6203662013-08-09 07:42:13 +00006170 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow(ToolChain));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006171
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006172 ArgStringList CmdArgs;
6173
Rafael Espindolad1002f62010-11-15 18:28:16 +00006174 // Silence warning for "clang -g foo.o -o foo"
6175 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006176 // and "clang -emit-llvm foo.o -o foo"
6177 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00006178 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00006179 // handled somewhere else.
6180 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00006181
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006182 if (!D.SysRoot.empty())
6183 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006184
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006185 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00006186 CmdArgs.push_back("-pie");
6187
Rafael Espindola1c76c592010-11-07 22:57:16 +00006188 if (Args.hasArg(options::OPT_rdynamic))
6189 CmdArgs.push_back("-export-dynamic");
6190
Rafael Espindola34d77dc2010-11-11 19:34:42 +00006191 if (Args.hasArg(options::OPT_s))
6192 CmdArgs.push_back("-s");
6193
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006194 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6195 e = ToolChain.ExtraOpts.end();
6196 i != e; ++i)
6197 CmdArgs.push_back(i->c_str());
6198
6199 if (!Args.hasArg(options::OPT_static)) {
6200 CmdArgs.push_back("--eh-frame-hdr");
6201 }
6202
6203 CmdArgs.push_back("-m");
6204 if (ToolChain.getArch() == llvm::Triple::x86)
6205 CmdArgs.push_back("elf_i386");
Tim Northover9bb857a2013-01-31 12:13:10 +00006206 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6207 CmdArgs.push_back("aarch64linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00006208 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00006209 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006210 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00006211 else if (ToolChain.getArch() == llvm::Triple::ppc)
6212 CmdArgs.push_back("elf32ppclinux");
6213 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6214 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00006215 else if (ToolChain.getArch() == llvm::Triple::mips)
6216 CmdArgs.push_back("elf32btsmip");
6217 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6218 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006219 else if (ToolChain.getArch() == llvm::Triple::mips64) {
6220 if (hasMipsN32ABIArg(Args))
6221 CmdArgs.push_back("elf32btsmipn32");
6222 else
6223 CmdArgs.push_back("elf64btsmip");
6224 }
6225 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
6226 if (hasMipsN32ABIArg(Args))
6227 CmdArgs.push_back("elf32ltsmipn32");
6228 else
6229 CmdArgs.push_back("elf64ltsmip");
6230 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006231 else if (ToolChain.getArch() == llvm::Triple::systemz)
6232 CmdArgs.push_back("elf64_s390");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006233 else
6234 CmdArgs.push_back("elf_x86_64");
6235
6236 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00006237 if (ToolChain.getArch() == llvm::Triple::arm
6238 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006239 CmdArgs.push_back("-Bstatic");
6240 else
6241 CmdArgs.push_back("-static");
6242 } else if (Args.hasArg(options::OPT_shared)) {
6243 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00006244 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006245 CmdArgs.push_back("-Bsymbolic");
6246 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006247 }
6248
6249 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00006250 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006251 (!Args.hasArg(options::OPT_static) &&
6252 !Args.hasArg(options::OPT_shared))) {
6253 CmdArgs.push_back("-dynamic-linker");
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006254 CmdArgs.push_back(Args.MakeArgString(
6255 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006256 }
6257
6258 CmdArgs.push_back("-o");
6259 CmdArgs.push_back(Output.getFilename());
6260
Rafael Espindola81937ec2010-12-01 01:52:43 +00006261 if (!Args.hasArg(options::OPT_nostdlib) &&
6262 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006263 if (!isAndroid) {
6264 const char *crt1 = NULL;
6265 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00006266 if (Args.hasArg(options::OPT_pg))
6267 crt1 = "gcrt1.o";
6268 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006269 crt1 = "Scrt1.o";
6270 else
6271 crt1 = "crt1.o";
6272 }
6273 if (crt1)
6274 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006275
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006276 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6277 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006278
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006279 const char *crtbegin;
6280 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006281 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006282 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006283 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006284 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006285 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006286 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006287 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006288 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00006289
6290 // Add crtfastmath.o if available and fast math is enabled.
6291 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006292 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006293
6294 Args.AddAllArgs(CmdArgs, options::OPT_L);
6295
6296 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6297
Roman Divackyee8188a2011-03-01 17:53:14 +00006298 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6299 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006300 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006301
Rafael Espindola9446d762012-04-09 23:53:34 +00006302 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
6303 // as gold requires -plugin to come before any -plugin-opt that -Wl might
6304 // forward.
Rafael Espindolab0092d72013-09-04 19:37:35 +00006305 if (D.IsUsingLTO(Args)) {
Rafael Espindola9446d762012-04-09 23:53:34 +00006306 CmdArgs.push_back("-plugin");
6307 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
6308 CmdArgs.push_back(Args.MakeArgString(Plugin));
Chandler Carruth953fb082013-01-13 11:46:33 +00006309
6310 // Try to pass driver level flags relevant to LTO code generation down to
6311 // the plugin.
6312
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006313 // Handle flags for selecting CPU variants.
6314 std::string CPU = getCPUName(Args, ToolChain.getTriple());
6315 if (!CPU.empty()) {
Chandler Carruth953fb082013-01-13 11:46:33 +00006316 CmdArgs.push_back(
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006317 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6318 CPU));
6319 }
Rafael Espindola9446d762012-04-09 23:53:34 +00006320 }
6321
Chandler Carruth953fb082013-01-13 11:46:33 +00006322
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00006323 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6324 CmdArgs.push_back("--no-demangle");
6325
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006326 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6327
Eric Christopher04997782012-11-29 18:51:05 +00006328 // Call these before we add the C++ ABI library.
Richard Smith52be6192012-11-05 22:04:41 +00006329 if (Sanitize.needsUbsanRt())
Hans Wennborg70850d82013-07-18 20:29:38 +00006330 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX(),
Richard Smithcff3cde2013-03-20 23:49:07 +00006331 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006332 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
Eric Christopher04997782012-11-29 18:51:05 +00006333 if (Sanitize.needsAsanRt())
6334 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6335 if (Sanitize.needsTsanRt())
6336 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00006337 if (Sanitize.needsMsanRt())
6338 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006339 if (Sanitize.needsLsanRt())
6340 addLsanRTLinux(getToolChain(), Args, CmdArgs);
Peter Collingbournec3772752013-08-07 22:47:34 +00006341 if (Sanitize.needsDfsanRt())
6342 addDfsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith4d3110a2012-10-25 02:14:12 +00006343
Chandler Carruthe4458b32013-06-24 09:38:45 +00006344 // The profile runtime also needs access to system libraries.
6345 addProfileRTLinux(getToolChain(), Args, CmdArgs);
6346
Hans Wennborg70850d82013-07-18 20:29:38 +00006347 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00006348 !Args.hasArg(options::OPT_nostdlib) &&
6349 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00006350 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6351 !Args.hasArg(options::OPT_static);
6352 if (OnlyLibstdcxxStatic)
6353 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006354 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00006355 if (OnlyLibstdcxxStatic)
6356 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006357 CmdArgs.push_back("-lm");
6358 }
6359
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006360 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00006361 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6362 if (Args.hasArg(options::OPT_static))
6363 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00006364
Chandler Carruth01538002013-01-17 13:19:29 +00006365 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6366 if (OpenMP) {
6367 CmdArgs.push_back("-lgomp");
6368
6369 // FIXME: Exclude this for platforms whith libgomp that doesn't require
6370 // librt. Most modern Linux platfroms require it, but some may not.
6371 CmdArgs.push_back("-lrt");
6372 }
6373
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006374 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006375
Chandler Carruth94a32012012-05-14 18:31:18 +00006376 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruth01538002013-01-17 13:19:29 +00006377 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth94a32012012-05-14 18:31:18 +00006378 CmdArgs.push_back("-lpthread");
6379
6380 CmdArgs.push_back("-lc");
6381
6382 if (Args.hasArg(options::OPT_static))
6383 CmdArgs.push_back("--end-group");
6384 else
6385 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6386 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00006387
Rafael Espindola81937ec2010-12-01 01:52:43 +00006388 if (!Args.hasArg(options::OPT_nostartfiles)) {
6389 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006390 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006391 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006392 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006393 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00006394 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006395 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006396
Rafael Espindola81937ec2010-12-01 01:52:43 +00006397 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006398 if (!isAndroid)
6399 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00006400 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006401 }
6402
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006403 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6404}
Rafael Espindola92b00932010-08-10 00:25:48 +00006405
Chris Lattner3e2ee142010-07-07 16:01:42 +00006406void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006407 const InputInfo &Output,
6408 const InputInfoList &Inputs,
6409 const ArgList &Args,
6410 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006411 ArgStringList CmdArgs;
6412
6413 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6414 options::OPT_Xassembler);
6415
6416 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006417 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006418
6419 for (InputInfoList::const_iterator
6420 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6421 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006422 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006423 }
6424
6425 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00006426 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006427 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006428}
6429
6430void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006431 const InputInfo &Output,
6432 const InputInfoList &Inputs,
6433 const ArgList &Args,
6434 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006435 const Driver &D = getToolChain().getDriver();
6436 ArgStringList CmdArgs;
6437
Daniel Dunbarb440f562010-08-02 02:38:21 +00006438 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006439 CmdArgs.push_back("-o");
6440 CmdArgs.push_back(Output.getFilename());
6441 } else {
6442 assert(Output.isNothing() && "Invalid output.");
6443 }
6444
6445 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00006446 !Args.hasArg(options::OPT_nostartfiles)) {
6447 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6448 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6449 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6450 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6451 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006452
6453 Args.AddAllArgs(CmdArgs, options::OPT_L);
6454 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6455 Args.AddAllArgs(CmdArgs, options::OPT_e);
6456
Daniel Dunbar54423b22010-09-17 00:24:54 +00006457 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006458
Eli Friedman83de5132011-12-08 23:54:21 +00006459 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6460
Chris Lattner3e2ee142010-07-07 16:01:42 +00006461 if (!Args.hasArg(options::OPT_nostdlib) &&
6462 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006463 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006464 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006465 CmdArgs.push_back("-lm");
6466 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006467 }
6468
6469 if (!Args.hasArg(options::OPT_nostdlib) &&
6470 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00006471 if (Args.hasArg(options::OPT_pthread))
6472 CmdArgs.push_back("-lpthread");
6473 CmdArgs.push_back("-lc");
6474 CmdArgs.push_back("-lCompilerRT-Generic");
6475 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6476 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00006477 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006478 }
6479
Eli Friedman83de5132011-12-08 23:54:21 +00006480 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006481 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006482}
6483
Daniel Dunbarcc912342009-05-02 18:28:39 +00006484/// DragonFly Tools
6485
6486// For now, DragonFly Assemble does just about the same as for
6487// FreeBSD, but this may change soon.
6488void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006489 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006490 const InputInfoList &Inputs,
6491 const ArgList &Args,
6492 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006493 ArgStringList CmdArgs;
6494
6495 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6496 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006497 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00006498 CmdArgs.push_back("--32");
6499
6500 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6501 options::OPT_Xassembler);
6502
6503 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006504 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006505
6506 for (InputInfoList::const_iterator
6507 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6508 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006509 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006510 }
6511
6512 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006513 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006514 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006515}
6516
6517void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006518 const InputInfo &Output,
6519 const InputInfoList &Inputs,
6520 const ArgList &Args,
6521 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00006522 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00006523 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00006524 ArgStringList CmdArgs;
6525
John McCall65b8da02013-04-11 22:55:55 +00006526 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6527 UseGCC47 = false;
6528
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006529 if (!D.SysRoot.empty())
6530 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6531
John McCall65b8da02013-04-11 22:55:55 +00006532 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006533 if (Args.hasArg(options::OPT_static)) {
6534 CmdArgs.push_back("-Bstatic");
6535 } else {
John McCall65b8da02013-04-11 22:55:55 +00006536 if (Args.hasArg(options::OPT_rdynamic))
6537 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006538 if (Args.hasArg(options::OPT_shared))
6539 CmdArgs.push_back("-Bshareable");
6540 else {
6541 CmdArgs.push_back("-dynamic-linker");
6542 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6543 }
John McCall65b8da02013-04-11 22:55:55 +00006544 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006545 }
6546
6547 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6548 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006549 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006550 CmdArgs.push_back("-m");
6551 CmdArgs.push_back("elf_i386");
6552 }
6553
Daniel Dunbarb440f562010-08-02 02:38:21 +00006554 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006555 CmdArgs.push_back("-o");
6556 CmdArgs.push_back(Output.getFilename());
6557 } else {
6558 assert(Output.isNothing() && "Invalid output.");
6559 }
6560
6561 if (!Args.hasArg(options::OPT_nostdlib) &&
6562 !Args.hasArg(options::OPT_nostartfiles)) {
6563 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00006564 if (Args.hasArg(options::OPT_pg))
6565 CmdArgs.push_back(Args.MakeArgString(
6566 getToolChain().GetFilePath("gcrt1.o")));
6567 else {
6568 if (Args.hasArg(options::OPT_pie))
6569 CmdArgs.push_back(Args.MakeArgString(
6570 getToolChain().GetFilePath("Scrt1.o")));
6571 else
6572 CmdArgs.push_back(Args.MakeArgString(
6573 getToolChain().GetFilePath("crt1.o")));
6574 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006575 }
John McCall65b8da02013-04-11 22:55:55 +00006576 CmdArgs.push_back(Args.MakeArgString(
6577 getToolChain().GetFilePath("crti.o")));
6578 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6579 CmdArgs.push_back(Args.MakeArgString(
6580 getToolChain().GetFilePath("crtbeginS.o")));
6581 else
6582 CmdArgs.push_back(Args.MakeArgString(
6583 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006584 }
6585
6586 Args.AddAllArgs(CmdArgs, options::OPT_L);
6587 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6588 Args.AddAllArgs(CmdArgs, options::OPT_e);
6589
Daniel Dunbar54423b22010-09-17 00:24:54 +00006590 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006591
6592 if (!Args.hasArg(options::OPT_nostdlib) &&
6593 !Args.hasArg(options::OPT_nodefaultlibs)) {
6594 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6595 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00006596 if (UseGCC47)
6597 CmdArgs.push_back("-L/usr/lib/gcc47");
6598 else
6599 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006600
6601 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00006602 if (UseGCC47) {
6603 CmdArgs.push_back("-rpath");
6604 CmdArgs.push_back("/usr/lib/gcc47");
6605 } else {
6606 CmdArgs.push_back("-rpath");
6607 CmdArgs.push_back("/usr/lib/gcc44");
6608 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006609 }
6610
Hans Wennborg70850d82013-07-18 20:29:38 +00006611 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006612 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006613 CmdArgs.push_back("-lm");
6614 }
6615
Daniel Dunbarcc912342009-05-02 18:28:39 +00006616 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006617 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006618
6619 if (!Args.hasArg(options::OPT_nolibc)) {
6620 CmdArgs.push_back("-lc");
6621 }
6622
John McCall65b8da02013-04-11 22:55:55 +00006623 if (UseGCC47) {
6624 if (Args.hasArg(options::OPT_static) ||
6625 Args.hasArg(options::OPT_static_libgcc)) {
6626 CmdArgs.push_back("-lgcc");
6627 CmdArgs.push_back("-lgcc_eh");
6628 } else {
6629 if (Args.hasArg(options::OPT_shared_libgcc)) {
6630 CmdArgs.push_back("-lgcc_pic");
6631 if (!Args.hasArg(options::OPT_shared))
6632 CmdArgs.push_back("-lgcc");
6633 } else {
6634 CmdArgs.push_back("-lgcc");
6635 CmdArgs.push_back("--as-needed");
6636 CmdArgs.push_back("-lgcc_pic");
6637 CmdArgs.push_back("--no-as-needed");
6638 }
6639 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006640 } else {
John McCall65b8da02013-04-11 22:55:55 +00006641 if (Args.hasArg(options::OPT_shared)) {
6642 CmdArgs.push_back("-lgcc_pic");
6643 } else {
6644 CmdArgs.push_back("-lgcc");
6645 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006646 }
6647 }
6648
6649 if (!Args.hasArg(options::OPT_nostdlib) &&
6650 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00006651 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006652 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006653 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00006654 else
6655 CmdArgs.push_back(Args.MakeArgString(
6656 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006657 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00006658 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006659 }
6660
Bill Wendling08760582011-06-27 19:15:03 +00006661 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006662
Daniel Dunbarcc912342009-05-02 18:28:39 +00006663 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006664 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006665 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006666}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006667
6668void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6669 const InputInfo &Output,
6670 const InputInfoList &Inputs,
6671 const ArgList &Args,
6672 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006673 ArgStringList CmdArgs;
6674
6675 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006676 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6677 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006678 } else {
6679 assert(Output.isNothing() && "Invalid output.");
6680 }
6681
6682 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg32e3b722013-08-09 17:38:42 +00006683 !Args.hasArg(options::OPT_nostartfiles) &&
6684 !C.getDriver().IsCLMode()) {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006685 CmdArgs.push_back("-defaultlib:libcmt");
6686 }
6687
6688 CmdArgs.push_back("-nologo");
6689
Hans Wennborgf1a74252013-09-10 20:18:04 +00006690 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
6691
6692 if (DLL) {
6693 CmdArgs.push_back(Args.MakeArgString("-dll"));
6694
6695 SmallString<128> ImplibName(Output.getFilename());
6696 llvm::sys::path::replace_extension(ImplibName, "lib");
6697 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
6698 ImplibName.str()));
6699 }
6700
Hans Wennborg65f17522013-08-27 18:10:21 +00006701 if (getToolChain().getDriver().getOrParseSanitizerArgs(Args).needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00006702 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00006703 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborg65f17522013-08-27 18:10:21 +00006704 SmallString<128> LibSanitizer(getToolChain().getDriver().ResourceDir);
Hans Wennborgf1a74252013-09-10 20:18:04 +00006705 llvm::sys::path::append(LibSanitizer, "lib", "windows");
6706 if (DLL) {
Timur Iskhodzhanov3b6adcb62013-09-11 11:45:31 +00006707 llvm::sys::path::append(LibSanitizer, "clang_rt.asan_dll_thunk-i386.lib");
Hans Wennborgf1a74252013-09-10 20:18:04 +00006708 } else {
6709 llvm::sys::path::append(LibSanitizer, "clang_rt.asan-i386.lib");
6710 }
6711 // FIXME: Handle 64-bit.
Hans Wennborg65f17522013-08-27 18:10:21 +00006712 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
6713 }
6714
Michael J. Spencere2f49362012-06-18 16:56:04 +00006715 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg2e274592013-08-13 23:38:57 +00006716 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00006717
6718 // Add filenames immediately.
6719 for (InputInfoList::const_iterator
6720 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6721 if (it->isFilename())
6722 CmdArgs.push_back(it->getFilename());
Hans Wennborgbe4a6762013-08-14 01:24:35 +00006723 else
6724 it->getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencere2f49362012-06-18 16:56:04 +00006725 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006726
6727 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006728 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006729 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6730}
Hans Wennborg87cfa712013-09-19 20:32:16 +00006731
6732void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
6733 const InputInfo &Output,
6734 const InputInfoList &Inputs,
6735 const ArgList &Args,
6736 const char *LinkingOutput) const {
6737 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
6738}
6739
Hans Wennborg188382e2013-09-20 18:16:35 +00006740// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
6741// If one cannot be found, return FallbackName.
6742// We do this special search to prevent clang-cl from falling back onto itself
6743// if it's available as cl.exe on the path.
6744static std::string FindFallback(const char *FallbackName,
6745 const char *ClangProgramPath) {
6746 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
6747 if (!OptPath.hasValue())
6748 return FallbackName;
6749
6750#ifdef LLVM_ON_WIN32
6751 const StringRef PathSeparators = ";";
6752#else
6753 const StringRef PathSeparators = ":";
6754#endif
6755
6756 SmallVector<StringRef, 8> PathSegments;
6757 llvm::SplitString(OptPath.getValue(), PathSegments, PathSeparators);
6758
6759 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
6760 const StringRef &PathSegment = PathSegments[i];
6761 if (PathSegment.empty())
6762 continue;
6763
6764 SmallString<128> FilePath(PathSegment);
6765 llvm::sys::path::append(FilePath, FallbackName);
6766 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
6767 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
6768 return FilePath.str();
6769 }
6770
6771 return FallbackName;
6772}
6773
Hans Wennborg87cfa712013-09-19 20:32:16 +00006774Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
6775 const InputInfo &Output,
6776 const InputInfoList &Inputs,
6777 const ArgList &Args,
6778 const char *LinkingOutput) const {
6779 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00006780 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00006781 CmdArgs.push_back("/c"); // Compile only.
6782 CmdArgs.push_back("/W0"); // No warnings.
6783
6784 // The goal is to be able to invoke this tool correctly based on
6785 // any flag accepted by clang-cl.
6786
6787 // These are spelled the same way in clang and cl.exe,.
6788 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
6789 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00006790
6791 // Optimization level.
6792 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
6793 if (A->getOption().getID() == options::OPT_O0) {
6794 CmdArgs.push_back("/Od");
6795 } else {
6796 StringRef OptLevel = A->getValue();
6797 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
6798 A->render(Args, CmdArgs);
6799 else if (OptLevel == "3")
6800 CmdArgs.push_back("/Ox");
6801 }
6802 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00006803
6804 // Flags for which clang-cl have an alias.
6805 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
6806
6807 if (Arg *A = Args.getLastArg(options::OPT_frtti, options::OPT_fno_rtti))
6808 CmdArgs.push_back(A->getOption().getID() == options::OPT_frtti ? "/GR"
6809 : "/GR-");
6810 if (Args.hasArg(options::OPT_fsyntax_only))
6811 CmdArgs.push_back("/Zs");
6812
Hans Wennborg260ff402013-09-27 17:54:18 +00006813 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
6814 for (size_t I = 0, E = Includes.size(); I != E; ++I)
6815 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Includes[I]));
6816
Hans Wennborg87cfa712013-09-19 20:32:16 +00006817 // Flags that can simply be passed through.
6818 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
6819 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
6820
6821 // The order of these flags is relevant, so pick the last one.
6822 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
6823 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
6824 A->render(Args, CmdArgs);
6825
6826
6827 // Input filename.
6828 assert(Inputs.size() == 1);
6829 const InputInfo &II = Inputs[0];
6830 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
6831 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
6832 if (II.isFilename())
6833 CmdArgs.push_back(II.getFilename());
6834 else
6835 II.getInputArg().renderAsInput(Args, CmdArgs);
6836
6837 // Output filename.
6838 assert(Output.getType() == types::TY_Object);
6839 const char *Fo = Args.MakeArgString(std::string("/Fo") +
6840 Output.getFilename());
6841 CmdArgs.push_back(Fo);
6842
Hans Wennborg188382e2013-09-20 18:16:35 +00006843 const Driver &D = getToolChain().getDriver();
6844 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborg87cfa712013-09-19 20:32:16 +00006845
Hans Wennborg188382e2013-09-20 18:16:35 +00006846 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00006847}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00006848
6849
6850/// XCore Tools
6851// We pass assemble and link construction to the xcc tool.
6852
6853void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6854 const InputInfo &Output,
6855 const InputInfoList &Inputs,
6856 const ArgList &Args,
6857 const char *LinkingOutput) const {
6858 ArgStringList CmdArgs;
6859
6860 CmdArgs.push_back("-o");
6861 CmdArgs.push_back(Output.getFilename());
6862
6863 CmdArgs.push_back("-c");
6864
6865 if (Args.hasArg(options::OPT_g_Group)) {
6866 CmdArgs.push_back("-g");
6867 }
6868
6869 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6870 options::OPT_Xassembler);
6871
6872 for (InputInfoList::const_iterator
6873 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6874 const InputInfo &II = *it;
6875 CmdArgs.push_back(II.getFilename());
6876 }
6877
6878 const char *Exec =
6879 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
6880 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6881}
6882
6883void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
6884 const InputInfo &Output,
6885 const InputInfoList &Inputs,
6886 const ArgList &Args,
6887 const char *LinkingOutput) const {
6888 ArgStringList CmdArgs;
6889
6890 if (Output.isFilename()) {
6891 CmdArgs.push_back("-o");
6892 CmdArgs.push_back(Output.getFilename());
6893 } else {
6894 assert(Output.isNothing() && "Invalid output.");
6895 }
6896
6897 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6898
6899 const char *Exec =
6900 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
6901 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6902}