blob: 397f641f1b6d48b3948306549a64afb31795f7e4 [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");
776}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000777
778void Clang::AddARMTargetArgs(const ArgList &Args,
779 ArgStringList &CmdArgs,
780 bool KernelOrKext) const {
781 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000782 // Get the effective triple, which takes into account the deployment target.
783 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
784 llvm::Triple Triple(TripleStr);
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000785 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000786
787 // Select the ABI to use.
788 //
789 // FIXME: Support -meabi.
790 const char *ABIName = 0;
791 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000792 ABIName = A->getValue();
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000793 } else if (Triple.isOSDarwin()) {
794 // The backend is hardwired to assume AAPCS for M-class processors, ensure
795 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000796 if (Triple.getEnvironment() == llvm::Triple::EABI ||
797 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000798 ABIName = "aapcs";
799 } else {
800 ABIName = "apcs-gnu";
801 }
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000802 } else {
803 // Select the default based on the platform.
804 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000805 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000806 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000807 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000808 ABIName = "aapcs-linux";
809 break;
810 case llvm::Triple::EABI:
811 ABIName = "aapcs";
812 break;
813 default:
814 ABIName = "apcs-gnu";
815 }
816 }
817 CmdArgs.push_back("-target-abi");
818 CmdArgs.push_back(ABIName);
819
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000820 // Determine floating point ABI from the options & target defaults.
821 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000822 if (FloatABI == "soft") {
823 // Floating point operations and argument passing are soft.
824 //
825 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000826 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000827 CmdArgs.push_back("-mfloat-abi");
828 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000829 } else if (FloatABI == "softfp") {
830 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000831 CmdArgs.push_back("-mfloat-abi");
832 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000833 } else {
834 // Floating point operations and argument passing are hard.
835 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000836 CmdArgs.push_back("-mfloat-abi");
837 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000838 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000839
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000840 // Kernel code has more strict alignment requirements.
841 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000842 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000843 CmdArgs.push_back("-backend-option");
844 CmdArgs.push_back("-arm-long-calls");
845 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000846
Daniel Dunbar12100e22011-03-22 16:48:17 +0000847 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000848 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000849
850 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000851 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000852 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000853 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000854
855 // Setting -mno-global-merge disables the codegen global merge pass. Setting
856 // -mglobal-merge has no effect as the pass is enabled by default.
857 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
858 options::OPT_mno_global_merge)) {
859 if (A->getOption().matches(options::OPT_mno_global_merge))
860 CmdArgs.push_back("-mno-global-merge");
861 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000862
Bob Wilson9c8af452013-04-11 18:53:25 +0000863 if (!Args.hasFlag(options::OPT_mimplicit_float,
864 options::OPT_mno_implicit_float,
865 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000866 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000867
868 // llvm does not support reserving registers in general. There is support
869 // for reserving r9 on ARM though (defined as a platform-specific register
870 // in ARM EABI).
871 if (Args.hasArg(options::OPT_ffixed_r9)) {
872 CmdArgs.push_back("-backend-option");
873 CmdArgs.push_back("-arm-reserve-r9");
874 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000875}
876
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000877// Get CPU and ABI names. They are not independent
878// so we have to calculate them together.
879static void getMipsCPUAndABI(const ArgList &Args,
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000880 const llvm::Triple &Triple,
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000881 StringRef &CPUName,
882 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000883 const char *DefMips32CPU = "mips32";
884 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000885
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000886 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000887 options::OPT_mcpu_EQ))
888 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000889
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000890 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000891 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000892 // Convert a GNU style Mips ABI name to the name
893 // accepted by LLVM Mips backend.
894 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
895 .Case("32", "o32")
896 .Case("64", "n64")
897 .Default(ABIName);
898 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000899
900 // Setup default CPU and ABI names.
901 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000902 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000903 default:
904 llvm_unreachable("Unexpected triple arch name");
905 case llvm::Triple::mips:
906 case llvm::Triple::mipsel:
907 CPUName = DefMips32CPU;
908 break;
909 case llvm::Triple::mips64:
910 case llvm::Triple::mips64el:
911 CPUName = DefMips64CPU;
912 break;
913 }
914 }
915
916 if (!ABIName.empty()) {
917 // Deduce CPU name from ABI name.
918 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000919 .Cases("32", "o32", "eabi", DefMips32CPU)
920 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000921 .Default("");
922 }
923 else if (!CPUName.empty()) {
924 // Deduce ABI name from CPU name.
925 ABIName = llvm::StringSwitch<const char *>(CPUName)
926 .Cases("mips32", "mips32r2", "o32")
927 .Cases("mips64", "mips64r2", "n64")
928 .Default("");
929 }
930
931 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000932}
933
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000934// Convert ABI name to the GNU tools acceptable variant.
935static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
936 return llvm::StringSwitch<llvm::StringRef>(ABI)
937 .Case("o32", "32")
938 .Case("n64", "64")
939 .Default(ABI);
940}
941
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000942// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
943// and -mfloat-abi=.
944static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000945 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000946 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000947 options::OPT_mhard_float,
948 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000949 if (A->getOption().matches(options::OPT_msoft_float))
950 FloatABI = "soft";
951 else if (A->getOption().matches(options::OPT_mhard_float))
952 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000953 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000954 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +0000955 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000956 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000957 FloatABI = "hard";
958 }
959 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000960 }
961
962 // If unspecified, choose the default based on the platform.
963 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000964 // Assume "hard", because it's a default value used by gcc.
965 // When we start to recognize specific target MIPS processors,
966 // we will be able to select the default more correctly.
967 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000968 }
969
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000970 return FloatABI;
971}
972
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000973static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000974 std::vector<const char *> &Features,
975 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000976 StringRef FeatureName) {
977 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000978 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000979 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000980 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000981 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000982 }
983}
984
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000985static void getMIPSTargetFeatures(const Driver &D, const ArgList &Args,
986 std::vector<const char *> &Features) {
987 StringRef FloatABI = getMipsFloatABI(D, Args);
988 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
989 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
990 // FIXME: Note, this is a hack. We need to pass the selected float
991 // mode to the MipsTargetInfoBase to define appropriate macros there.
992 // Now it is the only method.
993 Features.push_back("+soft-float");
994 }
995
Simon Atanasyan22127ce2013-09-24 09:09:16 +0000996 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
997 if (StringRef(A->getValue()) == "2008")
998 Features.push_back("+nan2008");
999 }
1000
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001001 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1002 options::OPT_mdouble_float, "single-float");
1003 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1004 "mips16");
1005 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1006 options::OPT_mno_micromips, "micromips");
1007 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1008 "dsp");
1009 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1010 "dspr2");
1011 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1012 "msa");
Daniel Sanders94694172013-10-17 14:55:58 +00001013 AddTargetFeature(Args, Features, options::OPT_mfp64, options::OPT_mfp32,
1014 "fp64");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001015}
1016
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001017void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001018 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001019 const Driver &D = getToolChain().getDriver();
1020 StringRef CPUName;
1021 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001022 const llvm::Triple &Triple = getToolChain().getTriple();
1023 getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001024
1025 CmdArgs.push_back("-target-abi");
1026 CmdArgs.push_back(ABIName.data());
1027
1028 StringRef FloatABI = getMipsFloatABI(D, Args);
1029
Simon Atanasyan81c423c2013-01-10 12:36:19 +00001030 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
1031
1032 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001033 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001034 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001035 CmdArgs.push_back("-mfloat-abi");
1036 CmdArgs.push_back("soft");
1037
Simon Atanasyan81c423c2013-01-10 12:36:19 +00001038 if (FloatABI == "hard" && IsMips16) {
1039 CmdArgs.push_back("-mllvm");
1040 CmdArgs.push_back("-mips16-hard-float");
1041 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001042 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001043 else {
1044 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001045 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001046 CmdArgs.push_back("-mfloat-abi");
1047 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001048 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001049
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001050 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1051 if (A->getOption().matches(options::OPT_mxgot)) {
1052 CmdArgs.push_back("-mllvm");
1053 CmdArgs.push_back("-mxgot");
1054 }
1055 }
1056
Simon Atanasyanc580b322013-05-11 06:33:44 +00001057 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1058 options::OPT_mno_ldc1_sdc1)) {
1059 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1060 CmdArgs.push_back("-mllvm");
1061 CmdArgs.push_back("-mno-ldc1-sdc1");
1062 }
1063 }
1064
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001065 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1066 options::OPT_mno_check_zero_division)) {
1067 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1068 CmdArgs.push_back("-mllvm");
1069 CmdArgs.push_back("-mno-check-zero-division");
1070 }
1071 }
1072
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001073 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001074 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001075 CmdArgs.push_back("-mllvm");
1076 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1077 A->claim();
1078 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001079}
1080
Hal Finkel8eb59282012-06-11 22:35:19 +00001081/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1082static std::string getPPCTargetCPU(const ArgList &Args) {
1083 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001084 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001085
1086 if (CPUName == "native") {
1087 std::string CPU = llvm::sys::getHostCPUName();
1088 if (!CPU.empty() && CPU != "generic")
1089 return CPU;
1090 else
1091 return "";
1092 }
1093
1094 return llvm::StringSwitch<const char *>(CPUName)
1095 .Case("common", "generic")
1096 .Case("440", "440")
1097 .Case("440fp", "440")
1098 .Case("450", "450")
1099 .Case("601", "601")
1100 .Case("602", "602")
1101 .Case("603", "603")
1102 .Case("603e", "603e")
1103 .Case("603ev", "603ev")
1104 .Case("604", "604")
1105 .Case("604e", "604e")
1106 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001107 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001108 .Case("G3", "g3")
1109 .Case("7400", "7400")
1110 .Case("G4", "g4")
1111 .Case("7450", "7450")
1112 .Case("G4+", "g4+")
1113 .Case("750", "750")
1114 .Case("970", "970")
1115 .Case("G5", "g5")
1116 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001117 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001118 .Case("e500mc", "e500mc")
1119 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001120 .Case("power3", "pwr3")
1121 .Case("power4", "pwr4")
1122 .Case("power5", "pwr5")
1123 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001124 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001125 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001126 .Case("power7", "pwr7")
Bill Schmidt38378a02013-02-01 20:23:10 +00001127 .Case("pwr3", "pwr3")
1128 .Case("pwr4", "pwr4")
1129 .Case("pwr5", "pwr5")
1130 .Case("pwr5x", "pwr5x")
1131 .Case("pwr6", "pwr6")
1132 .Case("pwr6x", "pwr6x")
1133 .Case("pwr7", "pwr7")
Hal Finkel8eb59282012-06-11 22:35:19 +00001134 .Case("powerpc", "ppc")
1135 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001136 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001137 .Default("");
1138 }
1139
1140 return "";
1141}
1142
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001143static void getPPCTargetFeatures(const ArgList &Args,
1144 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001145 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1146 ie = Args.filtered_end();
1147 it != ie; ++it) {
1148 StringRef Name = (*it)->getOption().getName();
1149 (*it)->claim();
1150
1151 // Skip over "-m".
1152 assert(Name.startswith("m") && "Invalid feature name.");
1153 Name = Name.substr(1);
1154
1155 bool IsNegative = Name.startswith("no-");
1156 if (IsNegative)
1157 Name = Name.substr(3);
1158
1159 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1160 // pass the correct option to the backend while calling the frontend
1161 // option the same.
1162 // TODO: Change the LLVM backend option maybe?
1163 if (Name == "mfcrf")
1164 Name = "mfocrf";
1165
1166 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1167 }
1168
1169 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001170 AddTargetFeature(Args, Features, options::OPT_faltivec,
1171 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001172}
1173
Tom Stellard6674c702013-04-01 20:56:53 +00001174/// Get the (LLVM) name of the R600 gpu we are targeting.
1175static std::string getR600TargetGPU(const ArgList &Args) {
1176 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001177 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001178 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001179 .Cases("rv630", "rv635", "r600")
1180 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001181 .Case("rv740", "rv770")
1182 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001183 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001184 .Case("hemlock", "cypress")
1185 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001186 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001187 }
1188 return "";
1189}
1190
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001191static void getSparcTargetFeatures(const ArgList &Args,
1192 std::vector<const char *> Features) {
1193 bool SoftFloatABI = true;
1194 if (Arg *A =
1195 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1196 if (A->getOption().matches(options::OPT_mhard_float))
1197 SoftFloatABI = false;
1198 }
1199 if (SoftFloatABI)
1200 Features.push_back("+soft-float");
1201}
1202
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001203void Clang::AddSparcTargetArgs(const ArgList &Args,
1204 ArgStringList &CmdArgs) const {
1205 const Driver &D = getToolChain().getDriver();
1206
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001207 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001208 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001209 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1210 options::OPT_mhard_float)) {
1211 if (A->getOption().matches(options::OPT_msoft_float))
1212 FloatABI = "soft";
1213 else if (A->getOption().matches(options::OPT_mhard_float))
1214 FloatABI = "hard";
1215 }
1216
1217 // If unspecified, choose the default based on the platform.
1218 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001219 // Assume "soft", but warn the user we are guessing.
1220 FloatABI = "soft";
1221 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001222 }
1223
1224 if (FloatABI == "soft") {
1225 // Floating point operations and argument passing are soft.
1226 //
1227 // FIXME: This changes CPP defines, we need -target-soft-float.
1228 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001229 } else {
1230 assert(FloatABI == "hard" && "Invalid float abi!");
1231 CmdArgs.push_back("-mhard-float");
1232 }
1233}
1234
Richard Sandiford4652d892013-07-19 16:51:51 +00001235static const char *getSystemZTargetCPU(const ArgList &Args) {
1236 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1237 return A->getValue();
1238 return "z10";
1239}
1240
Chandler Carruth953fb082013-01-13 11:46:33 +00001241static const char *getX86TargetCPU(const ArgList &Args,
1242 const llvm::Triple &Triple) {
1243 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1244 if (StringRef(A->getValue()) != "native")
1245 return A->getValue();
1246
1247 // FIXME: Reject attempts to use -march=native unless the target matches
1248 // the host.
1249 //
1250 // FIXME: We should also incorporate the detected target features for use
1251 // with -native.
1252 std::string CPU = llvm::sys::getHostCPUName();
1253 if (!CPU.empty() && CPU != "generic")
1254 return Args.MakeArgString(CPU);
1255 }
1256
1257 // Select the default CPU if none was given (or detection failed).
1258
1259 if (Triple.getArch() != llvm::Triple::x86_64 &&
1260 Triple.getArch() != llvm::Triple::x86)
1261 return 0; // This routine is only handling x86 targets.
1262
1263 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1264
1265 // FIXME: Need target hooks.
1266 if (Triple.isOSDarwin())
1267 return Is64Bit ? "core2" : "yonah";
1268
Chandler Carruth953fb082013-01-13 11:46:33 +00001269 // All x86 devices running Android have core2 as their common
1270 // denominator. This makes a better choice than pentium4.
1271 if (Triple.getEnvironment() == llvm::Triple::Android)
1272 return "core2";
1273
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001274 // Everything else goes to x86-64 in 64-bit mode.
1275 if (Is64Bit)
1276 return "x86-64";
1277
1278 switch (Triple.getOS()) {
1279 case llvm::Triple::FreeBSD:
1280 case llvm::Triple::NetBSD:
1281 case llvm::Triple::OpenBSD:
1282 return "i486";
1283 case llvm::Triple::Haiku:
1284 return "i586";
1285 case llvm::Triple::Bitrig:
1286 return "i686";
1287 default:
1288 // Fallback to p4.
1289 return "pentium4";
1290 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001291}
1292
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001293static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1294 switch(T.getArch()) {
1295 default:
1296 return "";
1297
1298 case llvm::Triple::arm:
1299 case llvm::Triple::thumb:
1300 return getARMTargetCPU(Args, T);
1301
1302 case llvm::Triple::mips:
1303 case llvm::Triple::mipsel:
1304 case llvm::Triple::mips64:
1305 case llvm::Triple::mips64el: {
1306 StringRef CPUName;
1307 StringRef ABIName;
1308 getMipsCPUAndABI(Args, T, CPUName, ABIName);
1309 return CPUName;
1310 }
1311
1312 case llvm::Triple::ppc:
1313 case llvm::Triple::ppc64:
1314 case llvm::Triple::ppc64le: {
1315 std::string TargetCPUName = getPPCTargetCPU(Args);
1316 // LLVM may default to generating code for the native CPU,
1317 // but, like gcc, we default to a more generic option for
1318 // each architecture. (except on Darwin)
1319 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1320 if (T.getArch() == llvm::Triple::ppc64)
1321 TargetCPUName = "ppc64";
1322 else if (T.getArch() == llvm::Triple::ppc64le)
1323 TargetCPUName = "ppc64le";
1324 else
1325 TargetCPUName = "ppc";
1326 }
1327 return TargetCPUName;
1328 }
1329
1330 case llvm::Triple::sparc:
1331 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1332 return A->getValue();
1333 return "";
1334
1335 case llvm::Triple::x86:
1336 case llvm::Triple::x86_64:
1337 return getX86TargetCPU(Args, T);
1338
1339 case llvm::Triple::hexagon:
1340 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1341
1342 case llvm::Triple::systemz:
1343 return getSystemZTargetCPU(Args);
1344
1345 case llvm::Triple::r600:
1346 return getR600TargetGPU(Args);
1347 }
1348}
1349
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001350static void getX86TargetFeatures(const ArgList &Args,
1351 std::vector<const char *> &Features) {
1352 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1353 ie = Args.filtered_end();
1354 it != ie; ++it) {
1355 StringRef Name = (*it)->getOption().getName();
1356 (*it)->claim();
1357
1358 // Skip over "-m".
1359 assert(Name.startswith("m") && "Invalid feature name.");
1360 Name = Name.substr(1);
1361
1362 bool IsNegative = Name.startswith("no-");
1363 if (IsNegative)
1364 Name = Name.substr(3);
1365
1366 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1367 }
1368}
1369
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001370void Clang::AddX86TargetArgs(const ArgList &Args,
1371 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001372 if (!Args.hasFlag(options::OPT_mred_zone,
1373 options::OPT_mno_red_zone,
1374 true) ||
1375 Args.hasArg(options::OPT_mkernel) ||
1376 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001377 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001378
Bob Wilson2616e2e2013-02-10 16:01:41 +00001379 // Default to avoid implicit floating-point for kernel/kext code, but allow
1380 // that to be overridden with -mno-soft-float.
1381 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1382 Args.hasArg(options::OPT_fapple_kext));
1383 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1384 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001385 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001386 options::OPT_mno_implicit_float)) {
1387 const Option &O = A->getOption();
1388 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1389 O.matches(options::OPT_msoft_float));
1390 }
1391 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001392 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001393}
1394
Matthew Curtise8f80a12012-12-06 17:49:03 +00001395static inline bool HasPICArg(const ArgList &Args) {
1396 return Args.hasArg(options::OPT_fPIC)
1397 || Args.hasArg(options::OPT_fpic);
1398}
1399
1400static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1401 return Args.getLastArg(options::OPT_G,
1402 options::OPT_G_EQ,
1403 options::OPT_msmall_data_threshold_EQ);
1404}
1405
1406static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1407 std::string value;
1408 if (HasPICArg(Args))
1409 value = "0";
1410 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1411 value = A->getValue();
1412 A->claim();
1413 }
1414 return value;
1415}
1416
Tony Linthicum76329bf2011-12-12 21:14:55 +00001417void Clang::AddHexagonTargetArgs(const ArgList &Args,
1418 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001419 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001420 CmdArgs.push_back("-mqdsp6-compat");
1421 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001422
Matthew Curtise8f80a12012-12-06 17:49:03 +00001423 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1424 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001425 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001426 CmdArgs.push_back(Args.MakeArgString(
1427 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001428 }
1429
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001430 if (!Args.hasArg(options::OPT_fno_short_enums))
1431 CmdArgs.push_back("-fshort-enums");
1432 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1433 CmdArgs.push_back ("-mllvm");
1434 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1435 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001436 CmdArgs.push_back ("-mllvm");
1437 CmdArgs.push_back ("-machine-sink-split=0");
1438}
1439
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001440static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1441 std::vector<const char *> &Features) {
Tim Northover2fe823a2013-08-01 09:23:19 +00001442 // Honor -mfpu=.
1443 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +00001444 getAArch64FPUFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001445}
1446
1447static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1448 const ArgList &Args, ArgStringList &CmdArgs) {
1449 std::vector<const char *> Features;
1450 switch (Triple.getArch()) {
1451 default:
1452 break;
1453 case llvm::Triple::mips:
1454 case llvm::Triple::mipsel:
1455 case llvm::Triple::mips64:
1456 case llvm::Triple::mips64el:
1457 getMIPSTargetFeatures(D, Args, Features);
1458 break;
1459
1460 case llvm::Triple::arm:
1461 case llvm::Triple::thumb:
1462 getARMTargetFeatures(D, Triple, Args, Features);
1463 break;
1464
1465 case llvm::Triple::ppc:
1466 case llvm::Triple::ppc64:
1467 case llvm::Triple::ppc64le:
1468 getPPCTargetFeatures(Args, Features);
1469 break;
1470 case llvm::Triple::sparc:
1471 getSparcTargetFeatures(Args, Features);
1472 break;
1473 case llvm::Triple::aarch64:
1474 getAArch64TargetFeatures(D, Args, Features);
1475 break;
1476 case llvm::Triple::x86:
1477 case llvm::Triple::x86_64:
1478 getX86TargetFeatures(Args, Features);
1479 break;
1480 }
Rafael Espindola43964802013-08-21 17:34:32 +00001481
1482 // Find the last of each feature.
1483 llvm::StringMap<unsigned> LastOpt;
1484 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1485 const char *Name = Features[I];
1486 assert(Name[0] == '-' || Name[0] == '+');
1487 LastOpt[Name + 1] = I;
1488 }
1489
1490 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1491 // If this feature was overridden, ignore it.
1492 const char *Name = Features[I];
1493 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1494 assert(LastI != LastOpt.end());
1495 unsigned Last = LastI->second;
1496 if (Last != I)
1497 continue;
1498
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001499 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001500 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001501 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001502}
1503
Eric Christopher84fbdb42011-08-19 00:30:14 +00001504static bool
John McCall5fb5df92012-06-20 06:18:46 +00001505shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001506 const llvm::Triple &Triple) {
1507 // We use the zero-cost exception tables for Objective-C if the non-fragile
1508 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1509 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001510 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001511 return true;
1512
Bob Wilson6524dd32011-10-14 05:03:44 +00001513 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001514 return false;
1515
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001516 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001517 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001518 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001519}
1520
Anders Carlssone96ab552011-02-28 02:27:16 +00001521/// addExceptionArgs - Adds exception related arguments to the driver command
1522/// arguments. There's a master flag, -fexceptions and also language specific
1523/// flags to enable/disable C++ and Objective-C exceptions.
1524/// This makes it possible to for example disable C++ exceptions but enable
1525/// Objective-C exceptions.
1526static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1527 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001528 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001529 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001530 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001531 if (KernelOrKext) {
1532 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1533 // arguments now to avoid warnings about unused arguments.
1534 Args.ClaimAllArgs(options::OPT_fexceptions);
1535 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1536 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1537 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1538 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1539 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001540 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001541 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001542
1543 // Exceptions are enabled by default.
1544 bool ExceptionsEnabled = true;
1545
1546 // This keeps track of whether exceptions were explicitly turned on or off.
1547 bool DidHaveExplicitExceptionFlag = false;
1548
Rafael Espindola00a66572009-10-01 13:33:33 +00001549 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1550 options::OPT_fno_exceptions)) {
1551 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001552 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001553 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001554 ExceptionsEnabled = false;
1555
1556 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001557 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001558
Anders Carlssone96ab552011-02-28 02:27:16 +00001559 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001560
Anders Carlssone96ab552011-02-28 02:27:16 +00001561 // Exception tables and cleanups can be enabled with -fexceptions even if the
1562 // language itself doesn't support exceptions.
1563 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1564 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001565
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001566 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1567 // is not necessarily sensible, but follows GCC.
1568 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001569 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001570 options::OPT_fno_objc_exceptions,
1571 true)) {
1572 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001573
Eric Christopher84fbdb42011-08-19 00:30:14 +00001574 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001575 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001576 }
1577
1578 if (types::isCXX(InputType)) {
1579 bool CXXExceptionsEnabled = ExceptionsEnabled;
1580
Eric Christopher84fbdb42011-08-19 00:30:14 +00001581 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1582 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001583 options::OPT_fexceptions,
1584 options::OPT_fno_exceptions)) {
1585 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1586 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001587 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001588 CXXExceptionsEnabled = false;
1589 }
1590
1591 if (CXXExceptionsEnabled) {
1592 CmdArgs.push_back("-fcxx-exceptions");
1593
1594 ShouldUseExceptionTables = true;
1595 }
1596 }
1597
1598 if (ShouldUseExceptionTables)
1599 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001600}
1601
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001602static bool ShouldDisableAutolink(const ArgList &Args,
1603 const ToolChain &TC) {
1604 bool Default = true;
1605 if (TC.getTriple().isOSDarwin()) {
1606 // The native darwin assembler doesn't support the linker_option directives,
1607 // so we disable them if we think the .s file will be passed to it.
1608 Default = TC.useIntegratedAs();
1609 }
1610 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1611 Default);
1612}
1613
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001614static bool ShouldDisableCFI(const ArgList &Args,
1615 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001616 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001617 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001618 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001619 // we disable them if we think the .s file will be passed to it.
Rafael Espindola84b588b2013-03-18 18:10:27 +00001620 Default = TC.useIntegratedAs();
Rafael Espindolaf934f982011-05-17 16:26:17 +00001621 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001622 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher45f2e712012-12-18 00:31:10 +00001623 options::OPT_fno_dwarf2_cfi_asm,
1624 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001625}
1626
Ted Kremenek62093662013-03-12 17:02:12 +00001627static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1628 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001629 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1630 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001631 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001632 return !UseDwarfDirectory;
1633}
1634
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001635/// \brief Check whether the given input tree contains any compilation actions.
1636static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001637 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001638 return true;
1639
1640 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1641 if (ContainsCompileAction(*it))
1642 return true;
1643
1644 return false;
1645}
1646
1647/// \brief Check if -relax-all should be passed to the internal assembler.
1648/// This is done by default when compiling non-assembler source with -O0.
1649static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1650 bool RelaxDefault = true;
1651
1652 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1653 RelaxDefault = A->getOption().matches(options::OPT_O0);
1654
1655 if (RelaxDefault) {
1656 RelaxDefault = false;
1657 for (ActionList::const_iterator it = C.getActions().begin(),
1658 ie = C.getActions().end(); it != ie; ++it) {
1659 if (ContainsCompileAction(*it)) {
1660 RelaxDefault = true;
1661 break;
1662 }
1663 }
1664 }
1665
1666 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1667 RelaxDefault);
1668}
1669
David Blaikie9260ed62013-07-25 21:19:01 +00001670static void CollectArgsForIntegratedAssembler(Compilation &C,
1671 const ArgList &Args,
1672 ArgStringList &CmdArgs,
1673 const Driver &D) {
1674 if (UseRelaxAll(C, Args))
1675 CmdArgs.push_back("-mrelax-all");
1676
1677 // When using an integrated assembler, translate -Wa, and -Xassembler
1678 // options.
1679 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1680 options::OPT_Xassembler),
1681 ie = Args.filtered_end(); it != ie; ++it) {
1682 const Arg *A = *it;
1683 A->claim();
1684
1685 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1686 StringRef Value = A->getValue(i);
1687
1688 if (Value == "-force_cpusubtype_ALL") {
1689 // Do nothing, this is the default and we don't support anything else.
1690 } else if (Value == "-L") {
1691 CmdArgs.push_back("-msave-temp-labels");
1692 } else if (Value == "--fatal-warnings") {
1693 CmdArgs.push_back("-mllvm");
1694 CmdArgs.push_back("-fatal-assembler-warnings");
1695 } else if (Value == "--noexecstack") {
1696 CmdArgs.push_back("-mnoexecstack");
1697 } else {
1698 D.Diag(diag::err_drv_unsupported_option_argument)
1699 << A->getOption().getName() << Value;
1700 }
1701 }
1702 }
1703}
1704
Chandler Carruth36381702013-06-23 11:28:48 +00001705static void addProfileRTLinux(
1706 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1707 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1708 Args.hasArg(options::OPT_fprofile_generate) ||
1709 Args.hasArg(options::OPT_fcreate_profile) ||
1710 Args.hasArg(options::OPT_coverage)))
1711 return;
1712
1713 // The profile runtime is located in the Linux library directory and has name
1714 // "libclang_rt.profile-<ArchName>.a".
1715 SmallString<128> LibProfile(TC.getDriver().ResourceDir);
1716 llvm::sys::path::append(
1717 LibProfile, "lib", "linux",
1718 Twine("libclang_rt.profile-") + TC.getArchName() + ".a");
1719
1720 CmdArgs.push_back(Args.MakeArgString(LibProfile));
1721}
1722
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001723static void addSanitizerRTLinkFlagsLinux(
1724 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smithf3e624c2013-03-23 00:30:08 +00001725 const StringRef Sanitizer, bool BeforeLibStdCXX,
1726 bool ExportSymbols = true) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001727 // Sanitizer runtime is located in the Linux library directory and
1728 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1729 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1730 llvm::sys::path::append(
1731 LibSanitizer, "lib", "linux",
1732 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
Richard Smithcff3cde2013-03-20 23:49:07 +00001733
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001734 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1735 // etc.) so that the linker picks custom versions of the global 'operator
1736 // new' and 'operator delete' symbols. We take the extreme (but simple)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001737 // strategy of inserting it at the front of the link command. It also
1738 // needs to be forced to end up in the executable, so wrap it in
1739 // whole-archive.
Richard Smithcff3cde2013-03-20 23:49:07 +00001740 SmallVector<const char *, 3> LibSanitizerArgs;
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001741 LibSanitizerArgs.push_back("-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001742 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001743 LibSanitizerArgs.push_back("-no-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001744
1745 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1746 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1747
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001748 CmdArgs.push_back("-lpthread");
Evgeniy Stepanov758b5072013-05-24 14:28:03 +00001749 CmdArgs.push_back("-lrt");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001750 CmdArgs.push_back("-ldl");
Richard Smithf3e624c2013-03-23 00:30:08 +00001751
1752 // If possible, use a dynamic symbols file to export the symbols from the
1753 // runtime library. If we can't do so, use -export-dynamic instead to export
1754 // all symbols from the binary.
1755 if (ExportSymbols) {
1756 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1757 CmdArgs.push_back(
1758 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1759 else
1760 CmdArgs.push_back("-export-dynamic");
1761 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001762}
1763
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001764/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1765/// This needs to be called before we add the C run-time (malloc, etc).
1766static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001767 ArgStringList &CmdArgs) {
Nick Lewycky609dd662013-10-11 03:33:53 +00001768 if (TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001769 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1770 llvm::sys::path::append(LibAsan, "lib", "linux",
1771 (Twine("libclang_rt.asan-") +
1772 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay35439df2012-12-04 21:18:26 +00001773 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001774 } else {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001775 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001776 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001777 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001778}
1779
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001780/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1781/// This needs to be called before we add the C run-time (malloc, etc).
1782static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1783 ArgStringList &CmdArgs) {
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, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001786}
1787
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001788/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1789/// This needs to be called before we add the C run-time (malloc, etc).
1790static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1791 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001792 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001793 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001794}
1795
1796/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
1797/// This needs to be called before we add the C run-time (malloc, etc).
1798static void addLsanRTLinux(const ToolChain &TC, const ArgList &Args,
1799 ArgStringList &CmdArgs) {
1800 if (!Args.hasArg(options::OPT_shared))
1801 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001802}
1803
Richard Smithe30752c2012-10-09 19:52:38 +00001804/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1805/// (Linux).
1806static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
Richard Smithcff3cde2013-03-20 23:49:07 +00001807 ArgStringList &CmdArgs, bool IsCXX,
1808 bool HasOtherSanitizerRt) {
Nick Lewycky24921692013-10-19 00:27:23 +00001809 // Need a copy of sanitizer_common. This could come from another sanitizer
1810 // runtime; if we're not including one, include our own copy.
1811 if (!HasOtherSanitizerRt)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001812 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
1813
1814 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
1815
1816 // Only include the bits of the runtime which need a C++ ABI library if
1817 // we're linking in C++ mode.
1818 if (IsCXX)
1819 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smithe30752c2012-10-09 19:52:38 +00001820}
1821
Peter Collingbournec3772752013-08-07 22:47:34 +00001822static void addDfsanRTLinux(const ToolChain &TC, const ArgList &Args,
1823 ArgStringList &CmdArgs) {
1824 if (!Args.hasArg(options::OPT_shared))
1825 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "dfsan", true);
1826}
1827
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001828static bool shouldUseFramePointerForTarget(const ArgList &Args,
1829 const llvm::Triple &Triple) {
1830 switch (Triple.getArch()) {
1831 // Don't use a frame pointer on linux if optimizing for certain targets.
1832 case llvm::Triple::mips64:
1833 case llvm::Triple::mips64el:
1834 case llvm::Triple::mips:
1835 case llvm::Triple::mipsel:
1836 case llvm::Triple::systemz:
1837 case llvm::Triple::x86:
1838 case llvm::Triple::x86_64:
1839 if (Triple.isOSLinux())
1840 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1841 if (!A->getOption().matches(options::OPT_O0))
1842 return false;
1843 return true;
1844 case llvm::Triple::xcore:
1845 return false;
1846 default:
1847 return true;
1848 }
1849}
1850
Rafael Espindola224dd632011-12-14 21:02:23 +00001851static bool shouldUseFramePointer(const ArgList &Args,
1852 const llvm::Triple &Triple) {
1853 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1854 options::OPT_fomit_frame_pointer))
1855 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1856
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001857 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00001858}
1859
Eric Christopherb7d97e92013-04-03 01:58:53 +00001860static bool shouldUseLeafFramePointer(const ArgList &Args,
1861 const llvm::Triple &Triple) {
1862 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1863 options::OPT_momit_leaf_frame_pointer))
1864 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1865
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001866 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00001867}
1868
Rafael Espindolac7367ff2013-08-10 01:40:10 +00001869/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001870static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00001871 SmallString<128> cwd;
1872 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00001873 CmdArgs.push_back("-fdebug-compilation-dir");
1874 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001875 }
1876}
1877
Eric Christopherd3804002013-02-22 20:12:52 +00001878static const char *SplitDebugName(const ArgList &Args,
1879 const InputInfoList &Inputs) {
1880 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1881 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1882 SmallString<128> T(FinalOutput->getValue());
1883 llvm::sys::path::replace_extension(T, "dwo");
1884 return Args.MakeArgString(T);
1885 } else {
1886 // Use the compilation dir.
1887 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1888 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1889 llvm::sys::path::replace_extension(F, "dwo");
1890 T += F;
1891 return Args.MakeArgString(F);
1892 }
1893}
1894
1895static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1896 const Tool &T, const JobAction &JA,
1897 const ArgList &Args, const InputInfo &Output,
1898 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00001899 ArgStringList ExtractArgs;
1900 ExtractArgs.push_back("--extract-dwo");
1901
1902 ArgStringList StripArgs;
1903 StripArgs.push_back("--strip-dwo");
1904
1905 // Grabbing the output of the earlier compile step.
1906 StripArgs.push_back(Output.getFilename());
1907 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00001908 ExtractArgs.push_back(OutFile);
1909
1910 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00001911 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00001912
1913 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00001914 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001915
1916 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00001917 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001918}
1919
Chad Rosierb71f6aa2013-04-24 18:09:54 +00001920static bool isOptimizationLevelFast(const ArgList &Args) {
1921 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1922 if (A->getOption().matches(options::OPT_Ofast))
1923 return true;
1924 return false;
1925}
1926
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001927/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
1928static bool shouldEnableVectorizerAtOLevel(const ArgList &Args) {
1929 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00001930 if (A->getOption().matches(options::OPT_O4) ||
1931 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001932 return true;
1933
1934 if (A->getOption().matches(options::OPT_O0))
1935 return false;
1936
1937 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
1938
Rafael Espindola91780de2013-08-26 14:05:41 +00001939 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001940 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00001941 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001942 return true;
1943
1944 // Don't vectorize -Oz.
1945 if (S == "z")
1946 return false;
1947
1948 unsigned OptLevel = 0;
1949 if (S.getAsInteger(10, OptLevel))
1950 return false;
1951
1952 return OptLevel > 1;
1953 }
1954
1955 return false;
1956}
1957
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001958void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001959 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001960 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001961 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001962 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001963 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1964 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001965 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001966 ArgStringList CmdArgs;
1967
Daniel Dunbare521a892009-03-31 20:53:55 +00001968 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1969
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001970 // Invoke ourselves in -cc1 mode.
1971 //
1972 // FIXME: Implement custom jobs for internal actions.
1973 CmdArgs.push_back("-cc1");
1974
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001975 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001976 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001977 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001978 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001979
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001980 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001981 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001982
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001983 if (isa<AnalyzeJobAction>(JA)) {
1984 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1985 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001986 } else if (isa<MigrateJobAction>(JA)) {
1987 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001988 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001989 if (Output.getType() == types::TY_Dependencies)
1990 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00001991 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001992 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00001993 if (Args.hasArg(options::OPT_rewrite_objc) &&
1994 !Args.hasArg(options::OPT_g_Group))
1995 CmdArgs.push_back("-P");
1996 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00001997 } else if (isa<AssembleJobAction>(JA)) {
1998 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001999
David Blaikie9260ed62013-07-25 21:19:01 +00002000 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002001
2002 // Also ignore explicit -force_cpusubtype_ALL option.
2003 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002004 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002005 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002006 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002007
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002008 if (JA.getType() == types::TY_Nothing)
2009 CmdArgs.push_back("-fsyntax-only");
2010 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002011 CmdArgs.push_back("-emit-pch");
2012 else
2013 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002014 } else {
2015 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002016
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002017 if (JA.getType() == types::TY_Nothing) {
2018 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002019 } else if (JA.getType() == types::TY_LLVM_IR ||
2020 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002021 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002022 } else if (JA.getType() == types::TY_LLVM_BC ||
2023 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002024 CmdArgs.push_back("-emit-llvm-bc");
2025 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002026 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002027 } else if (JA.getType() == types::TY_AST) {
2028 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002029 } else if (JA.getType() == types::TY_ModuleFile) {
2030 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002031 } else if (JA.getType() == types::TY_RewrittenObjC) {
2032 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002033 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002034 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2035 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002036 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002037 } else {
2038 assert(JA.getType() == types::TY_PP_Asm &&
2039 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002040 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002041 }
2042
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002043 // The make clang go fast button.
2044 CmdArgs.push_back("-disable-free");
2045
John McCallbb79b5f2010-02-13 03:50:24 +00002046 // Disable the verification pass in -asserts builds.
2047#ifdef NDEBUG
2048 CmdArgs.push_back("-disable-llvm-verifier");
2049#endif
2050
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002051 // Set the main file name, so that debug info works even with
2052 // -save-temps.
2053 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002054 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002055
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002056 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002057 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002058 if (Args.hasArg(options::OPT_static))
2059 CmdArgs.push_back("-static-define");
2060
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002061 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002062 // Enable region store model by default.
2063 CmdArgs.push_back("-analyzer-store=region");
2064
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002065 // Treat blocks as analysis entry points.
2066 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2067
Ted Kremenek49c79792011-03-24 00:28:47 +00002068 CmdArgs.push_back("-analyzer-eagerly-assume");
2069
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002070 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002071 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002072 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002073
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002074 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
2075 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002076
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002077 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002078 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002079
2080 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002081
Jordan Rose10ad0812013-04-05 17:55:07 +00002082 if (types::isCXX(Inputs[0].getType()))
2083 CmdArgs.push_back("-analyzer-checker=cplusplus");
2084
Ted Kremenek37e96522012-01-26 02:27:38 +00002085 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00002086 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2087 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2088 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2089 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2090 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2091 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002092 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002093
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002094 // Set the output format. The default is plist, for (lame) historical
2095 // reasons.
2096 CmdArgs.push_back("-analyzer-output");
2097 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002098 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002099 else
2100 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002101
Ted Kremenekfe449a22010-03-22 22:32:05 +00002102 // Disable the presentation of standard compiler warnings when
2103 // using --analyze. We only want to show static analyzer diagnostics
2104 // or frontend errors.
2105 CmdArgs.push_back("-w");
2106
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002107 // Add -Xanalyzer arguments when running as analyzer.
2108 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002109 }
2110
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002111 CheckCodeGenerationOptions(D, Args);
2112
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002113 bool PIE = getToolChain().isPIEDefault();
2114 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002115 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002116
Alexey Samsonov090301e2013-04-09 12:28:19 +00002117 // For the PIC and PIE flag options, this logic is different from the
2118 // legacy logic in very old versions of GCC, as that logic was just
2119 // a bug no one had ever fixed. This logic is both more rational and
2120 // consistent with GCC's new logic now that the bugs are fixed. The last
2121 // argument relating to either PIC or PIE wins, and no other argument is
2122 // used. If the last argument is any flavor of the '-fno-...' arguments,
2123 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2124 // at the same level.
2125 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2126 options::OPT_fpic, options::OPT_fno_pic,
2127 options::OPT_fPIE, options::OPT_fno_PIE,
2128 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002129 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2130 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002131 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002132 if (LastPICArg) {
2133 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002134 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2135 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2136 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2137 PIC = PIE || O.matches(options::OPT_fPIC) ||
2138 O.matches(options::OPT_fpic);
2139 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2140 O.matches(options::OPT_fPIC);
2141 } else {
2142 PIE = PIC = false;
2143 }
2144 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002145 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002146
Nick Lewycky609dd662013-10-11 03:33:53 +00002147 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002148 // specified while enabling PIC enabled level 1 PIC, just force it back to
2149 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2150 // informal testing).
2151 if (PIC && getToolChain().getTriple().isOSDarwin())
2152 IsPICLevelTwo |= getToolChain().isPICDefault();
2153
Chandler Carruthc0c04552012-04-08 16:40:35 +00002154 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2155 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002156 llvm::Triple Triple(TripleStr);
Eric Christopher8d56caa2013-02-18 01:16:37 +00002157 if (KernelOrKext &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002158 (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002159 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002160 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002161 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002162
Chandler Carruth76a943b2012-11-19 03:52:03 +00002163 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2164 // This is a very special mode. It trumps the other modes, almost no one
2165 // uses it, and it isn't even valid on any OS but Darwin.
2166 if (!getToolChain().getTriple().isOSDarwin())
2167 D.Diag(diag::err_drv_unsupported_opt_for_target)
2168 << A->getSpelling() << getToolChain().getTriple().str();
2169
2170 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2171
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002172 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002173 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002174
Chandler Carruth76a943b2012-11-19 03:52:03 +00002175 // Only a forced PIC mode can cause the actual compile to have PIC defines
2176 // etc., no flags are sufficient. This behavior was selected to closely
2177 // match that of llvm-gcc and Apple GCC before that.
2178 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2179 CmdArgs.push_back("-pic-level");
2180 CmdArgs.push_back("2");
2181 }
2182 } else {
2183 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2184 // handled in Clang's IRGen by the -pie-level flag.
2185 CmdArgs.push_back("-mrelocation-model");
2186 CmdArgs.push_back(PIC ? "pic" : "static");
2187
2188 if (PIC) {
2189 CmdArgs.push_back("-pic-level");
2190 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2191 if (PIE) {
2192 CmdArgs.push_back("-pie-level");
2193 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2194 }
2195 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002196 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002197
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002198 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2199 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002200 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002201
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002202 // LLVM Code Generator Options.
2203
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002204 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2205 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002206 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002207 }
2208
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002209 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2210 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002211 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002212 D.Diag(diag::err_drv_unsupported_opt_for_target)
2213 << A->getSpelling() << getToolChain().getTriple().str();
2214 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2215 CmdArgs.push_back("-fpcc-struct-return");
2216 } else {
2217 assert(A->getOption().matches(options::OPT_freg_struct_return));
2218 CmdArgs.push_back("-freg-struct-return");
2219 }
2220 }
2221
Roman Divacky65b88cd2011-03-01 17:40:53 +00002222 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2223 CmdArgs.push_back("-mrtd");
2224
Rafael Espindola224dd632011-12-14 21:02:23 +00002225 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002226 CmdArgs.push_back("-mdisable-fp-elim");
2227 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2228 options::OPT_fno_zero_initialized_in_bss))
2229 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002230
2231 bool OFastEnabled = isOptimizationLevelFast(Args);
2232 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2233 // enabled. This alias option is being used to simplify the hasFlag logic.
2234 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2235 options::OPT_fstrict_aliasing;
2236 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00002237 options::OPT_fno_strict_aliasing,
2238 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00002239 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002240 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2241 options::OPT_fno_struct_path_tbaa))
2242 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002243 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2244 false))
2245 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002246 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2247 options::OPT_fno_optimize_sibling_calls))
2248 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002249
Eric Christopher006208c2013-04-04 06:29:47 +00002250 // Handle segmented stacks.
2251 if (Args.hasArg(options::OPT_fsplit_stack))
2252 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002253
2254 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2255 // This alias option is being used to simplify the getLastArg logic.
2256 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2257 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002258
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002259 // Handle various floating point optimization flags, mapping them to the
2260 // appropriate LLVM code generation flags. The pattern for all of these is to
2261 // default off the codegen optimizations, and if any flag enables them and no
2262 // flag disables them after the flag enabling them, enable the codegen
2263 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002264 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002265 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002266 options::OPT_ffinite_math_only,
2267 options::OPT_fno_finite_math_only,
2268 options::OPT_fhonor_infinities,
2269 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002270 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2271 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002272 A->getOption().getID() != options::OPT_fhonor_infinities)
2273 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002274 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002275 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002276 options::OPT_ffinite_math_only,
2277 options::OPT_fno_finite_math_only,
2278 options::OPT_fhonor_nans,
2279 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002280 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2281 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002282 A->getOption().getID() != options::OPT_fhonor_nans)
2283 CmdArgs.push_back("-menable-no-nans");
2284
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002285 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2286 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002287 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002288 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002289 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002290 options::OPT_fno_math_errno)) {
2291 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2292 // However, turning *off* -ffast_math merely restores the toolchain default
2293 // (which may be false).
2294 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2295 A->getOption().getID() == options::OPT_ffast_math ||
2296 A->getOption().getID() == options::OPT_Ofast)
2297 MathErrno = false;
2298 else if (A->getOption().getID() == options::OPT_fmath_errno)
2299 MathErrno = true;
2300 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002301 if (MathErrno)
2302 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002303
2304 // There are several flags which require disabling very specific
2305 // optimizations. Any of these being disabled forces us to turn off the
2306 // entire set of LLVM optimizations, so collect them through all the flag
2307 // madness.
2308 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002309 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002310 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002311 options::OPT_funsafe_math_optimizations,
2312 options::OPT_fno_unsafe_math_optimizations,
2313 options::OPT_fassociative_math,
2314 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002315 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2316 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002317 A->getOption().getID() != options::OPT_fno_associative_math)
2318 AssociativeMath = true;
2319 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002320 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002321 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002322 options::OPT_funsafe_math_optimizations,
2323 options::OPT_fno_unsafe_math_optimizations,
2324 options::OPT_freciprocal_math,
2325 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002326 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2327 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002328 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2329 ReciprocalMath = true;
2330 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002331 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002332 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002333 options::OPT_funsafe_math_optimizations,
2334 options::OPT_fno_unsafe_math_optimizations,
2335 options::OPT_fsigned_zeros,
2336 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002337 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2338 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002339 A->getOption().getID() != options::OPT_fsigned_zeros)
2340 SignedZeros = false;
2341 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002342 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002343 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002344 options::OPT_funsafe_math_optimizations,
2345 options::OPT_fno_unsafe_math_optimizations,
2346 options::OPT_ftrapping_math,
2347 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002348 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2349 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002350 A->getOption().getID() != options::OPT_ftrapping_math)
2351 TrappingMath = false;
2352 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2353 !TrappingMath)
2354 CmdArgs.push_back("-menable-unsafe-fp-math");
2355
Lang Hamesaa53b932012-07-06 00:59:19 +00002356
2357 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002358 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002359 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002360 options::OPT_ffp_contract)) {
2361 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002362 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002363 if (Val == "fast" || Val == "on" || Val == "off") {
2364 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2365 } else {
2366 D.Diag(diag::err_drv_unsupported_option_argument)
2367 << A->getOption().getName() << Val;
2368 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002369 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2370 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002371 // If fast-math is set then set the fp-contract mode to fast.
2372 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2373 }
2374 }
2375
Bob Wilson6a039162012-07-19 03:52:53 +00002376 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2377 // and if we find them, tell the frontend to provide the appropriate
2378 // preprocessor macros. This is distinct from enabling any optimizations as
2379 // these options induce language changes which must survive serialization
2380 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002381 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2382 options::OPT_fno_fast_math))
2383 if (!A->getOption().matches(options::OPT_fno_fast_math))
2384 CmdArgs.push_back("-ffast-math");
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002385 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2386 if (A->getOption().matches(options::OPT_ffinite_math_only))
2387 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002388
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002389 // Decide whether to use verbose asm. Verbose assembly is the default on
2390 // toolchains which have the integrated assembler on by default.
2391 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2392 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002393 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002394 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002395 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002396
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002397 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2398 CmdArgs.push_back("-mdebug-pass");
2399 CmdArgs.push_back("Structure");
2400 }
2401 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2402 CmdArgs.push_back("-mdebug-pass");
2403 CmdArgs.push_back("Arguments");
2404 }
2405
John McCall8517abc2010-02-19 02:45:38 +00002406 // Enable -mconstructor-aliases except on darwin, where we have to
2407 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002408 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002409 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002410
John McCall7ef5cb32011-03-18 02:56:14 +00002411 // Darwin's kernel doesn't support guard variables; just die if we
2412 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002413 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002414 CmdArgs.push_back("-fforbid-guard-variables");
2415
Douglas Gregordbe39272011-02-01 15:15:22 +00002416 if (Args.hasArg(options::OPT_mms_bitfields)) {
2417 CmdArgs.push_back("-mms-bitfields");
2418 }
John McCall8517abc2010-02-19 02:45:38 +00002419
Daniel Dunbar306945d2009-09-16 06:17:29 +00002420 // This is a coarse approximation of what llvm-gcc actually does, both
2421 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2422 // complicated ways.
2423 bool AsynchronousUnwindTables =
2424 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2425 options::OPT_fno_asynchronous_unwind_tables,
2426 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002427 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002428 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2429 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002430 CmdArgs.push_back("-munwind-tables");
2431
Chandler Carruth05fb5852012-11-21 23:40:23 +00002432 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002433
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002434 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2435 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002436 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002437 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002438
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002439 // FIXME: Handle -mtune=.
2440 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002441
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002442 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002443 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002444 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002445 }
2446
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002447 // Add the target cpu
2448 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2449 llvm::Triple ETriple(ETripleStr);
2450 std::string CPU = getCPUName(Args, ETriple);
2451 if (!CPU.empty()) {
2452 CmdArgs.push_back("-target-cpu");
2453 CmdArgs.push_back(Args.MakeArgString(CPU));
2454 }
2455
Rafael Espindolaeb265472013-08-21 21:59:03 +00002456 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2457 CmdArgs.push_back("-mfpmath");
2458 CmdArgs.push_back(A->getValue());
2459 }
2460
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002461 // Add the target features
2462 getTargetFeatures(D, ETriple, Args, CmdArgs);
2463
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002464 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002465 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002466 default:
2467 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002468
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002469 case llvm::Triple::arm:
2470 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002471 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002472 break;
2473
Eric Christopher0b26a612010-03-02 02:41:08 +00002474 case llvm::Triple::mips:
2475 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002476 case llvm::Triple::mips64:
2477 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002478 AddMIPSTargetArgs(Args, CmdArgs);
2479 break;
2480
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002481 case llvm::Triple::sparc:
2482 AddSparcTargetArgs(Args, CmdArgs);
2483 break;
2484
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002485 case llvm::Triple::x86:
2486 case llvm::Triple::x86_64:
2487 AddX86TargetArgs(Args, CmdArgs);
2488 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002489
2490 case llvm::Triple::hexagon:
2491 AddHexagonTargetArgs(Args, CmdArgs);
2492 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002493 }
2494
Hans Wennborg75958c42013-08-08 00:17:41 +00002495 // Add clang-cl arguments.
2496 if (getToolChain().getDriver().IsCLMode())
2497 AddClangCLArgs(Args, CmdArgs);
2498
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002499 // Pass the linker version in use.
2500 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2501 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002502 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002503 }
2504
Eric Christopherb7d97e92013-04-03 01:58:53 +00002505 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002506 CmdArgs.push_back("-momit-leaf-frame-pointer");
2507
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002508 // Explicitly error on some things we know we don't support and can't just
2509 // ignore.
2510 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002511 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2512 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002513 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002514 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002515 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002516 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2517 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002518 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002519 << Unsupported->getOption().getName();
2520 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002521 }
2522
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002523 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002524 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002525 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002526 CmdArgs.push_back("-header-include-file");
2527 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2528 D.CCPrintHeadersFilename : "-");
2529 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002530 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002531 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002532
Chad Rosierbe10f982011-08-02 17:58:04 +00002533 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002534 CmdArgs.push_back("-diagnostic-log-file");
2535 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2536 D.CCLogDiagnosticsFilename : "-");
2537 }
2538
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002539 // Use the last option from "-g" group. "-gline-tables-only"
2540 // is preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002541 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002542 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002543 if (A->getOption().matches(options::OPT_gline_tables_only))
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002544 CmdArgs.push_back("-gline-tables-only");
Manman Ren9691f7f2013-06-19 01:46:49 +00002545 else if (A->getOption().matches(options::OPT_gdwarf_2))
2546 CmdArgs.push_back("-gdwarf-2");
2547 else if (A->getOption().matches(options::OPT_gdwarf_3))
2548 CmdArgs.push_back("-gdwarf-3");
2549 else if (A->getOption().matches(options::OPT_gdwarf_4))
2550 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002551 else if (!A->getOption().matches(options::OPT_g0) &&
Manman Ren38db0922013-07-02 23:15:25 +00002552 !A->getOption().matches(options::OPT_ggdb0)) {
2553 // Default is dwarf-2 for darwin.
2554 if (getToolChain().getTriple().isOSDarwin())
2555 CmdArgs.push_back("-gdwarf-2");
2556 else
2557 CmdArgs.push_back("-g");
2558 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002559 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002560
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002561 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2562 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002563 if (Args.hasArg(options::OPT_gcolumn_info))
2564 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002565
Eric Christopher138c32b2013-09-13 22:37:55 +00002566 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002567 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2568 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00002569 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002570 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00002571 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002572 CmdArgs.push_back("-g");
2573 CmdArgs.push_back("-backend-option");
2574 CmdArgs.push_back("-split-dwarf=Enable");
2575 }
2576
Eric Christopher138c32b2013-09-13 22:37:55 +00002577 // -ggnu-pubnames turns on gnu style pubnames in the backend.
2578 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2579 CmdArgs.push_back("-backend-option");
2580 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2581 }
Eric Christophereec89c22013-06-18 00:03:50 +00002582
2583 Args.AddAllArgs(CmdArgs, options::OPT_fdebug_types_section);
2584
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002585 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2586 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2587
Chris Lattner3c77a352010-06-22 00:03:40 +00002588 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2589
Nick Lewycky207bce32011-04-21 23:44:07 +00002590 if (Args.hasArg(options::OPT_ftest_coverage) ||
2591 Args.hasArg(options::OPT_coverage))
2592 CmdArgs.push_back("-femit-coverage-notes");
2593 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2594 Args.hasArg(options::OPT_coverage))
2595 CmdArgs.push_back("-femit-coverage-data");
2596
Nick Lewycky480cb992011-05-04 20:46:58 +00002597 if (C.getArgs().hasArg(options::OPT_c) ||
2598 C.getArgs().hasArg(options::OPT_S)) {
2599 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002600 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00002601 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00002602 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002603 SmallString<128> Pwd;
2604 if (!llvm::sys::fs::current_path(Pwd)) {
2605 llvm::sys::path::append(Pwd, CoverageFilename.str());
2606 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00002607 }
2608 }
Eric Christophere30f61c2013-02-22 00:24:40 +00002609 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002610 }
2611 }
2612
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002613 // Pass options for controlling the default header search paths.
2614 if (Args.hasArg(options::OPT_nostdinc)) {
2615 CmdArgs.push_back("-nostdsysteminc");
2616 CmdArgs.push_back("-nobuiltininc");
2617 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002618 if (Args.hasArg(options::OPT_nostdlibinc))
2619 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002620 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2621 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2622 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002623
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002624 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002625 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002626 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002627
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002628 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2629
Ted Kremenekf7639e12012-03-06 20:06:33 +00002630 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00002631 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002632 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002633 options::OPT_ccc_arcmt_modify,
2634 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002635 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002636 switch (A->getOption().getID()) {
2637 default:
2638 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002639 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002640 CmdArgs.push_back("-arcmt-check");
2641 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002642 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002643 CmdArgs.push_back("-arcmt-modify");
2644 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002645 case options::OPT_ccc_arcmt_migrate:
2646 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002647 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002648 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002649
2650 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2651 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002652 break;
John McCalld70fb982011-06-15 23:25:17 +00002653 }
2654 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00002655 } else {
2656 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2657 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2658 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00002659 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002660
Ted Kremenekf7639e12012-03-06 20:06:33 +00002661 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2662 if (ARCMTEnabled) {
2663 D.Diag(diag::err_drv_argument_not_allowed_with)
2664 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2665 }
2666 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002667 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002668
2669 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002670 options::OPT_objcmt_migrate_subscripting,
2671 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002672 // None specified, means enable them all.
2673 CmdArgs.push_back("-objcmt-migrate-literals");
2674 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002675 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002676 } else {
2677 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2678 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002679 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00002680 }
2681 }
2682
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002683 // Add preprocessing options like -I, -D, etc. if we are using the
2684 // preprocessor.
2685 //
2686 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002687 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00002688 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002689
Rafael Espindolaa7431922011-07-21 23:40:37 +00002690 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2691 // that "The compiler can only warn and ignore the option if not recognized".
2692 // When building with ccache, it will pass -D options to clang even on
2693 // preprocessed inputs and configure concludes that -fPIC is not supported.
2694 Args.ClaimAllArgs(options::OPT_D);
2695
Rafael Espindolaad70d962013-08-27 16:58:15 +00002696 // Manually translate -O4 to -O3; let clang reject others.
2697 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2698 if (A->getOption().matches(options::OPT_O4)) {
2699 CmdArgs.push_back("-O3");
2700 D.Diag(diag::warn_O4_is_O3);
2701 } else {
2702 A->render(Args, CmdArgs);
2703 }
2704 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002705
Chad Rosier86b82082012-12-12 20:06:31 +00002706 // Don't warn about unused -flto. This can happen when we're preprocessing or
2707 // precompiling.
2708 Args.ClaimAllArgs(options::OPT_flto);
2709
Daniel Dunbar945577c2009-10-29 02:24:45 +00002710 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002711 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2712 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002713 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002714 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002715
2716 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00002717 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002718 //
2719 // If a std is supplied, only add -trigraphs if it follows the
2720 // option.
2721 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2722 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002723 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002724 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002725 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002726 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002727 else
2728 Std->render(Args, CmdArgs);
2729
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002730 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2731 options::OPT_trigraphs))
2732 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002733 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002734 } else {
2735 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002736 //
2737 // FIXME: Clang doesn't correctly handle -std= when the input language
2738 // doesn't match. For the time being just ignore this for C++ inputs;
2739 // eventually we want to do all the standard defaulting here instead of
2740 // splitting it between the driver and clang -cc1.
2741 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002742 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2743 "-std=", /*Joined=*/true);
2744 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2745 CmdArgs.push_back("-std=c++11");
2746
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002747 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002748 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002749
Richard Smith282b4492013-09-04 22:50:31 +00002750 // GCC's behavior for -Wwrite-strings is a bit strange:
2751 // * In C, this "warning flag" changes the types of string literals from
2752 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
2753 // for the discarded qualifier.
2754 // * In C++, this is just a normal warning flag.
2755 //
2756 // Implementing this warning correctly in C is hard, so we follow GCC's
2757 // behavior for now. FIXME: Directly diagnose uses of a string literal as
2758 // a non-const char* in C, rather than using this crude hack.
2759 if (!types::isCXX(InputType)) {
2760 // FIXME: This should behave just like a warning flag, and thus should also
2761 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
2762 Arg *WriteStrings =
2763 Args.getLastArg(options::OPT_Wwrite_strings,
2764 options::OPT_Wno_write_strings, options::OPT_w);
2765 if (WriteStrings &&
2766 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
2767 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00002768 }
2769
Chandler Carruth61fbf622011-04-23 09:27:53 +00002770 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002771 // during C++ compilation, which it is by default. GCC keeps this define even
2772 // in the presence of '-w', match this behavior bug-for-bug.
2773 if (types::isCXX(InputType) &&
2774 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2775 true)) {
2776 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002777 }
2778
Chandler Carruthe0391482010-05-22 02:21:53 +00002779 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2780 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2781 if (Asm->getOption().matches(options::OPT_fasm))
2782 CmdArgs.push_back("-fgnu-keywords");
2783 else
2784 CmdArgs.push_back("-fno-gnu-keywords");
2785 }
2786
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002787 if (ShouldDisableCFI(Args, getToolChain()))
2788 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002789
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002790 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2791 CmdArgs.push_back("-fno-dwarf-directory-asm");
2792
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002793 if (ShouldDisableAutolink(Args, getToolChain()))
2794 CmdArgs.push_back("-fno-autolink");
2795
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002796 // Add in -fdebug-compilation-dir if necessary.
2797 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00002798
Richard Smith9a568822011-11-21 19:36:32 +00002799 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2800 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002801 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002802 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002803 }
2804
Richard Smith9a568822011-11-21 19:36:32 +00002805 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2806 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002807 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00002808 }
2809
Richard Smitha3d3bd22013-05-08 02:12:03 +00002810 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
2811 CmdArgs.push_back("-fconstexpr-steps");
2812 CmdArgs.push_back(A->getValue());
2813 }
2814
Richard Smithb3a14522013-02-22 01:59:51 +00002815 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2816 CmdArgs.push_back("-fbracket-depth");
2817 CmdArgs.push_back(A->getValue());
2818 }
2819
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002820 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2821 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002822 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002823 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002824 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2825 } else
2826 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002827 }
2828
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002829
Michael J. Spencer929fccd2012-10-22 22:13:48 +00002830 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002831 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002832
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002833 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2834 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00002835 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002836 }
David Chisnall5778fce2009-08-31 16:41:57 +00002837
Chris Lattnere23003d2010-01-09 21:54:33 +00002838 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2839 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00002840 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00002841 }
2842
Chris Lattnerb35583d2010-04-07 20:49:23 +00002843 CmdArgs.push_back("-ferror-limit");
2844 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00002845 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00002846 else
2847 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002848
Chandler Carrutha77a7272010-05-06 04:55:18 +00002849 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2850 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002851 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002852 }
2853
2854 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2855 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002856 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002857 }
2858
Richard Smithf6f003a2011-12-16 19:06:07 +00002859 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2860 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002861 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00002862 }
2863
Daniel Dunbar2c978472009-11-04 06:24:47 +00002864 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002865 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002866 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002867 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00002868 } else {
2869 // If -fmessage-length=N was not specified, determine whether this is a
2870 // terminal and, if so, implicitly define -fmessage-length appropriately.
2871 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002872 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002873 }
2874
John McCallb4a99d32013-02-19 01:57:35 +00002875 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2876 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2877 options::OPT_fvisibility_ms_compat)) {
2878 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2879 CmdArgs.push_back("-fvisibility");
2880 CmdArgs.push_back(A->getValue());
2881 } else {
2882 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2883 CmdArgs.push_back("-fvisibility");
2884 CmdArgs.push_back("hidden");
2885 CmdArgs.push_back("-ftype-visibility");
2886 CmdArgs.push_back("default");
2887 }
Daniel Dunbare357d562009-12-03 18:42:11 +00002888 }
2889
Douglas Gregor08329632010-06-15 17:05:35 +00002890 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002891
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002892 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2893
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002894 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002895 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2896 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002897 CmdArgs.push_back("-ffreestanding");
2898
Daniel Dunbare357d562009-12-03 18:42:11 +00002899 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002900 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002901 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002902 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002903 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002904 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00002905 // AltiVec language extensions aren't relevant for assembling.
2906 if (!isa<PreprocessJobAction>(JA) ||
2907 Output.getType() != types::TY_PP_Asm)
2908 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002909 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2910 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002911
Alexey Samsonov609213f92013-08-19 09:14:21 +00002912 const SanitizerArgs &Sanitize = D.getOrParseSanitizerArgs(Args);
Alexey Samsonove6203662013-08-09 07:42:13 +00002913 Sanitize.addArgs(getToolChain(), Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00002914
Will Dietz3676d562012-12-30 20:53:28 +00002915 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2916 options::OPT_fno_sanitize_recover,
2917 true))
2918 CmdArgs.push_back("-fno-sanitize-recover");
2919
Chad Rosierae229d52013-01-29 23:31:22 +00002920 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2921 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2922 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2923 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2924
Eric Christopher459d2712013-02-19 06:16:53 +00002925 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00002926 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002927 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00002928 getToolChain().getArch() == llvm::Triple::ppc64 ||
2929 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00002930 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00002931 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00002932
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002933 if (getToolChain().SupportsProfiling())
2934 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002935
2936 // -flax-vector-conversions is default.
2937 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2938 options::OPT_fno_lax_vector_conversions))
2939 CmdArgs.push_back("-fno-lax-vector-conversions");
2940
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002941 if (Args.getLastArg(options::OPT_fapple_kext))
2942 CmdArgs.push_back("-fapple-kext");
2943
David Blaikie690f21e2012-06-14 18:55:27 +00002944 if (Args.hasFlag(options::OPT_frewrite_includes,
2945 options::OPT_fno_rewrite_includes, false))
2946 CmdArgs.push_back("-frewrite-includes");
2947
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002948 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002949 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002950 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002951 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2952 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002953
2954 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2955 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00002956 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00002957 }
2958
Bob Wilson14adb362012-02-03 06:27:22 +00002959 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002960
Chandler Carruth6e501032011-03-27 00:04:55 +00002961 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2962 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2963 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2964 options::OPT_fno_wrapv)) {
2965 if (A->getOption().matches(options::OPT_fwrapv))
2966 CmdArgs.push_back("-fwrapv");
2967 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2968 options::OPT_fno_strict_overflow)) {
2969 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2970 CmdArgs.push_back("-fwrapv");
2971 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002972 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00002973 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
2974 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002975
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002976 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2977
Mahesha S6a682be42012-10-27 07:47:56 +00002978
Daniel Dunbar4930e332009-11-17 08:07:36 +00002979 // -stack-protector=0 is default.
2980 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002981 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2982 options::OPT_fstack_protector_all,
2983 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002984 if (A->getOption().matches(options::OPT_fstack_protector))
2985 StackProtectorLevel = 1;
2986 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2987 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002988 } else {
2989 StackProtectorLevel =
2990 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2991 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002992 if (StackProtectorLevel) {
2993 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002994 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002995 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002996
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002997 // --param ssp-buffer-size=
2998 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2999 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003000 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003001 if (Str.startswith("ssp-buffer-size=")) {
3002 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003003 CmdArgs.push_back("-stack-protector-buffer-size");
3004 // FIXME: Verify the argument is a valid integer.
3005 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003006 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003007 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003008 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003009 }
3010
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003011 // Translate -mstackrealign
3012 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3013 false)) {
3014 CmdArgs.push_back("-backend-option");
3015 CmdArgs.push_back("-force-align-stack");
3016 }
3017 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3018 false)) {
3019 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3020 }
3021
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003022 if (Args.hasArg(options::OPT_mstack_alignment)) {
3023 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3024 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003025 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00003026 // -mkernel implies -mstrict-align; don't add the redundant option.
Renato Golina146a482013-08-24 14:44:41 +00003027 if (!KernelOrKext) {
Renato Golin8d5f3142013-08-28 23:56:07 +00003028 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3029 options::OPT_munaligned_access)) {
3030 if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3031 CmdArgs.push_back("-backend-option");
3032 CmdArgs.push_back("-arm-strict-align");
3033 } else {
3034 CmdArgs.push_back("-backend-option");
3035 CmdArgs.push_back("-arm-no-strict-align");
3036 }
Renato Golina146a482013-08-24 14:44:41 +00003037 }
Chad Rosier60027022012-11-09 17:29:19 +00003038 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003039
Daniel Dunbard18049a2009-04-07 21:16:11 +00003040 // Forward -f options with positive and negative forms; we translate
3041 // these by hand.
3042
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003043 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003044 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003045 CmdArgs.push_back("-fapple-kext");
3046 if (!Args.hasArg(options::OPT_fbuiltin))
3047 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003048 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003049 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003050 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003051 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003052 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003053
Nuno Lopes13c88c72009-12-16 16:59:22 +00003054 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3055 options::OPT_fno_assume_sane_operator_new))
3056 CmdArgs.push_back("-fno-assume-sane-operator-new");
3057
Daniel Dunbar4930e332009-11-17 08:07:36 +00003058 // -fblocks=0 is default.
3059 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003060 getToolChain().IsBlocksDefault()) ||
3061 (Args.hasArg(options::OPT_fgnu_runtime) &&
3062 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3063 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003064 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003065
3066 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3067 !getToolChain().hasBlocksRuntime())
3068 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003069 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003070
Douglas Gregor226173a2012-01-18 15:19:58 +00003071 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3072 // users must also pass -fcxx-modules. The latter flag will disappear once the
3073 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003074 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003075 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3076 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3077 options::OPT_fno_cxx_modules,
3078 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003079 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003080 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003081 HaveModules = true;
3082 }
3083 }
3084
Daniel Jasper07e6c402013-08-05 20:26:17 +00003085 // -fmodule-maps enables module map processing (off by default) for header
3086 // checking. It is implied by -fmodules.
3087 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3088 false)) {
3089 CmdArgs.push_back("-fmodule-maps");
3090 }
3091
Daniel Jasperac42b752013-10-21 06:34:34 +00003092 // -fmodules-decluse checks that modules used are declared so (off by
3093 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003094 if (Args.hasFlag(options::OPT_fmodules_decluse,
3095 options::OPT_fno_modules_decluse,
3096 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003097 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003098 }
3099
Daniel Jasperac42b752013-10-21 06:34:34 +00003100 // -fmodule-name specifies the module that is currently being built (or
3101 // used for header checking by -fmodule-maps).
3102 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name)) {
3103 A->claim();
3104 A->render(Args, CmdArgs);
3105 }
3106
3107 // -fmodule-map-file can be used to specify a file containing module
3108 // definitions.
3109 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file)) {
3110 A->claim();
3111 A->render(Args, CmdArgs);
3112 }
3113
Douglas Gregor35b04d62013-02-07 19:01:24 +00003114 // If a module path was provided, pass it along. Otherwise, use a temporary
3115 // directory.
3116 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3117 A->claim();
3118 if (HaveModules) {
3119 A->render(Args, CmdArgs);
3120 }
3121 } else if (HaveModules) {
3122 SmallString<128> DefaultModuleCache;
3123 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3124 DefaultModuleCache);
Douglas Gregor23c7d672013-03-21 21:48:48 +00003125 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3126 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor4bedb492013-02-07 22:59:12 +00003127 const char Arg[] = "-fmodules-cache-path=";
3128 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3129 Arg, Arg + strlen(Arg));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003130 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3131 }
3132
3133 // Pass through all -fmodules-ignore-macro arguments.
3134 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003135 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3136 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003137
John McCalldfea9982010-04-09 19:12:06 +00003138 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003139 if (Args.hasFlag(options::OPT_fno_access_control,
3140 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003141 false))
John McCall3155f572010-04-09 19:03:51 +00003142 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003143
Anders Carlssond470fef2010-11-21 00:09:52 +00003144 // -felide-constructors is the default.
3145 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3146 options::OPT_felide_constructors,
3147 false))
3148 CmdArgs.push_back("-fno-elide-constructors");
3149
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003150 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003151 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00003152 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00003153 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00003154
Richard Smith52be6192012-11-05 22:04:41 +00003155 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003156 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00003157 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00003158 Args.getLastArg(options::OPT_mkernel,
3159 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00003160 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00003161 D.Diag(diag::err_drv_argument_not_allowed_with)
3162 << "-fsanitize=vptr" << NoRttiArg;
3163 }
3164 }
3165
Tony Linthicum76329bf2011-12-12 21:14:55 +00003166 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003167 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003168 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003169 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00003170 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003171 CmdArgs.push_back("-fshort-enums");
3172
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003173 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003174 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003175 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00003176 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00003177
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003178 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003179 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003180 options::OPT_fno_threadsafe_statics))
3181 CmdArgs.push_back("-fno-threadsafe-statics");
3182
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003183 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003184 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3185 options::OPT_fno_use_cxa_atexit,
3186 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00003187 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003188 getToolChain().getArch() != llvm::Triple::hexagon) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00003189 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003190 CmdArgs.push_back("-fno-use-cxa-atexit");
3191
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003192 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003193 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003194 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3195 CmdArgs.push_back("-fms-extensions");
3196
Francois Pichet1b4f1632011-09-17 04:32:15 +00003197 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003198 if (Args.hasFlag(options::OPT_fms_compatibility,
3199 options::OPT_fno_ms_compatibility,
3200 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3201 Args.hasFlag(options::OPT_fms_extensions,
3202 options::OPT_fno_ms_extensions,
3203 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003204 CmdArgs.push_back("-fms-compatibility");
3205
Reid Klecknerc106fda2013-09-18 00:33:59 +00003206 // -fmsc-version=1700 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003207 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3208 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3209 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003210 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003211 if (msc_ver.empty())
Reid Klecknerc106fda2013-09-18 00:33:59 +00003212 CmdArgs.push_back("-fmsc-version=1700");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003213 else
3214 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3215 }
3216
3217
Eric Christopher5ecce122013-02-18 00:38:31 +00003218 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00003219 if (Args.hasFlag(options::OPT_fborland_extensions,
3220 options::OPT_fno_borland_extensions, false))
3221 CmdArgs.push_back("-fborland-extensions");
3222
Francois Pichet02744872011-09-01 16:38:08 +00003223 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3224 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003225 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3226 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00003227 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003228 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003229
Chandler Carruthe03aa552010-04-17 20:17:31 +00003230 // -fgnu-keywords default varies depending on language; only pass if
3231 // specified.
3232 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003233 options::OPT_fno_gnu_keywords))
3234 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00003235
Rafael Espindola922a6242011-06-02 17:30:53 +00003236 if (Args.hasFlag(options::OPT_fgnu89_inline,
3237 options::OPT_fno_gnu89_inline,
3238 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00003239 CmdArgs.push_back("-fgnu89-inline");
3240
Chad Rosier9c76d242012-03-15 22:31:42 +00003241 if (Args.hasArg(options::OPT_fno_inline))
3242 CmdArgs.push_back("-fno-inline");
3243
Chad Rosier64d6be92012-03-06 21:17:19 +00003244 if (Args.hasArg(options::OPT_fno_inline_functions))
3245 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00003246
John McCall5fb5df92012-06-20 06:18:46 +00003247 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00003248
John McCall5fb5df92012-06-20 06:18:46 +00003249 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahaniandaf48312013-10-15 17:16:30 +00003250 // legacy is the default. Next runtime is always legacy dispatch and
3251 // -fno-objc-legacy-dispatch gets ignored silently.
3252 if (objcRuntime.isNonFragile() && !objcRuntime.isNeXTFamily()) {
David Chisnall3154e682011-09-30 13:32:35 +00003253 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3254 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00003255 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003256 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00003257 if (getToolChain().UseObjCMixedDispatch())
3258 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3259 else
3260 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3261 }
3262 }
3263
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00003264 // -fencode-extended-block-signature=1 is default.
3265 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3266 CmdArgs.push_back("-fencode-extended-block-signature");
3267 }
3268
John McCall24fc0de2011-07-06 00:26:06 +00003269 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3270 // NOTE: This logic is duplicated in ToolChains.cpp.
3271 bool ARC = isObjCAutoRefCount(Args);
3272 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00003273 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00003274
John McCall24fc0de2011-07-06 00:26:06 +00003275 CmdArgs.push_back("-fobjc-arc");
3276
Chandler Carruth491db322011-11-04 07:34:47 +00003277 // FIXME: It seems like this entire block, and several around it should be
3278 // wrapped in isObjC, but for now we just use it here as this is where it
3279 // was being used previously.
3280 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3281 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3282 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3283 else
3284 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3285 }
3286
John McCall24fc0de2011-07-06 00:26:06 +00003287 // Allow the user to enable full exceptions code emission.
3288 // We define off for Objective-CC, on for Objective-C++.
3289 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3290 options::OPT_fno_objc_arc_exceptions,
3291 /*default*/ types::isCXX(InputType)))
3292 CmdArgs.push_back("-fobjc-arc-exceptions");
3293 }
3294
3295 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3296 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00003297 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00003298 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003299
John McCall24fc0de2011-07-06 00:26:06 +00003300 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3301 // takes precedence.
3302 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3303 if (!GCArg)
3304 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3305 if (GCArg) {
3306 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003307 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00003308 << GCArg->getAsString(Args);
3309 } else if (getToolChain().SupportsObjCGC()) {
3310 GCArg->render(Args, CmdArgs);
3311 } else {
3312 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003313 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00003314 << GCArg->getAsString(Args);
3315 }
3316 }
3317
John McCallb5f652e2011-06-22 00:53:57 +00003318 // Add exception args.
3319 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00003320 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00003321
3322 if (getToolChain().UseSjLjExceptions())
3323 CmdArgs.push_back("-fsjlj-exceptions");
3324
3325 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00003326 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3327 options::OPT_fno_assume_sane_operator_new))
3328 CmdArgs.push_back("-fno-assume-sane-operator-new");
3329
Daniel Dunbar34d7a992010-04-27 15:34:57 +00003330 // -fconstant-cfstrings is default, and may be subject to argument translation
3331 // on Darwin.
3332 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3333 options::OPT_fno_constant_cfstrings) ||
3334 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3335 options::OPT_mno_constant_cfstrings))
3336 CmdArgs.push_back("-fno-constant-cfstrings");
3337
John Thompsoned4e2952009-11-05 20:14:16 +00003338 // -fshort-wchar default varies depending on platform; only
3339 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00003340 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3341 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00003342
Hans Wennborg28c96312013-07-31 23:39:13 +00003343 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003344 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003345 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003346 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003347 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003348
Daniel Dunbar096ed292011-10-05 21:04:55 +00003349 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3350 // -fno-pack-struct doesn't apply to -fpack-struct=.
3351 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00003352 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00003353 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00003354 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00003355 } else if (Args.hasFlag(options::OPT_fpack_struct,
3356 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00003357 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00003358 }
3359
Robert Lytton0e076492013-08-13 09:43:10 +00003360 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003361 if (!Args.hasArg(options::OPT_fcommon))
3362 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00003363 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003364 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00003365
Daniel Dunbard18049a2009-04-07 21:16:11 +00003366 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003367 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003368 CmdArgs.push_back("-fno-common");
3369
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003370 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00003371 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00003372 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003373 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003374 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003375 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3376
Daniel Dunbar6358d682010-10-15 22:30:42 +00003377 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3378 if (!Args.hasFlag(options::OPT_ffor_scope,
3379 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003380 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00003381 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3382
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00003383 // -fcaret-diagnostics is default.
3384 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3385 options::OPT_fno_caret_diagnostics, true))
3386 CmdArgs.push_back("-fno-caret-diagnostics");
3387
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003388 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00003389 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003390 options::OPT_fno_diagnostics_fixit_info))
3391 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003392
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003393 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00003394 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003395 options::OPT_fno_diagnostics_show_option))
3396 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003397
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003398 if (const Arg *A =
3399 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3400 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00003401 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003402 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003403
Douglas Gregor643c9222011-05-21 17:07:29 +00003404 if (const Arg *A =
3405 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3406 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003407 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003408 }
3409
Chandler Carruthb6766f02011-03-27 01:50:55 +00003410 if (Arg *A = Args.getLastArg(
3411 options::OPT_fdiagnostics_show_note_include_stack,
3412 options::OPT_fno_diagnostics_show_note_include_stack)) {
3413 if (A->getOption().matches(
3414 options::OPT_fdiagnostics_show_note_include_stack))
3415 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3416 else
3417 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3418 }
3419
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003420 // Color diagnostics are the default, unless the terminal doesn't support
3421 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00003422 // Support both clang's -f[no-]color-diagnostics and gcc's
3423 // -f[no-]diagnostics-colors[=never|always|auto].
3424 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3425 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3426 it != ie; ++it) {
3427 const Option &O = (*it)->getOption();
3428 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3429 !O.matches(options::OPT_fdiagnostics_color) &&
3430 !O.matches(options::OPT_fno_color_diagnostics) &&
3431 !O.matches(options::OPT_fno_diagnostics_color) &&
3432 !O.matches(options::OPT_fdiagnostics_color_EQ))
3433 continue;
3434
3435 (*it)->claim();
3436 if (O.matches(options::OPT_fcolor_diagnostics) ||
3437 O.matches(options::OPT_fdiagnostics_color)) {
3438 ShowColors = Colors_On;
3439 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3440 O.matches(options::OPT_fno_diagnostics_color)) {
3441 ShowColors = Colors_Off;
3442 } else {
3443 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3444 StringRef value((*it)->getValue());
3445 if (value == "always")
3446 ShowColors = Colors_On;
3447 else if (value == "never")
3448 ShowColors = Colors_Off;
3449 else if (value == "auto")
3450 ShowColors = Colors_Auto;
3451 else
3452 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3453 << ("-fdiagnostics-color=" + value).str();
3454 }
3455 }
3456 if (ShowColors == Colors_On ||
3457 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003458 CmdArgs.push_back("-fcolor-diagnostics");
3459
Nico Rieck7857d462013-09-11 00:38:02 +00003460 if (Args.hasArg(options::OPT_fansi_escape_codes))
3461 CmdArgs.push_back("-fansi-escape-codes");
3462
Daniel Dunbardb097022009-06-08 21:13:54 +00003463 if (!Args.hasFlag(options::OPT_fshow_source_location,
3464 options::OPT_fno_show_source_location))
3465 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003466
Douglas Gregor643c9222011-05-21 17:07:29 +00003467 if (!Args.hasFlag(options::OPT_fshow_column,
3468 options::OPT_fno_show_column,
3469 true))
3470 CmdArgs.push_back("-fno-show-column");
3471
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00003472 if (!Args.hasFlag(options::OPT_fspell_checking,
3473 options::OPT_fno_spell_checking))
3474 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003475
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003476
Chad Rosierc8e56e82012-12-05 21:08:21 +00003477 // -fno-asm-blocks is default.
3478 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3479 false))
3480 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003481
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003482 // Enable vectorization per default according to the optimization level
3483 // selected. For optimization levels that want vectorization we use the alias
3484 // option to simplify the hasFlag logic.
3485 bool EnableVec = shouldEnableVectorizerAtOLevel(Args);
3486 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00003487 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00003488 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00003489 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003490 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003491
Rafael Espindolaf818ef42013-08-01 23:56:42 +00003492 // -fslp-vectorize is default.
3493 if (Args.hasFlag(options::OPT_fslp_vectorize,
3494 options::OPT_fno_slp_vectorize, true))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00003495 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00003496
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003497 // -fno-slp-vectorize-aggressive is default.
3498 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003499 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003500 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003501
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00003502 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3503 A->render(Args, CmdArgs);
3504
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003505 // -fdollars-in-identifiers default varies depending on platform and
3506 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00003507 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003508 options::OPT_fno_dollars_in_identifiers)) {
3509 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003510 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003511 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003512 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003513 }
3514
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003515 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3516 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00003517 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003518 options::OPT_fno_unit_at_a_time)) {
3519 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003520 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003521 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003522
Eli Friedman055c9702011-11-02 01:53:16 +00003523 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3524 options::OPT_fno_apple_pragma_pack, false))
3525 CmdArgs.push_back("-fapple-pragma-pack");
3526
Eli Benderskyc95cfe82013-07-24 18:20:14 +00003527 // le32-specific flags:
3528 // -fno-math-builtin: clang should not convert math builtins to intrinsics
3529 // by default.
3530 if (getToolChain().getArch() == llvm::Triple::le32) {
3531 CmdArgs.push_back("-fno-math-builtin");
3532 }
3533
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003534 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003535 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003536 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003537#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003538 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003539 (getToolChain().getArch() == llvm::Triple::arm ||
3540 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003541 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3542 CmdArgs.push_back("-fno-builtin-strcat");
3543 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3544 CmdArgs.push_back("-fno-builtin-strcpy");
3545 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003546#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003547
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003548 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003549 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003550 options::OPT_traditional_cpp)) {
3551 if (isa<PreprocessJobAction>(JA))
3552 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003553 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003554 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003555 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003556
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003557 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003558 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003559
3560 // Handle serialized diagnostics.
3561 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3562 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003563 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003564 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003565
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003566 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3567 CmdArgs.push_back("-fretain-comments-from-system-headers");
3568
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003569 // Forward -fcomment-block-commands to -cc1.
3570 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00003571 // Forward -fparse-all-comments to -cc1.
3572 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003573
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003574 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3575 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003576 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003577 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3578 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003579 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003580
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003581 // We translate this by hand to the -cc1 argument, since nightly test uses
3582 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003583 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003584 CmdArgs.push_back("-disable-llvm-optzns");
3585 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003586 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003587 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003588
Daniel Dunbard67a3222009-03-30 06:36:42 +00003589 if (Output.getType() == types::TY_Dependencies) {
3590 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003591 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003592 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003593 CmdArgs.push_back(Output.getFilename());
3594 } else {
3595 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003596 }
3597
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003598 for (InputInfoList::const_iterator
3599 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3600 const InputInfo &II = *it;
3601 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00003602 if (Args.hasArg(options::OPT_rewrite_objc))
3603 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3604 else
3605 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00003606 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003607 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003608 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003609 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003610 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003611
Chris Lattnere9d7d782009-11-03 19:50:27 +00003612 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3613
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003614 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003615
3616 // Optionally embed the -cc1 level arguments into the debug info, for build
3617 // analysis.
3618 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003619 ArgStringList OriginalArgs;
3620 for (ArgList::const_iterator it = Args.begin(),
3621 ie = Args.end(); it != ie; ++it)
3622 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003623
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003624 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003625 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003626 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003627 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003628 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003629 }
3630 CmdArgs.push_back("-dwarf-debug-flags");
3631 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3632 }
3633
Eric Christopherd3804002013-02-22 20:12:52 +00003634 // Add the split debug info name to the command lines here so we
3635 // can propagate it to the backend.
3636 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003637 getToolChain().getTriple().isOSLinux() &&
Eric Christopherf1545832013-02-22 23:50:16 +00003638 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00003639 const char *SplitDwarfOut;
3640 if (SplitDwarf) {
3641 CmdArgs.push_back("-split-dwarf-file");
3642 SplitDwarfOut = SplitDebugName(Args, Inputs);
3643 CmdArgs.push_back(SplitDwarfOut);
3644 }
3645
3646 // Finally add the compile command to the compilation.
Hans Wennborg87cfa712013-09-19 20:32:16 +00003647 if (Args.hasArg(options::OPT__SLASH_fallback)) {
3648 tools::visualstudio::Compile CL(getToolChain());
3649 Command *CLCommand = CL.GetCommand(C, JA, Output, Inputs, Args,
3650 LinkingOutput);
3651 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
3652 } else {
3653 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3654 }
3655
Daniel Dunbar17731772009-03-23 19:03:36 +00003656
Eric Christopherf1545832013-02-22 23:50:16 +00003657 // Handle the debug info splitting at object creation time if we're
3658 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00003659 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00003660 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00003661 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00003662
Roman Divacky178e01602011-02-10 16:52:03 +00003663 if (Arg *A = Args.getLastArg(options::OPT_pg))
3664 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003665 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00003666 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003667
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003668 // Claim some arguments which clang supports automatically.
3669
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00003670 // -fpch-preprocess is used with gcc to add a special marker in the output to
3671 // include the PCH file. Clang's PTH solution is completely transparent, so we
3672 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003673 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003674
Daniel Dunbar17731772009-03-23 19:03:36 +00003675 // Claim some arguments which clang doesn't support, but we don't
3676 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003677 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3678 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00003679
Rafael Espindolab0092d72013-09-04 19:37:35 +00003680 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00003681 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003682}
3683
John McCall5fb5df92012-06-20 06:18:46 +00003684/// Add options related to the Objective-C runtime/ABI.
3685///
3686/// Returns true if the runtime is non-fragile.
3687ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3688 ArgStringList &cmdArgs,
3689 RewriteKind rewriteKind) const {
3690 // Look for the controlling runtime option.
3691 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3692 options::OPT_fgnu_runtime,
3693 options::OPT_fobjc_runtime_EQ);
3694
3695 // Just forward -fobjc-runtime= to the frontend. This supercedes
3696 // options about fragility.
3697 if (runtimeArg &&
3698 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3699 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003700 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003701 if (runtime.tryParse(value)) {
3702 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3703 << value;
3704 }
3705
3706 runtimeArg->render(args, cmdArgs);
3707 return runtime;
3708 }
3709
3710 // Otherwise, we'll need the ABI "version". Version numbers are
3711 // slightly confusing for historical reasons:
3712 // 1 - Traditional "fragile" ABI
3713 // 2 - Non-fragile ABI, version 1
3714 // 3 - Non-fragile ABI, version 2
3715 unsigned objcABIVersion = 1;
3716 // If -fobjc-abi-version= is present, use that to set the version.
3717 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003718 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003719 if (value == "1")
3720 objcABIVersion = 1;
3721 else if (value == "2")
3722 objcABIVersion = 2;
3723 else if (value == "3")
3724 objcABIVersion = 3;
3725 else
3726 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3727 << value;
3728 } else {
3729 // Otherwise, determine if we are using the non-fragile ABI.
3730 bool nonFragileABIIsDefault =
3731 (rewriteKind == RK_NonFragile ||
3732 (rewriteKind == RK_None &&
3733 getToolChain().IsObjCNonFragileABIDefault()));
3734 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3735 options::OPT_fno_objc_nonfragile_abi,
3736 nonFragileABIIsDefault)) {
3737 // Determine the non-fragile ABI version to use.
3738#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3739 unsigned nonFragileABIVersion = 1;
3740#else
3741 unsigned nonFragileABIVersion = 2;
3742#endif
3743
3744 if (Arg *abiArg = args.getLastArg(
3745 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003746 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003747 if (value == "1")
3748 nonFragileABIVersion = 1;
3749 else if (value == "2")
3750 nonFragileABIVersion = 2;
3751 else
3752 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3753 << value;
3754 }
3755
3756 objcABIVersion = 1 + nonFragileABIVersion;
3757 } else {
3758 objcABIVersion = 1;
3759 }
3760 }
3761
3762 // We don't actually care about the ABI version other than whether
3763 // it's non-fragile.
3764 bool isNonFragile = objcABIVersion != 1;
3765
3766 // If we have no runtime argument, ask the toolchain for its default runtime.
3767 // However, the rewriter only really supports the Mac runtime, so assume that.
3768 ObjCRuntime runtime;
3769 if (!runtimeArg) {
3770 switch (rewriteKind) {
3771 case RK_None:
3772 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3773 break;
3774 case RK_Fragile:
3775 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3776 break;
3777 case RK_NonFragile:
3778 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3779 break;
3780 }
3781
3782 // -fnext-runtime
3783 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3784 // On Darwin, make this use the default behavior for the toolchain.
3785 if (getToolChain().getTriple().isOSDarwin()) {
3786 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3787
3788 // Otherwise, build for a generic macosx port.
3789 } else {
3790 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3791 }
3792
3793 // -fgnu-runtime
3794 } else {
3795 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003796 // Legacy behaviour is to target the gnustep runtime if we are i
3797 // non-fragile mode or the GCC runtime in fragile mode.
3798 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003799 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003800 else
3801 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003802 }
3803
3804 cmdArgs.push_back(args.MakeArgString(
3805 "-fobjc-runtime=" + runtime.getAsString()));
3806 return runtime;
3807}
3808
Hans Wennborg75958c42013-08-08 00:17:41 +00003809void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
3810 unsigned RTOptionID = options::OPT__SLASH_MT;
3811
Hans Wennborgf1a74252013-09-10 20:18:04 +00003812 if (Args.hasArg(options::OPT__SLASH_LDd))
3813 // The /LDd option implies /MTd. The dependent lib part can be overridden,
3814 // but defining _DEBUG is sticky.
3815 RTOptionID = options::OPT__SLASH_MTd;
3816
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00003817 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00003818 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00003819
Hans Wennborg75958c42013-08-08 00:17:41 +00003820 switch(RTOptionID) {
3821 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00003822 if (Args.hasArg(options::OPT__SLASH_LDd))
3823 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00003824 CmdArgs.push_back("-D_MT");
3825 CmdArgs.push_back("-D_DLL");
3826 CmdArgs.push_back("--dependent-lib=msvcrt");
3827 break;
3828 case options::OPT__SLASH_MDd:
3829 CmdArgs.push_back("-D_DEBUG");
3830 CmdArgs.push_back("-D_MT");
3831 CmdArgs.push_back("-D_DLL");
3832 CmdArgs.push_back("--dependent-lib=msvcrtd");
3833 break;
3834 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00003835 if (Args.hasArg(options::OPT__SLASH_LDd))
3836 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00003837 CmdArgs.push_back("-D_MT");
3838 CmdArgs.push_back("--dependent-lib=libcmt");
3839 break;
3840 case options::OPT__SLASH_MTd:
3841 CmdArgs.push_back("-D_DEBUG");
3842 CmdArgs.push_back("-D_MT");
3843 CmdArgs.push_back("--dependent-lib=libcmtd");
3844 break;
3845 default:
3846 llvm_unreachable("Unexpected option ID.");
3847 }
3848
Reid Kleckner6beca0e2013-08-08 19:33:10 +00003849 // This provides POSIX compatibility (maps 'open' to '_open'), which most
3850 // users want. The /Za flag to cl.exe turns this off, but it's not
3851 // implemented in clang.
3852 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00003853
3854 // FIXME: Make this default for the win32 triple.
3855 CmdArgs.push_back("-cxx-abi");
3856 CmdArgs.push_back("microsoft");
Hans Wennborg0fd62072013-08-09 00:32:23 +00003857
3858 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
3859 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00003860
3861 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
3862 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00003863 if (Args.hasArg(options::OPT__SLASH_fallback))
3864 CmdArgs.push_back("msvc-fallback");
3865 else
3866 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00003867 }
Hans Wennborg75958c42013-08-08 00:17:41 +00003868}
3869
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003870void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003871 const InputInfo &Output,
3872 const InputInfoList &Inputs,
3873 const ArgList &Args,
3874 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003875 ArgStringList CmdArgs;
3876
3877 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3878 const InputInfo &Input = Inputs[0];
3879
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003880 // Don't warn about "clang -w -c foo.s"
3881 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003882 // and "clang -emit-llvm -c foo.s"
3883 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003884
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003885 // Invoke ourselves in -cc1as mode.
3886 //
3887 // FIXME: Implement custom jobs for internal actions.
3888 CmdArgs.push_back("-cc1as");
3889
3890 // Add the "effective" target triple.
3891 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003892 std::string TripleStr =
3893 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003894 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3895
3896 // Set the output mode, we currently only expect to be used as a real
3897 // assembler.
3898 CmdArgs.push_back("-filetype");
3899 CmdArgs.push_back("obj");
3900
Eric Christopher45f2e712012-12-18 00:31:10 +00003901 // Set the main file name, so that debug info works even with
3902 // -save-temps or preprocessed assembly.
3903 CmdArgs.push_back("-main-file-name");
3904 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3905
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003906 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003907 const llvm::Triple &Triple = getToolChain().getTriple();
3908 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003909 if (!CPU.empty()) {
3910 CmdArgs.push_back("-target-cpu");
3911 CmdArgs.push_back(Args.MakeArgString(CPU));
3912 }
3913
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003914 // Add the target features
3915 const Driver &D = getToolChain().getDriver();
3916 getTargetFeatures(D, Triple, Args, CmdArgs);
Jim Grosbach576452b2012-02-10 20:37:10 +00003917
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003918 // Ignore explicit -force_cpusubtype_ALL option.
3919 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003920
Eric Christopherfc3ee562012-01-10 00:38:01 +00003921 // Determine the original source input.
3922 const Action *SourceAction = &JA;
3923 while (SourceAction->getKind() != Action::InputClass) {
3924 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3925 SourceAction = SourceAction->getInputs()[0];
3926 }
3927
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003928 // Forward -g and handle debug info related flags, assuming we are dealing
3929 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00003930 if (SourceAction->getType() == types::TY_Asm ||
3931 SourceAction->getType() == types::TY_PP_Asm) {
3932 Args.ClaimAllArgs(options::OPT_g_Group);
3933 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3934 if (!A->getOption().matches(options::OPT_g0))
3935 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003936
3937 // Add the -fdebug-compilation-dir flag if needed.
3938 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00003939
3940 // Set the AT_producer to the clang version when using the integrated
3941 // assembler on assembly source files.
3942 CmdArgs.push_back("-dwarf-debug-producer");
3943 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00003944 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003945
3946 // Optionally embed the -cc1as level arguments into the debug info, for build
3947 // analysis.
3948 if (getToolChain().UseDwarfDebugFlags()) {
3949 ArgStringList OriginalArgs;
3950 for (ArgList::const_iterator it = Args.begin(),
3951 ie = Args.end(); it != ie; ++it)
3952 (*it)->render(Args, OriginalArgs);
3953
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003954 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003955 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3956 Flags += Exec;
3957 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3958 Flags += " ";
3959 Flags += OriginalArgs[i];
3960 }
3961 CmdArgs.push_back("-dwarf-debug-flags");
3962 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3963 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003964
3965 // FIXME: Add -static support, once we have it.
3966
David Blaikie9260ed62013-07-25 21:19:01 +00003967 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
3968 getToolChain().getDriver());
3969
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003970 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003971
3972 assert(Output.isFilename() && "Unexpected lipo output.");
3973 CmdArgs.push_back("-o");
3974 CmdArgs.push_back(Output.getFilename());
3975
Daniel Dunbarb440f562010-08-02 02:38:21 +00003976 assert(Input.isFilename() && "Invalid input.");
3977 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003978
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003979 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003980 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00003981
3982 // Handle the debug info splitting at object creation time if we're
3983 // creating an object.
3984 // TODO: Currently only works on linux with newer objcopy.
3985 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003986 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00003987 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
3988 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003989}
3990
Daniel Dunbara3246a02009-03-18 08:07:30 +00003991void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003992 const InputInfo &Output,
3993 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003994 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003995 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003996 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003997 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003998
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003999 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004000 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004001 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00004002 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00004003 // Don't forward any -g arguments to assembly steps.
4004 if (isa<AssembleJobAction>(JA) &&
4005 A->getOption().matches(options::OPT_g_Group))
4006 continue;
4007
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00004008 // Don't forward any -W arguments to assembly and link steps.
4009 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4010 A->getOption().matches(options::OPT_W_Group))
4011 continue;
4012
Daniel Dunbar2da02722009-03-19 07:55:12 +00004013 // It is unfortunate that we have to claim here, as this means
4014 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00004015 // platforms using a generic gcc, even if we are just using gcc
4016 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00004017 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004018 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00004019 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004020 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004021
Daniel Dunbar4e295052010-01-25 22:35:08 +00004022 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004023
4024 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004025 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00004026 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004027 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00004028
4029 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004030 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004031 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004032 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004033 CmdArgs.push_back("ppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00004034 else if (Arch == llvm::Triple::ppc64le)
4035 CmdArgs.push_back("ppc64le");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004036 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004037 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00004038 }
4039
Daniel Dunbar5716d872009-05-02 21:41:52 +00004040 // Try to force gcc to match the tool chain we want, if we recognize
4041 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004042 //
4043 // FIXME: The triple class should directly provide the information we want
4044 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004045 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004046 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00004047 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4048 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004049 CmdArgs.push_back("-m64");
4050
Daniel Dunbarb440f562010-08-02 02:38:21 +00004051 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004052 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004053 CmdArgs.push_back(Output.getFilename());
4054 } else {
4055 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004056 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004057 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004058
Tony Linthicum76329bf2011-12-12 21:14:55 +00004059 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4060 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004061
4062 // Only pass -x if gcc will understand it; otherwise hope gcc
4063 // understands the suffix correctly. The main use case this would go
4064 // wrong in is for linker inputs if they happened to have an odd
4065 // suffix; really the only way to get this to happen is a command
4066 // like '-x foobar a.c' which will treat a.c like a linker input.
4067 //
4068 // FIXME: For the linker case specifically, can we safely convert
4069 // inputs into '-Wl,' options?
4070 for (InputInfoList::const_iterator
4071 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4072 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004073
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004074 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004075 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4076 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004077 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004078 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004079 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004080 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004081 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004082 else if (II.getType() == types::TY_ModuleFile)
4083 D.Diag(diag::err_drv_no_module_support)
4084 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004085
Daniel Dunbara3246a02009-03-18 08:07:30 +00004086 if (types::canTypeBeUserSpecified(II.getType())) {
4087 CmdArgs.push_back("-x");
4088 CmdArgs.push_back(types::getTypeName(II.getType()));
4089 }
4090
Daniel Dunbarb440f562010-08-02 02:38:21 +00004091 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004092 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00004093 else {
4094 const Arg &A = II.getInputArg();
4095
4096 // Reverse translate some rewritten options.
4097 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4098 CmdArgs.push_back("-lstdc++");
4099 continue;
4100 }
4101
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004102 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00004103 A.render(Args, CmdArgs);
4104 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004105 }
4106
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004107 const std::string customGCCName = D.getCCCGenericGCCName();
4108 const char *GCCName;
4109 if (!customGCCName.empty())
4110 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00004111 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004112 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004113 } else
4114 GCCName = "gcc";
4115
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004116 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004117 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004118 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004119}
4120
Daniel Dunbar4e295052010-01-25 22:35:08 +00004121void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4122 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004123 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004124}
4125
Daniel Dunbar4e295052010-01-25 22:35:08 +00004126void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
4127 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004128 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004129}
4130
Daniel Dunbar4e295052010-01-25 22:35:08 +00004131void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4132 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004133 const Driver &D = getToolChain().getDriver();
4134
Daniel Dunbar4e295052010-01-25 22:35:08 +00004135 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004136 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4137 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00004138 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004139 else {
4140 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004141 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004142 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004143
Daniel Dunbar4e295052010-01-25 22:35:08 +00004144 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004145 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004146}
4147
Daniel Dunbar4e295052010-01-25 22:35:08 +00004148void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
4149 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004150 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004151}
Daniel Dunbara3246a02009-03-18 08:07:30 +00004152
Daniel Dunbar4e295052010-01-25 22:35:08 +00004153void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4154 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004155 // The types are (hopefully) good enough.
4156}
4157
Tony Linthicum76329bf2011-12-12 21:14:55 +00004158// Hexagon tools start.
4159void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4160 ArgStringList &CmdArgs) const {
4161
4162}
4163void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4164 const InputInfo &Output,
4165 const InputInfoList &Inputs,
4166 const ArgList &Args,
4167 const char *LinkingOutput) const {
4168
4169 const Driver &D = getToolChain().getDriver();
4170 ArgStringList CmdArgs;
4171
4172 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00004173 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00004174 CmdArgs.push_back(Args.MakeArgString(MarchString));
4175
4176 RenderExtraToolArgs(JA, CmdArgs);
4177
4178 if (Output.isFilename()) {
4179 CmdArgs.push_back("-o");
4180 CmdArgs.push_back(Output.getFilename());
4181 } else {
4182 assert(Output.isNothing() && "Unexpected output");
4183 CmdArgs.push_back("-fsyntax-only");
4184 }
4185
Matthew Curtise8f80a12012-12-06 17:49:03 +00004186 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4187 if (!SmallDataThreshold.empty())
4188 CmdArgs.push_back(
4189 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004190
Matthew Curtise5df3812012-12-07 17:23:04 +00004191 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4192 options::OPT_Xassembler);
4193
Tony Linthicum76329bf2011-12-12 21:14:55 +00004194 // Only pass -x if gcc will understand it; otherwise hope gcc
4195 // understands the suffix correctly. The main use case this would go
4196 // wrong in is for linker inputs if they happened to have an odd
4197 // suffix; really the only way to get this to happen is a command
4198 // like '-x foobar a.c' which will treat a.c like a linker input.
4199 //
4200 // FIXME: For the linker case specifically, can we safely convert
4201 // inputs into '-Wl,' options?
4202 for (InputInfoList::const_iterator
4203 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4204 const InputInfo &II = *it;
4205
4206 // Don't try to pass LLVM or AST inputs to a generic gcc.
4207 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4208 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4209 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4210 << getToolChain().getTripleString();
4211 else if (II.getType() == types::TY_AST)
4212 D.Diag(clang::diag::err_drv_no_ast_support)
4213 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004214 else if (II.getType() == types::TY_ModuleFile)
4215 D.Diag(diag::err_drv_no_module_support)
4216 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00004217
4218 if (II.isFilename())
4219 CmdArgs.push_back(II.getFilename());
4220 else
4221 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4222 II.getInputArg().render(Args, CmdArgs);
4223 }
4224
4225 const char *GCCName = "hexagon-as";
4226 const char *Exec =
4227 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4228 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4229
4230}
4231void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4232 ArgStringList &CmdArgs) const {
4233 // The types are (hopefully) good enough.
4234}
4235
4236void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4237 const InputInfo &Output,
4238 const InputInfoList &Inputs,
4239 const ArgList &Args,
4240 const char *LinkingOutput) const {
4241
Matthew Curtise689b052012-12-06 15:46:07 +00004242 const toolchains::Hexagon_TC& ToolChain =
4243 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4244 const Driver &D = ToolChain.getDriver();
4245
Tony Linthicum76329bf2011-12-12 21:14:55 +00004246 ArgStringList CmdArgs;
4247
Matthew Curtise689b052012-12-06 15:46:07 +00004248 //----------------------------------------------------------------------------
4249 //
4250 //----------------------------------------------------------------------------
4251 bool hasStaticArg = Args.hasArg(options::OPT_static);
4252 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00004253 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00004254 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4255 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4256 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4257 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004258
Matthew Curtise689b052012-12-06 15:46:07 +00004259 //----------------------------------------------------------------------------
4260 // Silence warnings for various options
4261 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00004262
Matthew Curtise689b052012-12-06 15:46:07 +00004263 Args.ClaimAllArgs(options::OPT_g_Group);
4264 Args.ClaimAllArgs(options::OPT_emit_llvm);
4265 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4266 // handled somewhere else.
4267 Args.ClaimAllArgs(options::OPT_static_libgcc);
4268
4269 //----------------------------------------------------------------------------
4270 //
4271 //----------------------------------------------------------------------------
4272 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4273 e = ToolChain.ExtraOpts.end();
4274 i != e; ++i)
4275 CmdArgs.push_back(i->c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004276
Matthew Curtisf10a5952012-12-06 14:16:43 +00004277 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4278 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00004279
Matthew Curtise689b052012-12-06 15:46:07 +00004280 if (buildingLib) {
4281 CmdArgs.push_back("-shared");
4282 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4283 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00004284 }
4285
Matthew Curtise689b052012-12-06 15:46:07 +00004286 if (hasStaticArg)
4287 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004288
Matthew Curtise8f80a12012-12-06 17:49:03 +00004289 if (buildPIE && !buildingLib)
4290 CmdArgs.push_back("-pie");
4291
4292 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4293 if (!SmallDataThreshold.empty()) {
4294 CmdArgs.push_back(
4295 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4296 }
4297
Matthew Curtise689b052012-12-06 15:46:07 +00004298 //----------------------------------------------------------------------------
4299 //
4300 //----------------------------------------------------------------------------
4301 CmdArgs.push_back("-o");
4302 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004303
Matthew Curtise689b052012-12-06 15:46:07 +00004304 const std::string MarchSuffix = "/" + MarchString;
4305 const std::string G0Suffix = "/G0";
4306 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4307 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4308 + "/";
4309 const std::string StartFilesDir = RootDir
4310 + "hexagon/lib"
4311 + (buildingLib
4312 ? MarchG0Suffix : MarchSuffix);
4313
4314 //----------------------------------------------------------------------------
4315 // moslib
4316 //----------------------------------------------------------------------------
4317 std::vector<std::string> oslibs;
4318 bool hasStandalone= false;
4319
4320 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4321 ie = Args.filtered_end(); it != ie; ++it) {
4322 (*it)->claim();
4323 oslibs.push_back((*it)->getValue());
4324 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004325 }
Matthew Curtise689b052012-12-06 15:46:07 +00004326 if (oslibs.empty()) {
4327 oslibs.push_back("standalone");
4328 hasStandalone = true;
4329 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004330
Matthew Curtise689b052012-12-06 15:46:07 +00004331 //----------------------------------------------------------------------------
4332 // Start Files
4333 //----------------------------------------------------------------------------
4334 if (incStdLib && incStartFiles) {
4335
4336 if (!buildingLib) {
4337 if (hasStandalone) {
4338 CmdArgs.push_back(
4339 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4340 }
4341 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4342 }
4343 std::string initObj = useShared ? "/initS.o" : "/init.o";
4344 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4345 }
4346
4347 //----------------------------------------------------------------------------
4348 // Library Search Paths
4349 //----------------------------------------------------------------------------
4350 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4351 for (ToolChain::path_list::const_iterator
4352 i = LibPaths.begin(),
4353 e = LibPaths.end();
4354 i != e;
4355 ++i)
4356 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4357
4358 //----------------------------------------------------------------------------
4359 //
4360 //----------------------------------------------------------------------------
4361 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4362 Args.AddAllArgs(CmdArgs, options::OPT_e);
4363 Args.AddAllArgs(CmdArgs, options::OPT_s);
4364 Args.AddAllArgs(CmdArgs, options::OPT_t);
4365 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4366
4367 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4368
4369 //----------------------------------------------------------------------------
4370 // Libraries
4371 //----------------------------------------------------------------------------
4372 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00004373 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00004374 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4375 CmdArgs.push_back("-lm");
4376 }
4377
4378 CmdArgs.push_back("--start-group");
4379
4380 if (!buildingLib) {
4381 for(std::vector<std::string>::iterator i = oslibs.begin(),
4382 e = oslibs.end(); i != e; ++i)
4383 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4384 CmdArgs.push_back("-lc");
4385 }
4386 CmdArgs.push_back("-lgcc");
4387
4388 CmdArgs.push_back("--end-group");
4389 }
4390
4391 //----------------------------------------------------------------------------
4392 // End files
4393 //----------------------------------------------------------------------------
4394 if (incStdLib && incStartFiles) {
4395 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4396 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4397 }
4398
4399 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00004400 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004401}
4402// Hexagon tools end.
4403
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004404llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4405 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4406 // archs which Darwin doesn't use.
4407
4408 // The matching this routine does is fairly pointless, since it is neither the
4409 // complete architecture list, nor a reasonable subset. The problem is that
4410 // historically the driver driver accepts this and also ties its -march=
4411 // handling to the architecture name, so we need to be careful before removing
4412 // support for it.
4413
4414 // This code must be kept in sync with Clang's Darwin specific argument
4415 // translation.
4416
4417 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4418 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4419 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4420 .Case("ppc64", llvm::Triple::ppc64)
4421 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4422 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4423 llvm::Triple::x86)
4424 .Case("x86_64", llvm::Triple::x86_64)
4425 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00004426 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4427 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4428 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004429 .Case("r600", llvm::Triple::r600)
4430 .Case("nvptx", llvm::Triple::nvptx)
4431 .Case("nvptx64", llvm::Triple::nvptx64)
4432 .Case("amdil", llvm::Triple::amdil)
4433 .Case("spir", llvm::Triple::spir)
4434 .Default(llvm::Triple::UnknownArch);
4435}
Tony Linthicum76329bf2011-12-12 21:14:55 +00004436
Bob Wilsondecc03e2012-11-23 06:14:39 +00004437const char *Clang::getBaseInputName(const ArgList &Args,
4438 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00004439 return Args.MakeArgString(
4440 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004441}
4442
Bob Wilsondecc03e2012-11-23 06:14:39 +00004443const char *Clang::getBaseInputStem(const ArgList &Args,
4444 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004445 const char *Str = getBaseInputName(Args, Inputs);
4446
Chris Lattner906bb902011-01-16 08:14:11 +00004447 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004448 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004449
4450 return Str;
4451}
4452
Bob Wilsondecc03e2012-11-23 06:14:39 +00004453const char *Clang::getDependencyFileName(const ArgList &Args,
4454 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004455 // FIXME: Think about this more.
4456 std::string Res;
4457
4458 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004459 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004460 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004461 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00004462 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004463 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004464 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004465}
4466
Daniel Dunbarbe220842009-03-20 16:06:39 +00004467void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004468 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004469 const InputInfoList &Inputs,
4470 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004471 const char *LinkingOutput) const {
4472 ArgStringList CmdArgs;
4473
4474 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4475 const InputInfo &Input = Inputs[0];
4476
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004477 // Determine the original source input.
4478 const Action *SourceAction = &JA;
4479 while (SourceAction->getKind() != Action::InputClass) {
4480 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4481 SourceAction = SourceAction->getInputs()[0];
4482 }
4483
4484 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004485 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004486 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004487 if (Args.hasArg(options::OPT_gstabs))
4488 CmdArgs.push_back("--gstabs");
4489 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004490 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004491 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004492
Daniel Dunbarbe220842009-03-20 16:06:39 +00004493 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004494 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004495
Daniel Dunbar6d484762010-07-22 01:47:22 +00004496 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004497 if (getToolChain().getArch() == llvm::Triple::x86 ||
4498 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004499 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4500 CmdArgs.push_back("-force_cpusubtype_ALL");
4501
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004502 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004503 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00004504 Args.hasArg(options::OPT_fapple_kext)) &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004505 (!getDarwinToolChain().isTargetIPhoneOS() ||
4506 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4507 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004508 CmdArgs.push_back("-static");
4509
Daniel Dunbarbe220842009-03-20 16:06:39 +00004510 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4511 options::OPT_Xassembler);
4512
4513 assert(Output.isFilename() && "Unexpected lipo output.");
4514 CmdArgs.push_back("-o");
4515 CmdArgs.push_back(Output.getFilename());
4516
Daniel Dunbarb440f562010-08-02 02:38:21 +00004517 assert(Input.isFilename() && "Invalid input.");
4518 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004519
4520 // asm_final spec is empty.
4521
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004522 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004523 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004524 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004525}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004526
David Blaikie68e081d2011-12-20 02:48:34 +00004527void darwin::DarwinTool::anchor() {}
4528
Daniel Dunbare9ded432009-09-09 18:36:20 +00004529void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4530 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004531 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004532
Daniel Dunbarc1964212009-03-26 16:23:12 +00004533 // Derived from darwin_arch spec.
4534 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004535 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004536
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004537 // FIXME: Is this needed anymore?
4538 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004539 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004540}
4541
Bill Wendling3b2000f2012-10-02 18:02:50 +00004542bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4543 // We only need to generate a temp path for LTO if we aren't compiling object
4544 // files. When compiling source files, we run 'dsymutil' after linking. We
4545 // don't run 'dsymutil' when compiling object files.
4546 for (InputInfoList::const_iterator
4547 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4548 if (it->getType() != types::TY_Object)
4549 return true;
4550
4551 return false;
4552}
4553
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004554void darwin::Link::AddLinkArgs(Compilation &C,
4555 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004556 ArgStringList &CmdArgs,
4557 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004558 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004559 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004560
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004561 unsigned Version[3] = { 0, 0, 0 };
4562 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4563 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00004564 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004565 Version[1], Version[2], HadExtra) ||
4566 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004567 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004568 << A->getAsString(Args);
4569 }
4570
4571 // Newer linkers support -demangle, pass it if supported and not disabled by
4572 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004573 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004574 // Don't pass -demangle to ld_classic.
4575 //
4576 // FIXME: This is a temporary workaround, ld should be handling this.
4577 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4578 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004579 if (getToolChain().getArch() == llvm::Triple::x86) {
4580 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4581 options::OPT_Wl_COMMA),
4582 ie = Args.filtered_end(); it != ie; ++it) {
4583 const Arg *A = *it;
4584 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smithbd55daf2012-11-01 04:30:05 +00004585 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004586 UsesLdClassic = true;
4587 }
4588 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004589 if (!UsesLdClassic)
4590 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004591 }
4592
Bob Wilson3d27dad2013-08-02 22:25:34 +00004593 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
4594 CmdArgs.push_back("-export_dynamic");
4595
Bill Wendling313b6bf2012-11-16 23:03:00 +00004596 // If we are using LTO, then automatically create a temporary file path for
4597 // the linker to use, so that it's lifetime will extend past a possible
4598 // dsymutil step.
4599 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4600 const char *TmpPath = C.getArgs().MakeArgString(
4601 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4602 C.addTempFile(TmpPath);
4603 CmdArgs.push_back("-object_path_lto");
4604 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00004605 }
4606
Daniel Dunbarc1964212009-03-26 16:23:12 +00004607 // Derived from the "link" spec.
4608 Args.AddAllArgs(CmdArgs, options::OPT_static);
4609 if (!Args.hasArg(options::OPT_static))
4610 CmdArgs.push_back("-dynamic");
4611 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4612 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4613 // here. How do we wish to handle such things?
4614 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004615
Daniel Dunbarc1964212009-03-26 16:23:12 +00004616 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004617 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004618 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004619 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004620
4621 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4622 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4623 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4624
4625 Arg *A;
4626 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4627 (A = Args.getLastArg(options::OPT_current__version)) ||
4628 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004629 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004630 << A->getAsString(Args) << "-dynamiclib";
4631
4632 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4633 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4634 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4635 } else {
4636 CmdArgs.push_back("-dylib");
4637
4638 Arg *A;
4639 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4640 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4641 (A = Args.getLastArg(options::OPT_client__name)) ||
4642 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4643 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4644 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004645 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004646 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004647
Daniel Dunbarc1964212009-03-26 16:23:12 +00004648 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4649 "-dylib_compatibility_version");
4650 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4651 "-dylib_current_version");
4652
Daniel Dunbara48823f2010-01-22 02:04:52 +00004653 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004654
4655 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4656 "-dylib_install_name");
4657 }
4658
4659 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4660 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4661 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004662 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004663 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004664 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4665 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4666 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4667 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4668 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4669 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004670 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004671 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4672 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4673 Args.AddAllArgs(CmdArgs, options::OPT_init);
4674
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004675 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004676 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004677
4678 // If we had an explicit -mios-simulator-version-min argument, honor that,
4679 // otherwise use the traditional deployment targets. We can't just check the
4680 // is-sim attribute because existing code follows this path, and the linker
4681 // may not handle the argument.
4682 //
4683 // FIXME: We may be able to remove this, once we can verify no one depends on
4684 // it.
4685 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4686 CmdArgs.push_back("-ios_simulator_version_min");
4687 else if (DarwinTC.isTargetIPhoneOS())
4688 CmdArgs.push_back("-iphoneos_version_min");
4689 else
4690 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004691 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004692
Daniel Dunbarc1964212009-03-26 16:23:12 +00004693 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4694 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4695 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4696 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4697 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004698
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004699 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4700 options::OPT_fno_pie,
4701 options::OPT_fno_PIE)) {
4702 if (A->getOption().matches(options::OPT_fpie) ||
4703 A->getOption().matches(options::OPT_fPIE))
4704 CmdArgs.push_back("-pie");
4705 else
4706 CmdArgs.push_back("-no_pie");
4707 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004708
4709 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4710 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4711 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4712 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4713 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4714 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4715 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4716 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4717 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4718 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4719 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4720 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4721 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4722 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4723 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4724 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004725
Daniel Dunbar84384642011-05-02 21:03:47 +00004726 // Give --sysroot= preference, over the Apple specific behavior to also use
4727 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004728 StringRef sysroot = C.getSysRoot();
4729 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004730 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004731 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004732 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4733 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00004734 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004735 }
4736
Daniel Dunbarc1964212009-03-26 16:23:12 +00004737 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4738 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4739 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4740 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4741 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004742 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004743 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4744 Args.AddAllArgs(CmdArgs, options::OPT_y);
4745 Args.AddLastArg(CmdArgs, options::OPT_w);
4746 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4747 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4748 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4749 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4750 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4751 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4752 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4753 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4754 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4755 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4756 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4757 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4758}
4759
4760void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004761 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004762 const InputInfoList &Inputs,
4763 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004764 const char *LinkingOutput) const {
4765 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004766
Daniel Dunbarc1964212009-03-26 16:23:12 +00004767 // The logic here is derived from gcc's behavior; most of which
4768 // comes from specs (starting with link_command). Consult gcc for
4769 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004770 ArgStringList CmdArgs;
4771
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004772 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4773 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4774 options::OPT_ccc_arcmt_migrate)) {
4775 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4776 (*I)->claim();
4777 const char *Exec =
4778 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4779 CmdArgs.push_back(Output.getFilename());
4780 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4781 return;
4782 }
4783
Daniel Dunbarc1964212009-03-26 16:23:12 +00004784 // I'm not sure why this particular decomposition exists in gcc, but
4785 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004786 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004787
Daniel Dunbarc1964212009-03-26 16:23:12 +00004788 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4789 Args.AddAllArgs(CmdArgs, options::OPT_s);
4790 Args.AddAllArgs(CmdArgs, options::OPT_t);
4791 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4792 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004793 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004794 Args.AddAllArgs(CmdArgs, options::OPT_r);
4795
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004796 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4797 // members of static archive libraries which implement Objective-C classes or
4798 // categories.
4799 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4800 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004801
Daniel Dunbarc1964212009-03-26 16:23:12 +00004802 CmdArgs.push_back("-o");
4803 CmdArgs.push_back(Output.getFilename());
4804
Chad Rosier06fd3c62012-05-16 23:45:12 +00004805 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004806 !Args.hasArg(options::OPT_nostartfiles)) {
4807 // Derived from startfile spec.
4808 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004809 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004810 if (getDarwinToolChain().isTargetIOSSimulator()) {
4811 // The simulator doesn't have a versioned crt1 file.
4812 CmdArgs.push_back("-ldylib1.o");
4813 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004814 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4815 CmdArgs.push_back("-ldylib1.o");
4816 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004817 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004818 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004819 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004820 CmdArgs.push_back("-ldylib1.10.5.o");
4821 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004822 } else {
4823 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004824 if (!Args.hasArg(options::OPT_static)) {
4825 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004826 if (getDarwinToolChain().isTargetIOSSimulator()) {
4827 // The simulator doesn't have a versioned crt1 file.
4828 CmdArgs.push_back("-lbundle1.o");
4829 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004830 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4831 CmdArgs.push_back("-lbundle1.o");
4832 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004833 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004834 CmdArgs.push_back("-lbundle1.o");
4835 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004836 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004837 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004838 if (Args.hasArg(options::OPT_pg) &&
4839 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004840 if (Args.hasArg(options::OPT_static) ||
4841 Args.hasArg(options::OPT_object) ||
4842 Args.hasArg(options::OPT_preload)) {
4843 CmdArgs.push_back("-lgcrt0.o");
4844 } else {
4845 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004846
Daniel Dunbarc1964212009-03-26 16:23:12 +00004847 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004848 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004849 // By default on OS X 10.8 and later, we don't link with a crt1.o
4850 // file and the linker knows to use _main as the entry point. But,
4851 // when compiling with -pg, we need to link with the gcrt1.o file,
4852 // so pass the -no_new_main option to tell the linker to use the
4853 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004854 if (getDarwinToolChain().isTargetMacOS() &&
4855 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4856 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004857 } else {
4858 if (Args.hasArg(options::OPT_static) ||
4859 Args.hasArg(options::OPT_object) ||
4860 Args.hasArg(options::OPT_preload)) {
4861 CmdArgs.push_back("-lcrt0.o");
4862 } else {
4863 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004864 if (getDarwinToolChain().isTargetIOSSimulator()) {
4865 // The simulator doesn't have a versioned crt1 file.
4866 CmdArgs.push_back("-lcrt1.o");
4867 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004868 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4869 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004870 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00004871 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004872 } else {
4873 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4874 CmdArgs.push_back("-lcrt1.o");
4875 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4876 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004877 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004878 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004879
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004880 // darwin_crt2 spec is empty.
4881 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004882 }
4883 }
4884 }
4885 }
4886
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004887 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4888 Args.hasArg(options::OPT_shared_libgcc) &&
4889 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004890 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004891 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004892 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004893 }
4894 }
4895
4896 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004897
Daniel Dunbarc1964212009-03-26 16:23:12 +00004898 if (Args.hasArg(options::OPT_fopenmp))
4899 // This is more complicated in gcc...
4900 CmdArgs.push_back("-lgomp");
4901
Douglas Gregor9295df02012-05-15 21:00:27 +00004902 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4903
Bob Wilson16d93952012-05-15 18:57:39 +00004904 if (isObjCRuntimeLinked(Args) &&
4905 !Args.hasArg(options::OPT_nostdlib) &&
4906 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004907 // Avoid linking compatibility stubs on i386 mac.
4908 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004909 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004910 // If we don't have ARC or subscripting runtime support, link in the
4911 // runtime stubs. We have to do this *before* adding any of the normal
4912 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004913 ObjCRuntime runtime =
4914 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004915 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004916 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004917 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004918 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004919 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004920 CmdArgs.push_back("-framework");
4921 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004922 // Link libobj.
4923 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004924 }
John McCall31168b02011-06-15 23:02:42 +00004925
Daniel Dunbarc1964212009-03-26 16:23:12 +00004926 if (LinkingOutput) {
4927 CmdArgs.push_back("-arch_multiple");
4928 CmdArgs.push_back("-final_output");
4929 CmdArgs.push_back(LinkingOutput);
4930 }
4931
Daniel Dunbarc1964212009-03-26 16:23:12 +00004932 if (Args.hasArg(options::OPT_fnested_functions))
4933 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004934
Daniel Dunbarc1964212009-03-26 16:23:12 +00004935 if (!Args.hasArg(options::OPT_nostdlib) &&
4936 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00004937 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004938 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004939
Daniel Dunbarc1964212009-03-26 16:23:12 +00004940 // link_ssp spec is empty.
4941
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004942 // Let the tool chain choose which runtime library to link.
4943 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004944 }
4945
Chad Rosier06fd3c62012-05-16 23:45:12 +00004946 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004947 !Args.hasArg(options::OPT_nostartfiles)) {
4948 // endfile_spec is empty.
4949 }
4950
4951 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4952 Args.AddAllArgs(CmdArgs, options::OPT_F);
4953
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004954 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004955 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004956 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004957}
4958
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004959void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004960 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004961 const InputInfoList &Inputs,
4962 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004963 const char *LinkingOutput) const {
4964 ArgStringList CmdArgs;
4965
4966 CmdArgs.push_back("-create");
4967 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004968
4969 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004970 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004971
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004972 for (InputInfoList::const_iterator
4973 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4974 const InputInfo &II = *it;
4975 assert(II.isFilename() && "Unexpected lipo input.");
4976 CmdArgs.push_back(II.getFilename());
4977 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004978 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004979 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004980 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004981}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004982
Daniel Dunbar88299622010-06-04 18:28:36 +00004983void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004984 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004985 const InputInfoList &Inputs,
4986 const ArgList &Args,
4987 const char *LinkingOutput) const {
4988 ArgStringList CmdArgs;
4989
Daniel Dunbareb86b042011-05-09 17:23:16 +00004990 CmdArgs.push_back("-o");
4991 CmdArgs.push_back(Output.getFilename());
4992
Daniel Dunbar88299622010-06-04 18:28:36 +00004993 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4994 const InputInfo &Input = Inputs[0];
4995 assert(Input.isFilename() && "Unexpected dsymutil input.");
4996 CmdArgs.push_back(Input.getFilename());
4997
Daniel Dunbar88299622010-06-04 18:28:36 +00004998 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004999 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005000 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00005001}
5002
Eric Christopher551ef452011-08-23 17:56:55 +00005003void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00005004 const InputInfo &Output,
5005 const InputInfoList &Inputs,
5006 const ArgList &Args,
5007 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00005008 ArgStringList CmdArgs;
5009 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00005010 CmdArgs.push_back("--debug-info");
5011 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00005012 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00005013
5014 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5015 const InputInfo &Input = Inputs[0];
5016 assert(Input.isFilename() && "Unexpected verify input");
5017
5018 // Grabbing the output of the earlier dsymutil run.
5019 CmdArgs.push_back(Input.getFilename());
5020
5021 const char *Exec =
5022 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5023 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5024}
5025
David Chisnallf571cde2012-02-15 13:39:01 +00005026void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5027 const InputInfo &Output,
5028 const InputInfoList &Inputs,
5029 const ArgList &Args,
5030 const char *LinkingOutput) const {
5031 ArgStringList CmdArgs;
5032
5033 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5034 options::OPT_Xassembler);
5035
5036 CmdArgs.push_back("-o");
5037 CmdArgs.push_back(Output.getFilename());
5038
5039 for (InputInfoList::const_iterator
5040 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5041 const InputInfo &II = *it;
5042 CmdArgs.push_back(II.getFilename());
5043 }
5044
5045 const char *Exec =
5046 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5047 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5048}
5049
5050
5051void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5052 const InputInfo &Output,
5053 const InputInfoList &Inputs,
5054 const ArgList &Args,
5055 const char *LinkingOutput) const {
5056 // FIXME: Find a real GCC, don't hard-code versions here
5057 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5058 const llvm::Triple &T = getToolChain().getTriple();
5059 std::string LibPath = "/usr/lib/";
5060 llvm::Triple::ArchType Arch = T.getArch();
5061 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005062 case llvm::Triple::x86:
5063 GCCLibPath +=
5064 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5065 break;
5066 case llvm::Triple::x86_64:
5067 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5068 GCCLibPath += "/4.5.2/amd64/";
5069 LibPath += "amd64/";
5070 break;
5071 default:
5072 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00005073 }
5074
5075 ArgStringList CmdArgs;
5076
David Chisnall272a0712012-02-29 15:06:12 +00005077 // Demangle C++ names in errors
5078 CmdArgs.push_back("-C");
5079
David Chisnallf571cde2012-02-15 13:39:01 +00005080 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5081 (!Args.hasArg(options::OPT_shared))) {
5082 CmdArgs.push_back("-e");
5083 CmdArgs.push_back("_start");
5084 }
5085
5086 if (Args.hasArg(options::OPT_static)) {
5087 CmdArgs.push_back("-Bstatic");
5088 CmdArgs.push_back("-dn");
5089 } else {
5090 CmdArgs.push_back("-Bdynamic");
5091 if (Args.hasArg(options::OPT_shared)) {
5092 CmdArgs.push_back("-shared");
5093 } else {
5094 CmdArgs.push_back("--dynamic-linker");
5095 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5096 }
5097 }
5098
5099 if (Output.isFilename()) {
5100 CmdArgs.push_back("-o");
5101 CmdArgs.push_back(Output.getFilename());
5102 } else {
5103 assert(Output.isNothing() && "Invalid output.");
5104 }
5105
5106 if (!Args.hasArg(options::OPT_nostdlib) &&
5107 !Args.hasArg(options::OPT_nostartfiles)) {
5108 if (!Args.hasArg(options::OPT_shared)) {
5109 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5110 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005111 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005112 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5113 } else {
5114 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005115 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5116 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005117 }
Hans Wennborg70850d82013-07-18 20:29:38 +00005118 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00005119 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005120 }
5121
5122 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5123
5124 Args.AddAllArgs(CmdArgs, options::OPT_L);
5125 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5126 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00005127 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00005128
5129 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5130
5131 if (!Args.hasArg(options::OPT_nostdlib) &&
5132 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005133 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00005134 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00005135 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005136 if (!Args.hasArg(options::OPT_shared)) {
5137 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00005138 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00005139 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005140 }
David Chisnallf571cde2012-02-15 13:39:01 +00005141 }
5142
5143 if (!Args.hasArg(options::OPT_nostdlib) &&
5144 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00005145 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005146 }
David Chisnall96de9932012-02-16 16:00:47 +00005147 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005148
5149 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5150
5151 const char *Exec =
5152 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5153 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5154}
5155
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005156void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005157 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005158 const InputInfoList &Inputs,
5159 const ArgList &Args,
5160 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005161 ArgStringList CmdArgs;
5162
5163 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5164 options::OPT_Xassembler);
5165
5166 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005167 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005168
5169 for (InputInfoList::const_iterator
5170 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5171 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005172 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005173 }
5174
5175 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005176 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005177 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005178}
5179
5180void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005181 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005182 const InputInfoList &Inputs,
5183 const ArgList &Args,
5184 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005185 ArgStringList CmdArgs;
5186
5187 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005188 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005189 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005190 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005191 }
5192
5193 if (Args.hasArg(options::OPT_static)) {
5194 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005195 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005196 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005197// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005198 CmdArgs.push_back("-Bdynamic");
5199 if (Args.hasArg(options::OPT_shared)) {
5200 CmdArgs.push_back("-shared");
5201 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00005202 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005203 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5204 }
5205 }
5206
Daniel Dunbarb440f562010-08-02 02:38:21 +00005207 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005208 CmdArgs.push_back("-o");
5209 CmdArgs.push_back(Output.getFilename());
5210 } else {
5211 assert(Output.isNothing() && "Invalid output.");
5212 }
5213
5214 if (!Args.hasArg(options::OPT_nostdlib) &&
5215 !Args.hasArg(options::OPT_nostartfiles)) {
5216 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005217 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005218 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005219 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005220 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005221 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005222 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005223 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005224 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005225 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005226 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005227 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005228 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005229 }
5230
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005231 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5232 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005233 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005234
5235 Args.AddAllArgs(CmdArgs, options::OPT_L);
5236 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5237 Args.AddAllArgs(CmdArgs, options::OPT_e);
5238
Daniel Dunbar54423b22010-09-17 00:24:54 +00005239 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005240
5241 if (!Args.hasArg(options::OPT_nostdlib) &&
5242 !Args.hasArg(options::OPT_nodefaultlibs)) {
5243 // FIXME: For some reason GCC passes -lgcc before adding
5244 // the default system libraries. Just mimic this for now.
5245 CmdArgs.push_back("-lgcc");
5246
5247 if (Args.hasArg(options::OPT_pthread))
5248 CmdArgs.push_back("-pthread");
5249 if (!Args.hasArg(options::OPT_shared))
5250 CmdArgs.push_back("-lc");
5251 CmdArgs.push_back("-lgcc");
5252 }
5253
5254 if (!Args.hasArg(options::OPT_nostdlib) &&
5255 !Args.hasArg(options::OPT_nostartfiles)) {
5256 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005257 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005258 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005259 }
5260
Bill Wendling08760582011-06-27 19:15:03 +00005261 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005262
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005263 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005264 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005265 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005266}
5267
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005268void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005269 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005270 const InputInfoList &Inputs,
5271 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005272 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005273 ArgStringList CmdArgs;
5274
5275 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5276 options::OPT_Xassembler);
5277
5278 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005279 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005280
5281 for (InputInfoList::const_iterator
5282 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5283 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005284 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005285 }
5286
5287 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005288 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005289 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005290}
5291
5292void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005293 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005294 const InputInfoList &Inputs,
5295 const ArgList &Args,
5296 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005297 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005298 ArgStringList CmdArgs;
5299
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005300 // Silence warning for "clang -g foo.o -o foo"
5301 Args.ClaimAllArgs(options::OPT_g_Group);
5302 // and "clang -emit-llvm foo.o -o foo"
5303 Args.ClaimAllArgs(options::OPT_emit_llvm);
5304 // and for "clang -w foo.o -o foo". Other warning options are already
5305 // handled somewhere else.
5306 Args.ClaimAllArgs(options::OPT_w);
5307
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005308 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005309 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005310 CmdArgs.push_back("-e");
5311 CmdArgs.push_back("__start");
5312 }
5313
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005314 if (Args.hasArg(options::OPT_static)) {
5315 CmdArgs.push_back("-Bstatic");
5316 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005317 if (Args.hasArg(options::OPT_rdynamic))
5318 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005319 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005320 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005321 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005322 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005323 } else {
5324 CmdArgs.push_back("-dynamic-linker");
5325 CmdArgs.push_back("/usr/libexec/ld.so");
5326 }
5327 }
5328
Rafael Espindola044f7832013-06-05 04:28:55 +00005329 if (Args.hasArg(options::OPT_nopie))
5330 CmdArgs.push_back("-nopie");
5331
Daniel Dunbarb440f562010-08-02 02:38:21 +00005332 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005333 CmdArgs.push_back("-o");
5334 CmdArgs.push_back(Output.getFilename());
5335 } else {
5336 assert(Output.isNothing() && "Invalid output.");
5337 }
5338
5339 if (!Args.hasArg(options::OPT_nostdlib) &&
5340 !Args.hasArg(options::OPT_nostartfiles)) {
5341 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00005342 if (Args.hasArg(options::OPT_pg))
5343 CmdArgs.push_back(Args.MakeArgString(
5344 getToolChain().GetFilePath("gcrt0.o")));
5345 else
5346 CmdArgs.push_back(Args.MakeArgString(
5347 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005348 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005349 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005350 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005351 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005352 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005353 }
5354 }
5355
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005356 std::string Triple = getToolChain().getTripleString();
5357 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005358 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005359 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005360 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005361
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005362 Args.AddAllArgs(CmdArgs, options::OPT_L);
5363 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5364 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005365 Args.AddAllArgs(CmdArgs, options::OPT_s);
5366 Args.AddAllArgs(CmdArgs, options::OPT_t);
5367 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5368 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005369
Daniel Dunbar54423b22010-09-17 00:24:54 +00005370 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005371
5372 if (!Args.hasArg(options::OPT_nostdlib) &&
5373 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005374 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005375 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005376 if (Args.hasArg(options::OPT_pg))
5377 CmdArgs.push_back("-lm_p");
5378 else
5379 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005380 }
5381
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005382 // FIXME: For some reason GCC passes -lgcc before adding
5383 // the default system libraries. Just mimic this for now.
5384 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005385
Eric Christopher17674ec2012-09-13 06:32:34 +00005386 if (Args.hasArg(options::OPT_pthread)) {
5387 if (!Args.hasArg(options::OPT_shared) &&
5388 Args.hasArg(options::OPT_pg))
5389 CmdArgs.push_back("-lpthread_p");
5390 else
5391 CmdArgs.push_back("-lpthread");
5392 }
5393
Chandler Carruth45661652011-12-17 22:32:42 +00005394 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005395 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005396 CmdArgs.push_back("-lc_p");
5397 else
5398 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005399 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005400
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005401 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005402 }
5403
5404 if (!Args.hasArg(options::OPT_nostdlib) &&
5405 !Args.hasArg(options::OPT_nostartfiles)) {
5406 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005407 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005408 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005409 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005410 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005411 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005412 }
5413
5414 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005415 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005416 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005417}
Ed Schoutene33194b2009-04-02 19:13:12 +00005418
Eli Friedman9fa28852012-08-08 23:57:20 +00005419void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5420 const InputInfo &Output,
5421 const InputInfoList &Inputs,
5422 const ArgList &Args,
5423 const char *LinkingOutput) const {
5424 ArgStringList CmdArgs;
5425
5426 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5427 options::OPT_Xassembler);
5428
5429 CmdArgs.push_back("-o");
5430 CmdArgs.push_back(Output.getFilename());
5431
5432 for (InputInfoList::const_iterator
5433 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5434 const InputInfo &II = *it;
5435 CmdArgs.push_back(II.getFilename());
5436 }
5437
5438 const char *Exec =
5439 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5440 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5441}
5442
5443void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5444 const InputInfo &Output,
5445 const InputInfoList &Inputs,
5446 const ArgList &Args,
5447 const char *LinkingOutput) const {
5448 const Driver &D = getToolChain().getDriver();
5449 ArgStringList CmdArgs;
5450
5451 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5452 (!Args.hasArg(options::OPT_shared))) {
5453 CmdArgs.push_back("-e");
5454 CmdArgs.push_back("__start");
5455 }
5456
5457 if (Args.hasArg(options::OPT_static)) {
5458 CmdArgs.push_back("-Bstatic");
5459 } else {
5460 if (Args.hasArg(options::OPT_rdynamic))
5461 CmdArgs.push_back("-export-dynamic");
5462 CmdArgs.push_back("--eh-frame-hdr");
5463 CmdArgs.push_back("-Bdynamic");
5464 if (Args.hasArg(options::OPT_shared)) {
5465 CmdArgs.push_back("-shared");
5466 } else {
5467 CmdArgs.push_back("-dynamic-linker");
5468 CmdArgs.push_back("/usr/libexec/ld.so");
5469 }
5470 }
5471
5472 if (Output.isFilename()) {
5473 CmdArgs.push_back("-o");
5474 CmdArgs.push_back(Output.getFilename());
5475 } else {
5476 assert(Output.isNothing() && "Invalid output.");
5477 }
5478
5479 if (!Args.hasArg(options::OPT_nostdlib) &&
5480 !Args.hasArg(options::OPT_nostartfiles)) {
5481 if (!Args.hasArg(options::OPT_shared)) {
5482 if (Args.hasArg(options::OPT_pg))
5483 CmdArgs.push_back(Args.MakeArgString(
5484 getToolChain().GetFilePath("gcrt0.o")));
5485 else
5486 CmdArgs.push_back(Args.MakeArgString(
5487 getToolChain().GetFilePath("crt0.o")));
5488 CmdArgs.push_back(Args.MakeArgString(
5489 getToolChain().GetFilePath("crtbegin.o")));
5490 } else {
5491 CmdArgs.push_back(Args.MakeArgString(
5492 getToolChain().GetFilePath("crtbeginS.o")));
5493 }
5494 }
5495
5496 Args.AddAllArgs(CmdArgs, options::OPT_L);
5497 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5498 Args.AddAllArgs(CmdArgs, options::OPT_e);
5499
5500 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5501
5502 if (!Args.hasArg(options::OPT_nostdlib) &&
5503 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005504 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00005505 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5506 if (Args.hasArg(options::OPT_pg))
5507 CmdArgs.push_back("-lm_p");
5508 else
5509 CmdArgs.push_back("-lm");
5510 }
5511
Rafael Espindola1ad26f02012-10-23 17:07:31 +00005512 if (Args.hasArg(options::OPT_pthread)) {
5513 if (!Args.hasArg(options::OPT_shared) &&
5514 Args.hasArg(options::OPT_pg))
5515 CmdArgs.push_back("-lpthread_p");
5516 else
5517 CmdArgs.push_back("-lpthread");
5518 }
5519
Eli Friedman9fa28852012-08-08 23:57:20 +00005520 if (!Args.hasArg(options::OPT_shared)) {
5521 if (Args.hasArg(options::OPT_pg))
5522 CmdArgs.push_back("-lc_p");
5523 else
5524 CmdArgs.push_back("-lc");
5525 }
5526
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005527 StringRef MyArch;
5528 switch (getToolChain().getTriple().getArch()) {
5529 case llvm::Triple::arm:
5530 MyArch = "arm";
5531 break;
5532 case llvm::Triple::x86:
5533 MyArch = "i386";
5534 break;
5535 case llvm::Triple::x86_64:
5536 MyArch = "amd64";
5537 break;
5538 default:
5539 llvm_unreachable("Unsupported architecture");
5540 }
5541 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00005542 }
5543
5544 if (!Args.hasArg(options::OPT_nostdlib) &&
5545 !Args.hasArg(options::OPT_nostartfiles)) {
5546 if (!Args.hasArg(options::OPT_shared))
5547 CmdArgs.push_back(Args.MakeArgString(
5548 getToolChain().GetFilePath("crtend.o")));
5549 else
5550 CmdArgs.push_back(Args.MakeArgString(
5551 getToolChain().GetFilePath("crtendS.o")));
5552 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005553
5554 const char *Exec =
5555 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5556 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005557}
5558
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005559void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005560 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005561 const InputInfoList &Inputs,
5562 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005563 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005564 ArgStringList CmdArgs;
5565
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005566 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5567 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005568 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005569 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005570 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005571 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005572 else if (getToolChain().getArch() == llvm::Triple::mips ||
5573 getToolChain().getArch() == llvm::Triple::mipsel ||
5574 getToolChain().getArch() == llvm::Triple::mips64 ||
5575 getToolChain().getArch() == llvm::Triple::mips64el) {
5576 StringRef CPUName;
5577 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005578 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005579
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005580 CmdArgs.push_back("-march");
5581 CmdArgs.push_back(CPUName.data());
5582
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005583 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005584 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005585
5586 if (getToolChain().getArch() == llvm::Triple::mips ||
5587 getToolChain().getArch() == llvm::Triple::mips64)
5588 CmdArgs.push_back("-EB");
5589 else
5590 CmdArgs.push_back("-EL");
5591
5592 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5593 options::OPT_fpic, options::OPT_fno_pic,
5594 options::OPT_fPIE, options::OPT_fno_PIE,
5595 options::OPT_fpie, options::OPT_fno_pie);
5596 if (LastPICArg &&
5597 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5598 LastPICArg->getOption().matches(options::OPT_fpic) ||
5599 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5600 LastPICArg->getOption().matches(options::OPT_fpie))) {
5601 CmdArgs.push_back("-KPIC");
5602 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005603 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5604 getToolChain().getArch() == llvm::Triple::thumb) {
5605 CmdArgs.push_back("-mfpu=softvfp");
5606 switch(getToolChain().getTriple().getEnvironment()) {
5607 case llvm::Triple::GNUEABI:
5608 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00005609 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005610 break;
5611
5612 default:
5613 CmdArgs.push_back("-matpcs");
5614 }
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005615 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005616
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005617 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5618 options::OPT_Xassembler);
5619
5620 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005621 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005622
5623 for (InputInfoList::const_iterator
5624 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5625 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005626 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005627 }
5628
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005629 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005630 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005631 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005632}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005633
5634void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005635 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005636 const InputInfoList &Inputs,
5637 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005638 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005639 const toolchains::FreeBSD& ToolChain =
5640 static_cast<const toolchains::FreeBSD&>(getToolChain());
5641 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005642 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005643
5644 // Silence warning for "clang -g foo.o -o foo"
5645 Args.ClaimAllArgs(options::OPT_g_Group);
5646 // and "clang -emit-llvm foo.o -o foo"
5647 Args.ClaimAllArgs(options::OPT_emit_llvm);
5648 // and for "clang -w foo.o -o foo". Other warning options are already
5649 // handled somewhere else.
5650 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005651
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005652 if (!D.SysRoot.empty())
5653 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5654
Roman Divackyafe2f232012-08-28 15:09:03 +00005655 if (Args.hasArg(options::OPT_pie))
5656 CmdArgs.push_back("-pie");
5657
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005658 if (Args.hasArg(options::OPT_static)) {
5659 CmdArgs.push_back("-Bstatic");
5660 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005661 if (Args.hasArg(options::OPT_rdynamic))
5662 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005663 CmdArgs.push_back("--eh-frame-hdr");
5664 if (Args.hasArg(options::OPT_shared)) {
5665 CmdArgs.push_back("-Bshareable");
5666 } else {
5667 CmdArgs.push_back("-dynamic-linker");
5668 CmdArgs.push_back("/libexec/ld-elf.so.1");
5669 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005670 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5671 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005672 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5673 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5674 CmdArgs.push_back("--hash-style=both");
5675 }
5676 }
5677 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005678 }
5679
5680 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5681 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005682 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005683 CmdArgs.push_back("-m");
5684 CmdArgs.push_back("elf_i386_fbsd");
5685 }
5686
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005687 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005688 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005689 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005690 }
5691
Daniel Dunbarb440f562010-08-02 02:38:21 +00005692 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005693 CmdArgs.push_back("-o");
5694 CmdArgs.push_back(Output.getFilename());
5695 } else {
5696 assert(Output.isNothing() && "Invalid output.");
5697 }
5698
5699 if (!Args.hasArg(options::OPT_nostdlib) &&
5700 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005701 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005702 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005703 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005704 crt1 = "gcrt1.o";
5705 else if (Args.hasArg(options::OPT_pie))
5706 crt1 = "Scrt1.o";
5707 else
5708 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005709 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005710 if (crt1)
5711 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5712
5713 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5714
5715 const char *crtbegin = NULL;
5716 if (Args.hasArg(options::OPT_static))
5717 crtbegin = "crtbeginT.o";
5718 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5719 crtbegin = "crtbeginS.o";
5720 else
5721 crtbegin = "crtbegin.o";
5722
5723 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005724 }
5725
5726 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005727 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005728 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5729 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005730 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005731 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5732 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005733 Args.AddAllArgs(CmdArgs, options::OPT_s);
5734 Args.AddAllArgs(CmdArgs, options::OPT_t);
5735 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5736 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005737
Roman Divackyafe2f232012-08-28 15:09:03 +00005738 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005739
5740 if (!Args.hasArg(options::OPT_nostdlib) &&
5741 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005742 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005743 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005744 if (Args.hasArg(options::OPT_pg))
5745 CmdArgs.push_back("-lm_p");
5746 else
5747 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005748 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005749 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5750 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005751 if (Args.hasArg(options::OPT_pg))
5752 CmdArgs.push_back("-lgcc_p");
5753 else
5754 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005755 if (Args.hasArg(options::OPT_static)) {
5756 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005757 } else if (Args.hasArg(options::OPT_pg)) {
5758 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005759 } else {
5760 CmdArgs.push_back("--as-needed");
5761 CmdArgs.push_back("-lgcc_s");
5762 CmdArgs.push_back("--no-as-needed");
5763 }
5764
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005765 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005766 if (Args.hasArg(options::OPT_pg))
5767 CmdArgs.push_back("-lpthread_p");
5768 else
5769 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005770 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005771
Roman Divacky66f22762011-02-10 16:59:40 +00005772 if (Args.hasArg(options::OPT_pg)) {
5773 if (Args.hasArg(options::OPT_shared))
5774 CmdArgs.push_back("-lc");
5775 else
5776 CmdArgs.push_back("-lc_p");
5777 CmdArgs.push_back("-lgcc_p");
5778 } else {
5779 CmdArgs.push_back("-lc");
5780 CmdArgs.push_back("-lgcc");
5781 }
5782
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005783 if (Args.hasArg(options::OPT_static)) {
5784 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005785 } else if (Args.hasArg(options::OPT_pg)) {
5786 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005787 } else {
5788 CmdArgs.push_back("--as-needed");
5789 CmdArgs.push_back("-lgcc_s");
5790 CmdArgs.push_back("--no-as-needed");
5791 }
5792 }
5793
5794 if (!Args.hasArg(options::OPT_nostdlib) &&
5795 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005796 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005797 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005798 else
5799 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005800 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005801 }
5802
Roman Divackyafe2f232012-08-28 15:09:03 +00005803 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005804
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005805 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005806 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005807 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005808}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005809
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005810void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5811 const InputInfo &Output,
5812 const InputInfoList &Inputs,
5813 const ArgList &Args,
5814 const char *LinkingOutput) const {
5815 ArgStringList CmdArgs;
5816
5817 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5818 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005819 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005820 CmdArgs.push_back("--32");
5821
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005822 // Set byte order explicitly
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005823 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005824 CmdArgs.push_back("-EB");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005825 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005826 CmdArgs.push_back("-EL");
5827
5828 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5829 options::OPT_Xassembler);
5830
5831 CmdArgs.push_back("-o");
5832 CmdArgs.push_back(Output.getFilename());
5833
5834 for (InputInfoList::const_iterator
5835 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5836 const InputInfo &II = *it;
5837 CmdArgs.push_back(II.getFilename());
5838 }
5839
David Chisnallddbd68f2011-09-27 22:03:18 +00005840 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005841 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5842}
5843
5844void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5845 const InputInfo &Output,
5846 const InputInfoList &Inputs,
5847 const ArgList &Args,
5848 const char *LinkingOutput) const {
5849 const Driver &D = getToolChain().getDriver();
5850 ArgStringList CmdArgs;
5851
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005852 if (!D.SysRoot.empty())
5853 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5854
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005855 if (Args.hasArg(options::OPT_static)) {
5856 CmdArgs.push_back("-Bstatic");
5857 } else {
5858 if (Args.hasArg(options::OPT_rdynamic))
5859 CmdArgs.push_back("-export-dynamic");
5860 CmdArgs.push_back("--eh-frame-hdr");
5861 if (Args.hasArg(options::OPT_shared)) {
5862 CmdArgs.push_back("-Bshareable");
5863 } else {
5864 CmdArgs.push_back("-dynamic-linker");
5865 CmdArgs.push_back("/libexec/ld.elf_so");
5866 }
5867 }
5868
5869 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5870 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005871 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005872 CmdArgs.push_back("-m");
5873 CmdArgs.push_back("elf_i386");
5874 }
5875
5876 if (Output.isFilename()) {
5877 CmdArgs.push_back("-o");
5878 CmdArgs.push_back(Output.getFilename());
5879 } else {
5880 assert(Output.isNothing() && "Invalid output.");
5881 }
5882
5883 if (!Args.hasArg(options::OPT_nostdlib) &&
5884 !Args.hasArg(options::OPT_nostartfiles)) {
5885 if (!Args.hasArg(options::OPT_shared)) {
5886 CmdArgs.push_back(Args.MakeArgString(
5887 getToolChain().GetFilePath("crt0.o")));
5888 CmdArgs.push_back(Args.MakeArgString(
5889 getToolChain().GetFilePath("crti.o")));
5890 CmdArgs.push_back(Args.MakeArgString(
5891 getToolChain().GetFilePath("crtbegin.o")));
5892 } else {
5893 CmdArgs.push_back(Args.MakeArgString(
5894 getToolChain().GetFilePath("crti.o")));
5895 CmdArgs.push_back(Args.MakeArgString(
5896 getToolChain().GetFilePath("crtbeginS.o")));
5897 }
5898 }
5899
5900 Args.AddAllArgs(CmdArgs, options::OPT_L);
5901 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5902 Args.AddAllArgs(CmdArgs, options::OPT_e);
5903 Args.AddAllArgs(CmdArgs, options::OPT_s);
5904 Args.AddAllArgs(CmdArgs, options::OPT_t);
5905 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5906 Args.AddAllArgs(CmdArgs, options::OPT_r);
5907
5908 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5909
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00005910 unsigned Major, Minor, Micro;
5911 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
5912 bool useLibgcc = true;
5913 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) {
5914 if (getToolChain().getArch() == llvm::Triple::x86 ||
5915 getToolChain().getArch() == llvm::Triple::x86_64)
5916 useLibgcc = false;
5917 }
5918
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005919 if (!Args.hasArg(options::OPT_nostdlib) &&
5920 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005921 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005922 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5923 CmdArgs.push_back("-lm");
5924 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005925 if (Args.hasArg(options::OPT_pthread))
5926 CmdArgs.push_back("-lpthread");
5927 CmdArgs.push_back("-lc");
5928
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00005929 if (useLibgcc) {
5930 if (Args.hasArg(options::OPT_static)) {
5931 // libgcc_eh depends on libc, so resolve as much as possible,
5932 // pull in any new requirements from libc and then get the rest
5933 // of libgcc.
5934 CmdArgs.push_back("-lgcc_eh");
5935 CmdArgs.push_back("-lc");
5936 CmdArgs.push_back("-lgcc");
5937 } else {
5938 CmdArgs.push_back("-lgcc");
5939 CmdArgs.push_back("--as-needed");
5940 CmdArgs.push_back("-lgcc_s");
5941 CmdArgs.push_back("--no-as-needed");
5942 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005943 }
5944 }
5945
5946 if (!Args.hasArg(options::OPT_nostdlib) &&
5947 !Args.hasArg(options::OPT_nostartfiles)) {
5948 if (!Args.hasArg(options::OPT_shared))
5949 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5950 "crtend.o")));
5951 else
5952 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5953 "crtendS.o")));
5954 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5955 "crtn.o")));
5956 }
5957
Bill Wendling08760582011-06-27 19:15:03 +00005958 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005959
David Chisnallddbd68f2011-09-27 22:03:18 +00005960 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005961 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5962}
5963
Thomas Schwinge4e555262013-03-28 19:04:25 +00005964void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5965 const InputInfo &Output,
5966 const InputInfoList &Inputs,
5967 const ArgList &Args,
5968 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00005969 ArgStringList CmdArgs;
5970
5971 // Add --32/--64 to make sure we get the format we want.
5972 // This is incomplete
5973 if (getToolChain().getArch() == llvm::Triple::x86) {
5974 CmdArgs.push_back("--32");
5975 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5976 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005977 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5978 CmdArgs.push_back("-a32");
5979 CmdArgs.push_back("-mppc");
5980 CmdArgs.push_back("-many");
5981 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5982 CmdArgs.push_back("-a64");
5983 CmdArgs.push_back("-mppc64");
5984 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00005985 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
5986 CmdArgs.push_back("-a64");
5987 CmdArgs.push_back("-mppc64le");
5988 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005989 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005990 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005991 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5992 CmdArgs.push_back("-mfpu=neon");
Bernard Ogdena58ef052013-10-24 18:32:41 +00005993 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a")
5994 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005995
5996 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5997 getToolChain().getTriple());
5998 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005999
6000 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
6001 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
6002 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006003 } else if (getToolChain().getArch() == llvm::Triple::mips ||
6004 getToolChain().getArch() == llvm::Triple::mipsel ||
6005 getToolChain().getArch() == llvm::Triple::mips64 ||
6006 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006007 StringRef CPUName;
6008 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006009 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006010
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006011 CmdArgs.push_back("-march");
6012 CmdArgs.push_back(CPUName.data());
6013
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006014 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006015 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00006016
6017 if (getToolChain().getArch() == llvm::Triple::mips ||
6018 getToolChain().getArch() == llvm::Triple::mips64)
6019 CmdArgs.push_back("-EB");
6020 else
6021 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006022
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006023 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6024 if (StringRef(A->getValue()) == "2008")
6025 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6026 }
6027
Simon Atanasyan036d16d2013-04-30 07:47:13 +00006028 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6029 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6030 options::OPT_mno_micromips);
6031 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6032 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6033
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006034 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6035 options::OPT_fpic, options::OPT_fno_pic,
6036 options::OPT_fPIE, options::OPT_fno_PIE,
6037 options::OPT_fpie, options::OPT_fno_pie);
6038 if (LastPICArg &&
6039 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6040 LastPICArg->getOption().matches(options::OPT_fpic) ||
6041 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6042 LastPICArg->getOption().matches(options::OPT_fpie))) {
6043 CmdArgs.push_back("-KPIC");
6044 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006045 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
Richard Sandiford4652d892013-07-19 16:51:51 +00006046 // Always pass an -march option, since our default of z10 is later
6047 // than the GNU assembler's default.
6048 StringRef CPUName = getSystemZTargetCPU(Args);
6049 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Rafael Espindola92b00932010-08-10 00:25:48 +00006050 }
6051
6052 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6053 options::OPT_Xassembler);
6054
6055 CmdArgs.push_back("-o");
6056 CmdArgs.push_back(Output.getFilename());
6057
6058 for (InputInfoList::const_iterator
6059 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6060 const InputInfo &II = *it;
6061 CmdArgs.push_back(II.getFilename());
6062 }
6063
6064 const char *Exec =
6065 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6066 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00006067
6068 // Handle the debug info splitting at object creation time if we're
6069 // creating an object.
6070 // TODO: Currently only works on linux with newer objcopy.
6071 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006072 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00006073 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6074 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00006075}
6076
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006077static void AddLibgcc(llvm::Triple Triple, const Driver &D,
6078 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00006079 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00006080 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6081 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00006082 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006083 CmdArgs.push_back("-lgcc");
6084
Logan Chien3d3373c2012-11-19 12:04:11 +00006085 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006086 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006087 CmdArgs.push_back("-lgcc");
6088 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00006089 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006090 CmdArgs.push_back("--as-needed");
6091 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00006092 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006093 CmdArgs.push_back("--no-as-needed");
6094 }
6095
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006096 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00006097 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00006098 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006099 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00006100
6101 // According to Android ABI, we have to link with libdl if we are
6102 // linking with non-static libgcc.
6103 //
6104 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6105 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6106 if (isAndroid && !StaticLibgcc)
6107 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00006108}
6109
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006110static bool hasMipsN32ABIArg(const ArgList &Args) {
6111 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smithbd55daf2012-11-01 04:30:05 +00006112 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006113}
6114
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006115static StringRef getLinuxDynamicLinker(const ArgList &Args,
6116 const toolchains::Linux &ToolChain) {
6117 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android)
6118 return "/system/bin/linker";
6119 else if (ToolChain.getArch() == llvm::Triple::x86)
6120 return "/lib/ld-linux.so.2";
6121 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6122 return "/lib/ld-linux-aarch64.so.1";
6123 else if (ToolChain.getArch() == llvm::Triple::arm ||
6124 ToolChain.getArch() == llvm::Triple::thumb) {
6125 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6126 return "/lib/ld-linux-armhf.so.3";
6127 else
6128 return "/lib/ld-linux.so.3";
6129 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6130 ToolChain.getArch() == llvm::Triple::mipsel)
6131 return "/lib/ld.so.1";
6132 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6133 ToolChain.getArch() == llvm::Triple::mips64el) {
6134 if (hasMipsN32ABIArg(Args))
6135 return "/lib32/ld.so.1";
6136 else
6137 return "/lib64/ld.so.1";
6138 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6139 return "/lib/ld.so.1";
6140 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
Bill Schmidt778d3872013-07-26 01:36:11 +00006141 ToolChain.getArch() == llvm::Triple::ppc64le ||
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006142 ToolChain.getArch() == llvm::Triple::systemz)
6143 return "/lib64/ld64.so.1";
6144 else
6145 return "/lib64/ld-linux-x86-64.so.2";
6146}
6147
Thomas Schwinge4e555262013-03-28 19:04:25 +00006148void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6149 const InputInfo &Output,
6150 const InputInfoList &Inputs,
6151 const ArgList &Args,
6152 const char *LinkingOutput) const {
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006153 const toolchains::Linux& ToolChain =
6154 static_cast<const toolchains::Linux&>(getToolChain());
6155 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00006156 const bool isAndroid =
6157 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Alexey Samsonov609213f92013-08-19 09:14:21 +00006158 const SanitizerArgs &Sanitize = D.getOrParseSanitizerArgs(Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006159 const bool IsPIE =
6160 !Args.hasArg(options::OPT_shared) &&
Alexey Samsonove6203662013-08-09 07:42:13 +00006161 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow(ToolChain));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006162
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006163 ArgStringList CmdArgs;
6164
Rafael Espindolad1002f62010-11-15 18:28:16 +00006165 // Silence warning for "clang -g foo.o -o foo"
6166 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006167 // and "clang -emit-llvm foo.o -o foo"
6168 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00006169 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00006170 // handled somewhere else.
6171 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00006172
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006173 if (!D.SysRoot.empty())
6174 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006175
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006176 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00006177 CmdArgs.push_back("-pie");
6178
Rafael Espindola1c76c592010-11-07 22:57:16 +00006179 if (Args.hasArg(options::OPT_rdynamic))
6180 CmdArgs.push_back("-export-dynamic");
6181
Rafael Espindola34d77dc2010-11-11 19:34:42 +00006182 if (Args.hasArg(options::OPT_s))
6183 CmdArgs.push_back("-s");
6184
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006185 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6186 e = ToolChain.ExtraOpts.end();
6187 i != e; ++i)
6188 CmdArgs.push_back(i->c_str());
6189
6190 if (!Args.hasArg(options::OPT_static)) {
6191 CmdArgs.push_back("--eh-frame-hdr");
6192 }
6193
6194 CmdArgs.push_back("-m");
6195 if (ToolChain.getArch() == llvm::Triple::x86)
6196 CmdArgs.push_back("elf_i386");
Tim Northover9bb857a2013-01-31 12:13:10 +00006197 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6198 CmdArgs.push_back("aarch64linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00006199 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00006200 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006201 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00006202 else if (ToolChain.getArch() == llvm::Triple::ppc)
6203 CmdArgs.push_back("elf32ppclinux");
6204 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6205 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00006206 else if (ToolChain.getArch() == llvm::Triple::mips)
6207 CmdArgs.push_back("elf32btsmip");
6208 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6209 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006210 else if (ToolChain.getArch() == llvm::Triple::mips64) {
6211 if (hasMipsN32ABIArg(Args))
6212 CmdArgs.push_back("elf32btsmipn32");
6213 else
6214 CmdArgs.push_back("elf64btsmip");
6215 }
6216 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
6217 if (hasMipsN32ABIArg(Args))
6218 CmdArgs.push_back("elf32ltsmipn32");
6219 else
6220 CmdArgs.push_back("elf64ltsmip");
6221 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006222 else if (ToolChain.getArch() == llvm::Triple::systemz)
6223 CmdArgs.push_back("elf64_s390");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006224 else
6225 CmdArgs.push_back("elf_x86_64");
6226
6227 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00006228 if (ToolChain.getArch() == llvm::Triple::arm
6229 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006230 CmdArgs.push_back("-Bstatic");
6231 else
6232 CmdArgs.push_back("-static");
6233 } else if (Args.hasArg(options::OPT_shared)) {
6234 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00006235 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006236 CmdArgs.push_back("-Bsymbolic");
6237 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006238 }
6239
6240 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00006241 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006242 (!Args.hasArg(options::OPT_static) &&
6243 !Args.hasArg(options::OPT_shared))) {
6244 CmdArgs.push_back("-dynamic-linker");
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006245 CmdArgs.push_back(Args.MakeArgString(
6246 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006247 }
6248
6249 CmdArgs.push_back("-o");
6250 CmdArgs.push_back(Output.getFilename());
6251
Rafael Espindola81937ec2010-12-01 01:52:43 +00006252 if (!Args.hasArg(options::OPT_nostdlib) &&
6253 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006254 if (!isAndroid) {
6255 const char *crt1 = NULL;
6256 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00006257 if (Args.hasArg(options::OPT_pg))
6258 crt1 = "gcrt1.o";
6259 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006260 crt1 = "Scrt1.o";
6261 else
6262 crt1 = "crt1.o";
6263 }
6264 if (crt1)
6265 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006266
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006267 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6268 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006269
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006270 const char *crtbegin;
6271 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006272 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006273 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006274 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006275 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006276 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006277 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006278 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006279 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00006280
6281 // Add crtfastmath.o if available and fast math is enabled.
6282 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006283 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006284
6285 Args.AddAllArgs(CmdArgs, options::OPT_L);
6286
6287 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6288
Roman Divackyee8188a2011-03-01 17:53:14 +00006289 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6290 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006291 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006292
Rafael Espindola9446d762012-04-09 23:53:34 +00006293 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
6294 // as gold requires -plugin to come before any -plugin-opt that -Wl might
6295 // forward.
Rafael Espindolab0092d72013-09-04 19:37:35 +00006296 if (D.IsUsingLTO(Args)) {
Rafael Espindola9446d762012-04-09 23:53:34 +00006297 CmdArgs.push_back("-plugin");
6298 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
6299 CmdArgs.push_back(Args.MakeArgString(Plugin));
Chandler Carruth953fb082013-01-13 11:46:33 +00006300
6301 // Try to pass driver level flags relevant to LTO code generation down to
6302 // the plugin.
6303
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006304 // Handle flags for selecting CPU variants.
6305 std::string CPU = getCPUName(Args, ToolChain.getTriple());
6306 if (!CPU.empty()) {
Chandler Carruth953fb082013-01-13 11:46:33 +00006307 CmdArgs.push_back(
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006308 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6309 CPU));
6310 }
Rafael Espindola9446d762012-04-09 23:53:34 +00006311 }
6312
Chandler Carruth953fb082013-01-13 11:46:33 +00006313
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00006314 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6315 CmdArgs.push_back("--no-demangle");
6316
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006317 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6318
Eric Christopher04997782012-11-29 18:51:05 +00006319 // Call these before we add the C++ ABI library.
Richard Smith52be6192012-11-05 22:04:41 +00006320 if (Sanitize.needsUbsanRt())
Hans Wennborg70850d82013-07-18 20:29:38 +00006321 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX(),
Richard Smithcff3cde2013-03-20 23:49:07 +00006322 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006323 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
Eric Christopher04997782012-11-29 18:51:05 +00006324 if (Sanitize.needsAsanRt())
6325 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6326 if (Sanitize.needsTsanRt())
6327 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00006328 if (Sanitize.needsMsanRt())
6329 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006330 if (Sanitize.needsLsanRt())
6331 addLsanRTLinux(getToolChain(), Args, CmdArgs);
Peter Collingbournec3772752013-08-07 22:47:34 +00006332 if (Sanitize.needsDfsanRt())
6333 addDfsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith4d3110a2012-10-25 02:14:12 +00006334
Chandler Carruthe4458b32013-06-24 09:38:45 +00006335 // The profile runtime also needs access to system libraries.
6336 addProfileRTLinux(getToolChain(), Args, CmdArgs);
6337
Hans Wennborg70850d82013-07-18 20:29:38 +00006338 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00006339 !Args.hasArg(options::OPT_nostdlib) &&
6340 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00006341 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6342 !Args.hasArg(options::OPT_static);
6343 if (OnlyLibstdcxxStatic)
6344 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006345 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00006346 if (OnlyLibstdcxxStatic)
6347 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006348 CmdArgs.push_back("-lm");
6349 }
6350
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006351 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00006352 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6353 if (Args.hasArg(options::OPT_static))
6354 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00006355
Chandler Carruth01538002013-01-17 13:19:29 +00006356 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6357 if (OpenMP) {
6358 CmdArgs.push_back("-lgomp");
6359
6360 // FIXME: Exclude this for platforms whith libgomp that doesn't require
6361 // librt. Most modern Linux platfroms require it, but some may not.
6362 CmdArgs.push_back("-lrt");
6363 }
6364
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006365 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006366
Chandler Carruth94a32012012-05-14 18:31:18 +00006367 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruth01538002013-01-17 13:19:29 +00006368 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth94a32012012-05-14 18:31:18 +00006369 CmdArgs.push_back("-lpthread");
6370
6371 CmdArgs.push_back("-lc");
6372
6373 if (Args.hasArg(options::OPT_static))
6374 CmdArgs.push_back("--end-group");
6375 else
6376 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6377 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00006378
Rafael Espindola81937ec2010-12-01 01:52:43 +00006379 if (!Args.hasArg(options::OPT_nostartfiles)) {
6380 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006381 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006382 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006383 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006384 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00006385 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006386 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006387
Rafael Espindola81937ec2010-12-01 01:52:43 +00006388 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006389 if (!isAndroid)
6390 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00006391 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006392 }
6393
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006394 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6395}
Rafael Espindola92b00932010-08-10 00:25:48 +00006396
Chris Lattner3e2ee142010-07-07 16:01:42 +00006397void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006398 const InputInfo &Output,
6399 const InputInfoList &Inputs,
6400 const ArgList &Args,
6401 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006402 ArgStringList CmdArgs;
6403
6404 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6405 options::OPT_Xassembler);
6406
6407 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006408 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006409
6410 for (InputInfoList::const_iterator
6411 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6412 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006413 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006414 }
6415
6416 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00006417 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006418 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006419}
6420
6421void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006422 const InputInfo &Output,
6423 const InputInfoList &Inputs,
6424 const ArgList &Args,
6425 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006426 const Driver &D = getToolChain().getDriver();
6427 ArgStringList CmdArgs;
6428
Daniel Dunbarb440f562010-08-02 02:38:21 +00006429 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006430 CmdArgs.push_back("-o");
6431 CmdArgs.push_back(Output.getFilename());
6432 } else {
6433 assert(Output.isNothing() && "Invalid output.");
6434 }
6435
6436 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00006437 !Args.hasArg(options::OPT_nostartfiles)) {
6438 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6439 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6440 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6441 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6442 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006443
6444 Args.AddAllArgs(CmdArgs, options::OPT_L);
6445 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6446 Args.AddAllArgs(CmdArgs, options::OPT_e);
6447
Daniel Dunbar54423b22010-09-17 00:24:54 +00006448 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006449
Eli Friedman83de5132011-12-08 23:54:21 +00006450 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6451
Chris Lattner3e2ee142010-07-07 16:01:42 +00006452 if (!Args.hasArg(options::OPT_nostdlib) &&
6453 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006454 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006455 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006456 CmdArgs.push_back("-lm");
6457 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006458 }
6459
6460 if (!Args.hasArg(options::OPT_nostdlib) &&
6461 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00006462 if (Args.hasArg(options::OPT_pthread))
6463 CmdArgs.push_back("-lpthread");
6464 CmdArgs.push_back("-lc");
6465 CmdArgs.push_back("-lCompilerRT-Generic");
6466 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6467 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00006468 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006469 }
6470
Eli Friedman83de5132011-12-08 23:54:21 +00006471 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006472 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006473}
6474
Daniel Dunbarcc912342009-05-02 18:28:39 +00006475/// DragonFly Tools
6476
6477// For now, DragonFly Assemble does just about the same as for
6478// FreeBSD, but this may change soon.
6479void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006480 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006481 const InputInfoList &Inputs,
6482 const ArgList &Args,
6483 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006484 ArgStringList CmdArgs;
6485
6486 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6487 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006488 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00006489 CmdArgs.push_back("--32");
6490
6491 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6492 options::OPT_Xassembler);
6493
6494 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006495 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006496
6497 for (InputInfoList::const_iterator
6498 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6499 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006500 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006501 }
6502
6503 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006504 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006505 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006506}
6507
6508void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006509 const InputInfo &Output,
6510 const InputInfoList &Inputs,
6511 const ArgList &Args,
6512 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00006513 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00006514 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00006515 ArgStringList CmdArgs;
6516
John McCall65b8da02013-04-11 22:55:55 +00006517 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6518 UseGCC47 = false;
6519
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006520 if (!D.SysRoot.empty())
6521 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6522
John McCall65b8da02013-04-11 22:55:55 +00006523 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006524 if (Args.hasArg(options::OPT_static)) {
6525 CmdArgs.push_back("-Bstatic");
6526 } else {
John McCall65b8da02013-04-11 22:55:55 +00006527 if (Args.hasArg(options::OPT_rdynamic))
6528 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006529 if (Args.hasArg(options::OPT_shared))
6530 CmdArgs.push_back("-Bshareable");
6531 else {
6532 CmdArgs.push_back("-dynamic-linker");
6533 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6534 }
John McCall65b8da02013-04-11 22:55:55 +00006535 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006536 }
6537
6538 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6539 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006540 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006541 CmdArgs.push_back("-m");
6542 CmdArgs.push_back("elf_i386");
6543 }
6544
Daniel Dunbarb440f562010-08-02 02:38:21 +00006545 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006546 CmdArgs.push_back("-o");
6547 CmdArgs.push_back(Output.getFilename());
6548 } else {
6549 assert(Output.isNothing() && "Invalid output.");
6550 }
6551
6552 if (!Args.hasArg(options::OPT_nostdlib) &&
6553 !Args.hasArg(options::OPT_nostartfiles)) {
6554 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00006555 if (Args.hasArg(options::OPT_pg))
6556 CmdArgs.push_back(Args.MakeArgString(
6557 getToolChain().GetFilePath("gcrt1.o")));
6558 else {
6559 if (Args.hasArg(options::OPT_pie))
6560 CmdArgs.push_back(Args.MakeArgString(
6561 getToolChain().GetFilePath("Scrt1.o")));
6562 else
6563 CmdArgs.push_back(Args.MakeArgString(
6564 getToolChain().GetFilePath("crt1.o")));
6565 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006566 }
John McCall65b8da02013-04-11 22:55:55 +00006567 CmdArgs.push_back(Args.MakeArgString(
6568 getToolChain().GetFilePath("crti.o")));
6569 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6570 CmdArgs.push_back(Args.MakeArgString(
6571 getToolChain().GetFilePath("crtbeginS.o")));
6572 else
6573 CmdArgs.push_back(Args.MakeArgString(
6574 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006575 }
6576
6577 Args.AddAllArgs(CmdArgs, options::OPT_L);
6578 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6579 Args.AddAllArgs(CmdArgs, options::OPT_e);
6580
Daniel Dunbar54423b22010-09-17 00:24:54 +00006581 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006582
6583 if (!Args.hasArg(options::OPT_nostdlib) &&
6584 !Args.hasArg(options::OPT_nodefaultlibs)) {
6585 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6586 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00006587 if (UseGCC47)
6588 CmdArgs.push_back("-L/usr/lib/gcc47");
6589 else
6590 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006591
6592 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00006593 if (UseGCC47) {
6594 CmdArgs.push_back("-rpath");
6595 CmdArgs.push_back("/usr/lib/gcc47");
6596 } else {
6597 CmdArgs.push_back("-rpath");
6598 CmdArgs.push_back("/usr/lib/gcc44");
6599 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006600 }
6601
Hans Wennborg70850d82013-07-18 20:29:38 +00006602 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006603 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006604 CmdArgs.push_back("-lm");
6605 }
6606
Daniel Dunbarcc912342009-05-02 18:28:39 +00006607 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006608 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006609
6610 if (!Args.hasArg(options::OPT_nolibc)) {
6611 CmdArgs.push_back("-lc");
6612 }
6613
John McCall65b8da02013-04-11 22:55:55 +00006614 if (UseGCC47) {
6615 if (Args.hasArg(options::OPT_static) ||
6616 Args.hasArg(options::OPT_static_libgcc)) {
6617 CmdArgs.push_back("-lgcc");
6618 CmdArgs.push_back("-lgcc_eh");
6619 } else {
6620 if (Args.hasArg(options::OPT_shared_libgcc)) {
6621 CmdArgs.push_back("-lgcc_pic");
6622 if (!Args.hasArg(options::OPT_shared))
6623 CmdArgs.push_back("-lgcc");
6624 } else {
6625 CmdArgs.push_back("-lgcc");
6626 CmdArgs.push_back("--as-needed");
6627 CmdArgs.push_back("-lgcc_pic");
6628 CmdArgs.push_back("--no-as-needed");
6629 }
6630 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006631 } else {
John McCall65b8da02013-04-11 22:55:55 +00006632 if (Args.hasArg(options::OPT_shared)) {
6633 CmdArgs.push_back("-lgcc_pic");
6634 } else {
6635 CmdArgs.push_back("-lgcc");
6636 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006637 }
6638 }
6639
6640 if (!Args.hasArg(options::OPT_nostdlib) &&
6641 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00006642 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006643 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006644 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00006645 else
6646 CmdArgs.push_back(Args.MakeArgString(
6647 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006648 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00006649 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006650 }
6651
Bill Wendling08760582011-06-27 19:15:03 +00006652 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006653
Daniel Dunbarcc912342009-05-02 18:28:39 +00006654 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006655 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006656 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006657}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006658
6659void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6660 const InputInfo &Output,
6661 const InputInfoList &Inputs,
6662 const ArgList &Args,
6663 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006664 ArgStringList CmdArgs;
6665
6666 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006667 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6668 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006669 } else {
6670 assert(Output.isNothing() && "Invalid output.");
6671 }
6672
6673 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg32e3b722013-08-09 17:38:42 +00006674 !Args.hasArg(options::OPT_nostartfiles) &&
6675 !C.getDriver().IsCLMode()) {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006676 CmdArgs.push_back("-defaultlib:libcmt");
6677 }
6678
6679 CmdArgs.push_back("-nologo");
6680
Hans Wennborgf1a74252013-09-10 20:18:04 +00006681 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
6682
6683 if (DLL) {
6684 CmdArgs.push_back(Args.MakeArgString("-dll"));
6685
6686 SmallString<128> ImplibName(Output.getFilename());
6687 llvm::sys::path::replace_extension(ImplibName, "lib");
6688 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
6689 ImplibName.str()));
6690 }
6691
Hans Wennborg65f17522013-08-27 18:10:21 +00006692 if (getToolChain().getDriver().getOrParseSanitizerArgs(Args).needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00006693 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00006694 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborg65f17522013-08-27 18:10:21 +00006695 SmallString<128> LibSanitizer(getToolChain().getDriver().ResourceDir);
Hans Wennborgf1a74252013-09-10 20:18:04 +00006696 llvm::sys::path::append(LibSanitizer, "lib", "windows");
6697 if (DLL) {
Timur Iskhodzhanov3b6adcb62013-09-11 11:45:31 +00006698 llvm::sys::path::append(LibSanitizer, "clang_rt.asan_dll_thunk-i386.lib");
Hans Wennborgf1a74252013-09-10 20:18:04 +00006699 } else {
6700 llvm::sys::path::append(LibSanitizer, "clang_rt.asan-i386.lib");
6701 }
6702 // FIXME: Handle 64-bit.
Hans Wennborg65f17522013-08-27 18:10:21 +00006703 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
6704 }
6705
Michael J. Spencere2f49362012-06-18 16:56:04 +00006706 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg2e274592013-08-13 23:38:57 +00006707 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00006708
6709 // Add filenames immediately.
6710 for (InputInfoList::const_iterator
6711 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6712 if (it->isFilename())
6713 CmdArgs.push_back(it->getFilename());
Hans Wennborgbe4a6762013-08-14 01:24:35 +00006714 else
6715 it->getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencere2f49362012-06-18 16:56:04 +00006716 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006717
6718 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006719 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006720 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6721}
Hans Wennborg87cfa712013-09-19 20:32:16 +00006722
6723void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
6724 const InputInfo &Output,
6725 const InputInfoList &Inputs,
6726 const ArgList &Args,
6727 const char *LinkingOutput) const {
6728 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
6729}
6730
Hans Wennborg188382e2013-09-20 18:16:35 +00006731// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
6732// If one cannot be found, return FallbackName.
6733// We do this special search to prevent clang-cl from falling back onto itself
6734// if it's available as cl.exe on the path.
6735static std::string FindFallback(const char *FallbackName,
6736 const char *ClangProgramPath) {
6737 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
6738 if (!OptPath.hasValue())
6739 return FallbackName;
6740
6741#ifdef LLVM_ON_WIN32
6742 const StringRef PathSeparators = ";";
6743#else
6744 const StringRef PathSeparators = ":";
6745#endif
6746
6747 SmallVector<StringRef, 8> PathSegments;
6748 llvm::SplitString(OptPath.getValue(), PathSegments, PathSeparators);
6749
6750 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
6751 const StringRef &PathSegment = PathSegments[i];
6752 if (PathSegment.empty())
6753 continue;
6754
6755 SmallString<128> FilePath(PathSegment);
6756 llvm::sys::path::append(FilePath, FallbackName);
6757 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
6758 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
6759 return FilePath.str();
6760 }
6761
6762 return FallbackName;
6763}
6764
Hans Wennborg87cfa712013-09-19 20:32:16 +00006765Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
6766 const InputInfo &Output,
6767 const InputInfoList &Inputs,
6768 const ArgList &Args,
6769 const char *LinkingOutput) const {
6770 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00006771 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00006772 CmdArgs.push_back("/c"); // Compile only.
6773 CmdArgs.push_back("/W0"); // No warnings.
6774
6775 // The goal is to be able to invoke this tool correctly based on
6776 // any flag accepted by clang-cl.
6777
6778 // These are spelled the same way in clang and cl.exe,.
6779 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
6780 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00006781
6782 // Optimization level.
6783 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
6784 if (A->getOption().getID() == options::OPT_O0) {
6785 CmdArgs.push_back("/Od");
6786 } else {
6787 StringRef OptLevel = A->getValue();
6788 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
6789 A->render(Args, CmdArgs);
6790 else if (OptLevel == "3")
6791 CmdArgs.push_back("/Ox");
6792 }
6793 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00006794
6795 // Flags for which clang-cl have an alias.
6796 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
6797
6798 if (Arg *A = Args.getLastArg(options::OPT_frtti, options::OPT_fno_rtti))
6799 CmdArgs.push_back(A->getOption().getID() == options::OPT_frtti ? "/GR"
6800 : "/GR-");
6801 if (Args.hasArg(options::OPT_fsyntax_only))
6802 CmdArgs.push_back("/Zs");
6803
Hans Wennborg260ff402013-09-27 17:54:18 +00006804 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
6805 for (size_t I = 0, E = Includes.size(); I != E; ++I)
6806 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Includes[I]));
6807
Hans Wennborg87cfa712013-09-19 20:32:16 +00006808 // Flags that can simply be passed through.
6809 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
6810 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
6811
6812 // The order of these flags is relevant, so pick the last one.
6813 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
6814 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
6815 A->render(Args, CmdArgs);
6816
6817
6818 // Input filename.
6819 assert(Inputs.size() == 1);
6820 const InputInfo &II = Inputs[0];
6821 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
6822 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
6823 if (II.isFilename())
6824 CmdArgs.push_back(II.getFilename());
6825 else
6826 II.getInputArg().renderAsInput(Args, CmdArgs);
6827
6828 // Output filename.
6829 assert(Output.getType() == types::TY_Object);
6830 const char *Fo = Args.MakeArgString(std::string("/Fo") +
6831 Output.getFilename());
6832 CmdArgs.push_back(Fo);
6833
Hans Wennborg188382e2013-09-20 18:16:35 +00006834 const Driver &D = getToolChain().getDriver();
6835 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborg87cfa712013-09-19 20:32:16 +00006836
Hans Wennborg188382e2013-09-20 18:16:35 +00006837 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00006838}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00006839
6840
6841/// XCore Tools
6842// We pass assemble and link construction to the xcc tool.
6843
6844void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6845 const InputInfo &Output,
6846 const InputInfoList &Inputs,
6847 const ArgList &Args,
6848 const char *LinkingOutput) const {
6849 ArgStringList CmdArgs;
6850
6851 CmdArgs.push_back("-o");
6852 CmdArgs.push_back(Output.getFilename());
6853
6854 CmdArgs.push_back("-c");
6855
6856 if (Args.hasArg(options::OPT_g_Group)) {
6857 CmdArgs.push_back("-g");
6858 }
6859
6860 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6861 options::OPT_Xassembler);
6862
6863 for (InputInfoList::const_iterator
6864 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6865 const InputInfo &II = *it;
6866 CmdArgs.push_back(II.getFilename());
6867 }
6868
6869 const char *Exec =
6870 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
6871 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6872}
6873
6874void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
6875 const InputInfo &Output,
6876 const InputInfoList &Inputs,
6877 const ArgList &Args,
6878 const char *LinkingOutput) const {
6879 ArgStringList CmdArgs;
6880
6881 if (Output.isFilename()) {
6882 CmdArgs.push_back("-o");
6883 CmdArgs.push_back(Output.getFilename());
6884 } else {
6885 assert(Output.isNothing() && "Invalid output.");
6886 }
6887
6888 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6889
6890 const char *Exec =
6891 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
6892 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6893}