blob: 0aac191bac0f0176bb7186049ee2228b23b0df61 [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
Amara Emerson703da2e2013-10-31 09:32:33 +0000542/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are targeting.
543//
544// FIXME: tblgen this.
545static std::string getAArch64TargetCPU(const ArgList &Args,
546 const llvm::Triple &Triple) {
547 // FIXME: Warn on inconsistent use of -mcpu and -march.
548
549 // If we have -mcpu=, use that.
550 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
551 StringRef MCPU = A->getValue();
552 // Handle -mcpu=native.
553 if (MCPU == "native")
554 return llvm::sys::getHostCPUName();
555 else
556 return MCPU;
557 }
558
559 return "generic";
560}
561
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000562// FIXME: Move to target hook.
563static bool isSignedCharDefault(const llvm::Triple &Triple) {
564 switch (Triple.getArch()) {
565 default:
566 return true;
567
Tim Northover9bb857a2013-01-31 12:13:10 +0000568 case llvm::Triple::aarch64:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000569 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000570 case llvm::Triple::ppc:
571 case llvm::Triple::ppc64:
Bob Wilson6524dd32011-10-14 05:03:44 +0000572 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000573 return true;
574 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000575
Bill Schmidt778d3872013-07-26 01:36:11 +0000576 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000577 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000578 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000579 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000580 }
581}
582
Robert Lytton0e076492013-08-13 09:43:10 +0000583static bool isNoCommonDefault(const llvm::Triple &Triple) {
584 switch (Triple.getArch()) {
585 default:
586 return false;
587
588 case llvm::Triple::xcore:
589 return true;
590 }
591}
592
Chad Rosiercfbfc582012-04-04 20:51:35 +0000593// Handle -mfpu=.
594//
595// FIXME: Centralize feature selection, defaulting shouldn't be also in the
596// frontend target.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000597static void getAArch64FPUFeatures(const Driver &D, const Arg *A,
598 const ArgList &Args,
599 std::vector<const char *> &Features) {
600 StringRef FPU = A->getValue();
601 if (FPU == "fp-armv8") {
602 Features.push_back("+fp-armv8");
603 } else if (FPU == "neon-fp-armv8") {
604 Features.push_back("+fp-armv8");
605 Features.push_back("+neon");
606 } else if (FPU == "crypto-neon-fp-armv8") {
607 Features.push_back("+fp-armv8");
608 Features.push_back("+neon");
609 Features.push_back("+crypto");
610 } else if (FPU == "neon") {
611 Features.push_back("+neon");
612 } else if (FPU == "none") {
613 Features.push_back("-fp-armv8");
614 Features.push_back("-crypto");
615 Features.push_back("-neon");
616 } else
617 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
618}
619
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000620// Handle -mhwdiv=.
621static void getARMHWDivFeatures(const Driver &D, const Arg *A,
622 const ArgList &Args,
623 std::vector<const char *> &Features) {
624 StringRef HWDiv = A->getValue();
625 if (HWDiv == "arm") {
626 Features.push_back("+hwdiv-arm");
627 Features.push_back("-hwdiv");
628 } else if (HWDiv == "thumb") {
629 Features.push_back("-hwdiv-arm");
630 Features.push_back("+hwdiv");
631 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
632 Features.push_back("+hwdiv-arm");
633 Features.push_back("+hwdiv");
634 } else if (HWDiv == "none") {
635 Features.push_back("-hwdiv-arm");
636 Features.push_back("-hwdiv");
637 } else
638 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
639}
640
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000641// Handle -mfpu=.
642//
643// FIXME: Centralize feature selection, defaulting shouldn't be also in the
644// frontend target.
645static void getARMFPUFeatures(const Driver &D, const Arg *A,
646 const ArgList &Args,
647 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000648 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000649
650 // Set the target features based on the FPU.
651 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
652 // Disable any default FPU support.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000653 Features.push_back("-vfp2");
654 Features.push_back("-vfp3");
655 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000656 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000657 Features.push_back("+vfp3");
658 Features.push_back("+d16");
659 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000660 } else if (FPU == "vfp") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000661 Features.push_back("+vfp2");
662 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000663 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000664 Features.push_back("+vfp3");
665 Features.push_back("-neon");
Joey Gouly7db275b2013-06-27 13:19:54 +0000666 } else if (FPU == "fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000667 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000668 Features.push_back("-neon");
669 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000670 } else if (FPU == "neon-fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000671 Features.push_back("+fp-armv8");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000672 Features.push_back("+neon");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000673 Features.push_back("-crypto");
Amara Emersonfc362c62013-09-19 13:54:03 +0000674 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersonfc362c62013-09-19 13:54:03 +0000675 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000676 Features.push_back("+neon");
677 Features.push_back("+crypto");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000678 } else if (FPU == "neon") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000679 Features.push_back("+neon");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000680 } else if (FPU == "none") {
681 Features.push_back("-vfp2");
682 Features.push_back("-vfp3");
683 Features.push_back("-vfp4");
684 Features.push_back("-fp-armv8");
685 Features.push_back("-crypto");
686 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000687 } else
688 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
689}
690
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000691// Select the float ABI as determined by -msoft-float, -mhard-float, and
692// -mfloat-abi=.
693static StringRef getARMFloatABI(const Driver &D,
694 const ArgList &Args,
695 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000696 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000697 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
698 options::OPT_mhard_float,
699 options::OPT_mfloat_abi_EQ)) {
700 if (A->getOption().matches(options::OPT_msoft_float))
701 FloatABI = "soft";
702 else if (A->getOption().matches(options::OPT_mhard_float))
703 FloatABI = "hard";
704 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000705 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000706 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000707 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000708 << A->getAsString(Args);
709 FloatABI = "soft";
710 }
711 }
712 }
713
714 // If unspecified, choose the default based on the platform.
715 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000716 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000717 case llvm::Triple::Darwin:
718 case llvm::Triple::MacOSX:
719 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000720 // Darwin defaults to "softfp" for v6 and v7.
721 //
722 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000723 std::string ArchName =
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000724 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000725 if (StringRef(ArchName).startswith("v6") ||
726 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000727 FloatABI = "softfp";
728 else
729 FloatABI = "soft";
730 break;
731 }
732
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000733 case llvm::Triple::FreeBSD:
734 // FreeBSD defaults to soft float
735 FloatABI = "soft";
736 break;
737
Daniel Dunbar78485922009-09-10 23:00:09 +0000738 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000739 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000740 case llvm::Triple::GNUEABIHF:
741 FloatABI = "hard";
742 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000743 case llvm::Triple::GNUEABI:
744 FloatABI = "softfp";
745 break;
746 case llvm::Triple::EABI:
747 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
748 FloatABI = "softfp";
749 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000750 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000751 std::string ArchName =
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000752 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000753 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000754 FloatABI = "softfp";
755 else
756 FloatABI = "soft";
757 break;
758 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000759 default:
760 // Assume "soft", but warn the user we are guessing.
761 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000762 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000763 break;
764 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000765 }
766 }
767
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000768 return FloatABI;
769}
770
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000771static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
772 const ArgList &Args,
773 std::vector<const char *> &Features) {
774 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
775 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
776 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
777 // stripped out by the ARM target.
778 // Use software floating point operations?
779 if (FloatABI == "soft")
780 Features.push_back("+soft-float");
781
782 // Use software floating point argument passing?
783 if (FloatABI != "hard")
784 Features.push_back("+soft-float-abi");
785
786 // Honor -mfpu=.
787 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000788 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000789 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
790 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000791
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000792 // Setting -msoft-float effectively disables NEON because of the GCC
793 // implementation, although the same isn't true of VFP or VFP3.
794 if (FloatABI == "soft")
795 Features.push_back("-neon");
Bernard Ogden18b57012013-10-29 09:47:51 +0000796
797 // En/disable crc
798 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
799 options::OPT_mnocrc)) {
800 if (A->getOption().matches(options::OPT_mcrc))
801 Features.push_back("+crc");
802 else
803 Features.push_back("-crc");
804 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000805}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000806
807void Clang::AddARMTargetArgs(const ArgList &Args,
808 ArgStringList &CmdArgs,
809 bool KernelOrKext) const {
810 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000811 // Get the effective triple, which takes into account the deployment target.
812 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
813 llvm::Triple Triple(TripleStr);
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000814 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000815
816 // Select the ABI to use.
817 //
818 // FIXME: Support -meabi.
819 const char *ABIName = 0;
820 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000821 ABIName = A->getValue();
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000822 } else if (Triple.isOSDarwin()) {
823 // The backend is hardwired to assume AAPCS for M-class processors, ensure
824 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000825 if (Triple.getEnvironment() == llvm::Triple::EABI ||
826 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000827 ABIName = "aapcs";
828 } else {
829 ABIName = "apcs-gnu";
830 }
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000831 } else {
832 // Select the default based on the platform.
833 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000834 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000835 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000836 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000837 ABIName = "aapcs-linux";
838 break;
839 case llvm::Triple::EABI:
840 ABIName = "aapcs";
841 break;
842 default:
843 ABIName = "apcs-gnu";
844 }
845 }
846 CmdArgs.push_back("-target-abi");
847 CmdArgs.push_back(ABIName);
848
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000849 // Determine floating point ABI from the options & target defaults.
850 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000851 if (FloatABI == "soft") {
852 // Floating point operations and argument passing are soft.
853 //
854 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000855 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000856 CmdArgs.push_back("-mfloat-abi");
857 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000858 } else if (FloatABI == "softfp") {
859 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000860 CmdArgs.push_back("-mfloat-abi");
861 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000862 } else {
863 // Floating point operations and argument passing are hard.
864 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000865 CmdArgs.push_back("-mfloat-abi");
866 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000867 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000868
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000869 // Kernel code has more strict alignment requirements.
870 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000871 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000872 CmdArgs.push_back("-backend-option");
873 CmdArgs.push_back("-arm-long-calls");
874 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000875
Daniel Dunbar12100e22011-03-22 16:48:17 +0000876 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000877 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000878
879 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000880 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000881 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000882 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000883
884 // Setting -mno-global-merge disables the codegen global merge pass. Setting
885 // -mglobal-merge has no effect as the pass is enabled by default.
886 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
887 options::OPT_mno_global_merge)) {
888 if (A->getOption().matches(options::OPT_mno_global_merge))
889 CmdArgs.push_back("-mno-global-merge");
890 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000891
Bob Wilson9c8af452013-04-11 18:53:25 +0000892 if (!Args.hasFlag(options::OPT_mimplicit_float,
893 options::OPT_mno_implicit_float,
894 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000895 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000896
897 // llvm does not support reserving registers in general. There is support
898 // for reserving r9 on ARM though (defined as a platform-specific register
899 // in ARM EABI).
900 if (Args.hasArg(options::OPT_ffixed_r9)) {
901 CmdArgs.push_back("-backend-option");
902 CmdArgs.push_back("-arm-reserve-r9");
903 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000904}
905
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000906// Get CPU and ABI names. They are not independent
907// so we have to calculate them together.
908static void getMipsCPUAndABI(const ArgList &Args,
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000909 const llvm::Triple &Triple,
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000910 StringRef &CPUName,
911 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000912 const char *DefMips32CPU = "mips32";
913 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000914
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000915 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000916 options::OPT_mcpu_EQ))
917 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000918
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000919 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000920 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000921 // Convert a GNU style Mips ABI name to the name
922 // accepted by LLVM Mips backend.
923 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
924 .Case("32", "o32")
925 .Case("64", "n64")
926 .Default(ABIName);
927 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000928
929 // Setup default CPU and ABI names.
930 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000931 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000932 default:
933 llvm_unreachable("Unexpected triple arch name");
934 case llvm::Triple::mips:
935 case llvm::Triple::mipsel:
936 CPUName = DefMips32CPU;
937 break;
938 case llvm::Triple::mips64:
939 case llvm::Triple::mips64el:
940 CPUName = DefMips64CPU;
941 break;
942 }
943 }
944
945 if (!ABIName.empty()) {
946 // Deduce CPU name from ABI name.
947 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000948 .Cases("32", "o32", "eabi", DefMips32CPU)
949 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000950 .Default("");
951 }
952 else if (!CPUName.empty()) {
953 // Deduce ABI name from CPU name.
954 ABIName = llvm::StringSwitch<const char *>(CPUName)
955 .Cases("mips32", "mips32r2", "o32")
956 .Cases("mips64", "mips64r2", "n64")
957 .Default("");
958 }
959
960 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000961}
962
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000963// Convert ABI name to the GNU tools acceptable variant.
964static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
965 return llvm::StringSwitch<llvm::StringRef>(ABI)
966 .Case("o32", "32")
967 .Case("n64", "64")
968 .Default(ABI);
969}
970
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000971// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
972// and -mfloat-abi=.
973static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000974 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000975 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000976 options::OPT_mhard_float,
977 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000978 if (A->getOption().matches(options::OPT_msoft_float))
979 FloatABI = "soft";
980 else if (A->getOption().matches(options::OPT_mhard_float))
981 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000982 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000983 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +0000984 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000985 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000986 FloatABI = "hard";
987 }
988 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000989 }
990
991 // If unspecified, choose the default based on the platform.
992 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000993 // Assume "hard", because it's a default value used by gcc.
994 // When we start to recognize specific target MIPS processors,
995 // we will be able to select the default more correctly.
996 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000997 }
998
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000999 return FloatABI;
1000}
1001
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001002static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001003 std::vector<const char *> &Features,
1004 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001005 StringRef FeatureName) {
1006 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001007 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001008 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001009 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001010 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001011 }
1012}
1013
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001014static void getMIPSTargetFeatures(const Driver &D, const ArgList &Args,
1015 std::vector<const char *> &Features) {
1016 StringRef FloatABI = getMipsFloatABI(D, Args);
1017 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
1018 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
1019 // FIXME: Note, this is a hack. We need to pass the selected float
1020 // mode to the MipsTargetInfoBase to define appropriate macros there.
1021 // Now it is the only method.
1022 Features.push_back("+soft-float");
1023 }
1024
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001025 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
1026 if (StringRef(A->getValue()) == "2008")
1027 Features.push_back("+nan2008");
1028 }
1029
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001030 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1031 options::OPT_mdouble_float, "single-float");
1032 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1033 "mips16");
1034 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1035 options::OPT_mno_micromips, "micromips");
1036 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1037 "dsp");
1038 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1039 "dspr2");
1040 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1041 "msa");
Daniel Sanders94694172013-10-17 14:55:58 +00001042 AddTargetFeature(Args, Features, options::OPT_mfp64, options::OPT_mfp32,
1043 "fp64");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001044}
1045
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001046void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001047 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001048 const Driver &D = getToolChain().getDriver();
1049 StringRef CPUName;
1050 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001051 const llvm::Triple &Triple = getToolChain().getTriple();
1052 getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001053
1054 CmdArgs.push_back("-target-abi");
1055 CmdArgs.push_back(ABIName.data());
1056
1057 StringRef FloatABI = getMipsFloatABI(D, Args);
1058
Simon Atanasyan81c423c2013-01-10 12:36:19 +00001059 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
1060
1061 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001062 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001063 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001064 CmdArgs.push_back("-mfloat-abi");
1065 CmdArgs.push_back("soft");
1066
Simon Atanasyan81c423c2013-01-10 12:36:19 +00001067 if (FloatABI == "hard" && IsMips16) {
1068 CmdArgs.push_back("-mllvm");
1069 CmdArgs.push_back("-mips16-hard-float");
1070 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001071 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001072 else {
1073 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001074 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001075 CmdArgs.push_back("-mfloat-abi");
1076 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001077 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001078
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001079 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1080 if (A->getOption().matches(options::OPT_mxgot)) {
1081 CmdArgs.push_back("-mllvm");
1082 CmdArgs.push_back("-mxgot");
1083 }
1084 }
1085
Simon Atanasyanc580b322013-05-11 06:33:44 +00001086 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1087 options::OPT_mno_ldc1_sdc1)) {
1088 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1089 CmdArgs.push_back("-mllvm");
1090 CmdArgs.push_back("-mno-ldc1-sdc1");
1091 }
1092 }
1093
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001094 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1095 options::OPT_mno_check_zero_division)) {
1096 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1097 CmdArgs.push_back("-mllvm");
1098 CmdArgs.push_back("-mno-check-zero-division");
1099 }
1100 }
1101
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001102 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001103 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001104 CmdArgs.push_back("-mllvm");
1105 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1106 A->claim();
1107 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001108}
1109
Hal Finkel8eb59282012-06-11 22:35:19 +00001110/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1111static std::string getPPCTargetCPU(const ArgList &Args) {
1112 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001113 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001114
1115 if (CPUName == "native") {
1116 std::string CPU = llvm::sys::getHostCPUName();
1117 if (!CPU.empty() && CPU != "generic")
1118 return CPU;
1119 else
1120 return "";
1121 }
1122
1123 return llvm::StringSwitch<const char *>(CPUName)
1124 .Case("common", "generic")
1125 .Case("440", "440")
1126 .Case("440fp", "440")
1127 .Case("450", "450")
1128 .Case("601", "601")
1129 .Case("602", "602")
1130 .Case("603", "603")
1131 .Case("603e", "603e")
1132 .Case("603ev", "603ev")
1133 .Case("604", "604")
1134 .Case("604e", "604e")
1135 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001136 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001137 .Case("G3", "g3")
1138 .Case("7400", "7400")
1139 .Case("G4", "g4")
1140 .Case("7450", "7450")
1141 .Case("G4+", "g4+")
1142 .Case("750", "750")
1143 .Case("970", "970")
1144 .Case("G5", "g5")
1145 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001146 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001147 .Case("e500mc", "e500mc")
1148 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001149 .Case("power3", "pwr3")
1150 .Case("power4", "pwr4")
1151 .Case("power5", "pwr5")
1152 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001153 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001154 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001155 .Case("power7", "pwr7")
Bill Schmidt38378a02013-02-01 20:23:10 +00001156 .Case("pwr3", "pwr3")
1157 .Case("pwr4", "pwr4")
1158 .Case("pwr5", "pwr5")
1159 .Case("pwr5x", "pwr5x")
1160 .Case("pwr6", "pwr6")
1161 .Case("pwr6x", "pwr6x")
1162 .Case("pwr7", "pwr7")
Hal Finkel8eb59282012-06-11 22:35:19 +00001163 .Case("powerpc", "ppc")
1164 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001165 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001166 .Default("");
1167 }
1168
1169 return "";
1170}
1171
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001172static void getPPCTargetFeatures(const ArgList &Args,
1173 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001174 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1175 ie = Args.filtered_end();
1176 it != ie; ++it) {
1177 StringRef Name = (*it)->getOption().getName();
1178 (*it)->claim();
1179
1180 // Skip over "-m".
1181 assert(Name.startswith("m") && "Invalid feature name.");
1182 Name = Name.substr(1);
1183
1184 bool IsNegative = Name.startswith("no-");
1185 if (IsNegative)
1186 Name = Name.substr(3);
1187
1188 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1189 // pass the correct option to the backend while calling the frontend
1190 // option the same.
1191 // TODO: Change the LLVM backend option maybe?
1192 if (Name == "mfcrf")
1193 Name = "mfocrf";
1194
1195 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1196 }
1197
1198 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001199 AddTargetFeature(Args, Features, options::OPT_faltivec,
1200 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001201}
1202
Tom Stellard6674c702013-04-01 20:56:53 +00001203/// Get the (LLVM) name of the R600 gpu we are targeting.
1204static std::string getR600TargetGPU(const ArgList &Args) {
1205 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001206 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001207 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001208 .Cases("rv630", "rv635", "r600")
1209 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001210 .Case("rv740", "rv770")
1211 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001212 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001213 .Case("hemlock", "cypress")
1214 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001215 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001216 }
1217 return "";
1218}
1219
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001220static void getSparcTargetFeatures(const ArgList &Args,
1221 std::vector<const char *> Features) {
1222 bool SoftFloatABI = true;
1223 if (Arg *A =
1224 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1225 if (A->getOption().matches(options::OPT_mhard_float))
1226 SoftFloatABI = false;
1227 }
1228 if (SoftFloatABI)
1229 Features.push_back("+soft-float");
1230}
1231
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001232void Clang::AddSparcTargetArgs(const ArgList &Args,
1233 ArgStringList &CmdArgs) const {
1234 const Driver &D = getToolChain().getDriver();
1235
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001236 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001237 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001238 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1239 options::OPT_mhard_float)) {
1240 if (A->getOption().matches(options::OPT_msoft_float))
1241 FloatABI = "soft";
1242 else if (A->getOption().matches(options::OPT_mhard_float))
1243 FloatABI = "hard";
1244 }
1245
1246 // If unspecified, choose the default based on the platform.
1247 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001248 // Assume "soft", but warn the user we are guessing.
1249 FloatABI = "soft";
1250 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001251 }
1252
1253 if (FloatABI == "soft") {
1254 // Floating point operations and argument passing are soft.
1255 //
1256 // FIXME: This changes CPP defines, we need -target-soft-float.
1257 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001258 } else {
1259 assert(FloatABI == "hard" && "Invalid float abi!");
1260 CmdArgs.push_back("-mhard-float");
1261 }
1262}
1263
Richard Sandiford4652d892013-07-19 16:51:51 +00001264static const char *getSystemZTargetCPU(const ArgList &Args) {
1265 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1266 return A->getValue();
1267 return "z10";
1268}
1269
Chandler Carruth953fb082013-01-13 11:46:33 +00001270static const char *getX86TargetCPU(const ArgList &Args,
1271 const llvm::Triple &Triple) {
1272 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1273 if (StringRef(A->getValue()) != "native")
1274 return A->getValue();
1275
1276 // FIXME: Reject attempts to use -march=native unless the target matches
1277 // the host.
1278 //
1279 // FIXME: We should also incorporate the detected target features for use
1280 // with -native.
1281 std::string CPU = llvm::sys::getHostCPUName();
1282 if (!CPU.empty() && CPU != "generic")
1283 return Args.MakeArgString(CPU);
1284 }
1285
1286 // Select the default CPU if none was given (or detection failed).
1287
1288 if (Triple.getArch() != llvm::Triple::x86_64 &&
1289 Triple.getArch() != llvm::Triple::x86)
1290 return 0; // This routine is only handling x86 targets.
1291
1292 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1293
1294 // FIXME: Need target hooks.
1295 if (Triple.isOSDarwin())
1296 return Is64Bit ? "core2" : "yonah";
1297
Chandler Carruth953fb082013-01-13 11:46:33 +00001298 // All x86 devices running Android have core2 as their common
1299 // denominator. This makes a better choice than pentium4.
1300 if (Triple.getEnvironment() == llvm::Triple::Android)
1301 return "core2";
1302
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001303 // Everything else goes to x86-64 in 64-bit mode.
1304 if (Is64Bit)
1305 return "x86-64";
1306
1307 switch (Triple.getOS()) {
1308 case llvm::Triple::FreeBSD:
1309 case llvm::Triple::NetBSD:
1310 case llvm::Triple::OpenBSD:
1311 return "i486";
1312 case llvm::Triple::Haiku:
1313 return "i586";
1314 case llvm::Triple::Bitrig:
1315 return "i686";
1316 default:
1317 // Fallback to p4.
1318 return "pentium4";
1319 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001320}
1321
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001322static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1323 switch(T.getArch()) {
1324 default:
1325 return "";
1326
Amara Emerson703da2e2013-10-31 09:32:33 +00001327 case llvm::Triple::aarch64:
1328 return getAArch64TargetCPU(Args, T);
1329
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001330 case llvm::Triple::arm:
1331 case llvm::Triple::thumb:
1332 return getARMTargetCPU(Args, T);
1333
1334 case llvm::Triple::mips:
1335 case llvm::Triple::mipsel:
1336 case llvm::Triple::mips64:
1337 case llvm::Triple::mips64el: {
1338 StringRef CPUName;
1339 StringRef ABIName;
1340 getMipsCPUAndABI(Args, T, CPUName, ABIName);
1341 return CPUName;
1342 }
1343
1344 case llvm::Triple::ppc:
1345 case llvm::Triple::ppc64:
1346 case llvm::Triple::ppc64le: {
1347 std::string TargetCPUName = getPPCTargetCPU(Args);
1348 // LLVM may default to generating code for the native CPU,
1349 // but, like gcc, we default to a more generic option for
1350 // each architecture. (except on Darwin)
1351 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1352 if (T.getArch() == llvm::Triple::ppc64)
1353 TargetCPUName = "ppc64";
1354 else if (T.getArch() == llvm::Triple::ppc64le)
1355 TargetCPUName = "ppc64le";
1356 else
1357 TargetCPUName = "ppc";
1358 }
1359 return TargetCPUName;
1360 }
1361
1362 case llvm::Triple::sparc:
1363 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1364 return A->getValue();
1365 return "";
1366
1367 case llvm::Triple::x86:
1368 case llvm::Triple::x86_64:
1369 return getX86TargetCPU(Args, T);
1370
1371 case llvm::Triple::hexagon:
1372 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1373
1374 case llvm::Triple::systemz:
1375 return getSystemZTargetCPU(Args);
1376
1377 case llvm::Triple::r600:
1378 return getR600TargetGPU(Args);
1379 }
1380}
1381
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001382static void getX86TargetFeatures(const ArgList &Args,
1383 std::vector<const char *> &Features) {
1384 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1385 ie = Args.filtered_end();
1386 it != ie; ++it) {
1387 StringRef Name = (*it)->getOption().getName();
1388 (*it)->claim();
1389
1390 // Skip over "-m".
1391 assert(Name.startswith("m") && "Invalid feature name.");
1392 Name = Name.substr(1);
1393
1394 bool IsNegative = Name.startswith("no-");
1395 if (IsNegative)
1396 Name = Name.substr(3);
1397
1398 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1399 }
1400}
1401
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001402void Clang::AddX86TargetArgs(const ArgList &Args,
1403 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001404 if (!Args.hasFlag(options::OPT_mred_zone,
1405 options::OPT_mno_red_zone,
1406 true) ||
1407 Args.hasArg(options::OPT_mkernel) ||
1408 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001409 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001410
Bob Wilson2616e2e2013-02-10 16:01:41 +00001411 // Default to avoid implicit floating-point for kernel/kext code, but allow
1412 // that to be overridden with -mno-soft-float.
1413 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1414 Args.hasArg(options::OPT_fapple_kext));
1415 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1416 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001417 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001418 options::OPT_mno_implicit_float)) {
1419 const Option &O = A->getOption();
1420 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1421 O.matches(options::OPT_msoft_float));
1422 }
1423 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001424 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001425}
1426
Matthew Curtise8f80a12012-12-06 17:49:03 +00001427static inline bool HasPICArg(const ArgList &Args) {
1428 return Args.hasArg(options::OPT_fPIC)
1429 || Args.hasArg(options::OPT_fpic);
1430}
1431
1432static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1433 return Args.getLastArg(options::OPT_G,
1434 options::OPT_G_EQ,
1435 options::OPT_msmall_data_threshold_EQ);
1436}
1437
1438static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1439 std::string value;
1440 if (HasPICArg(Args))
1441 value = "0";
1442 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1443 value = A->getValue();
1444 A->claim();
1445 }
1446 return value;
1447}
1448
Tony Linthicum76329bf2011-12-12 21:14:55 +00001449void Clang::AddHexagonTargetArgs(const ArgList &Args,
1450 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001451 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001452 CmdArgs.push_back("-mqdsp6-compat");
1453 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001454
Matthew Curtise8f80a12012-12-06 17:49:03 +00001455 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1456 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001457 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001458 CmdArgs.push_back(Args.MakeArgString(
1459 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001460 }
1461
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001462 if (!Args.hasArg(options::OPT_fno_short_enums))
1463 CmdArgs.push_back("-fshort-enums");
1464 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1465 CmdArgs.push_back ("-mllvm");
1466 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1467 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001468 CmdArgs.push_back ("-mllvm");
1469 CmdArgs.push_back ("-machine-sink-split=0");
1470}
1471
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001472static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1473 std::vector<const char *> &Features) {
Tim Northover2fe823a2013-08-01 09:23:19 +00001474 // Honor -mfpu=.
1475 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +00001476 getAArch64FPUFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001477}
1478
1479static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1480 const ArgList &Args, ArgStringList &CmdArgs) {
1481 std::vector<const char *> Features;
1482 switch (Triple.getArch()) {
1483 default:
1484 break;
1485 case llvm::Triple::mips:
1486 case llvm::Triple::mipsel:
1487 case llvm::Triple::mips64:
1488 case llvm::Triple::mips64el:
1489 getMIPSTargetFeatures(D, Args, Features);
1490 break;
1491
1492 case llvm::Triple::arm:
1493 case llvm::Triple::thumb:
1494 getARMTargetFeatures(D, Triple, Args, Features);
1495 break;
1496
1497 case llvm::Triple::ppc:
1498 case llvm::Triple::ppc64:
1499 case llvm::Triple::ppc64le:
1500 getPPCTargetFeatures(Args, Features);
1501 break;
1502 case llvm::Triple::sparc:
1503 getSparcTargetFeatures(Args, Features);
1504 break;
1505 case llvm::Triple::aarch64:
1506 getAArch64TargetFeatures(D, Args, Features);
1507 break;
1508 case llvm::Triple::x86:
1509 case llvm::Triple::x86_64:
1510 getX86TargetFeatures(Args, Features);
1511 break;
1512 }
Rafael Espindola43964802013-08-21 17:34:32 +00001513
1514 // Find the last of each feature.
1515 llvm::StringMap<unsigned> LastOpt;
1516 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1517 const char *Name = Features[I];
1518 assert(Name[0] == '-' || Name[0] == '+');
1519 LastOpt[Name + 1] = I;
1520 }
1521
1522 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1523 // If this feature was overridden, ignore it.
1524 const char *Name = Features[I];
1525 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1526 assert(LastI != LastOpt.end());
1527 unsigned Last = LastI->second;
1528 if (Last != I)
1529 continue;
1530
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001531 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001532 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001533 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001534}
1535
Eric Christopher84fbdb42011-08-19 00:30:14 +00001536static bool
John McCall5fb5df92012-06-20 06:18:46 +00001537shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001538 const llvm::Triple &Triple) {
1539 // We use the zero-cost exception tables for Objective-C if the non-fragile
1540 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1541 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001542 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001543 return true;
1544
Bob Wilson6524dd32011-10-14 05:03:44 +00001545 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001546 return false;
1547
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001548 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001549 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001550 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001551}
1552
Anders Carlssone96ab552011-02-28 02:27:16 +00001553/// addExceptionArgs - Adds exception related arguments to the driver command
1554/// arguments. There's a master flag, -fexceptions and also language specific
1555/// flags to enable/disable C++ and Objective-C exceptions.
1556/// This makes it possible to for example disable C++ exceptions but enable
1557/// Objective-C exceptions.
1558static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1559 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001560 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001561 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001562 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001563 if (KernelOrKext) {
1564 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1565 // arguments now to avoid warnings about unused arguments.
1566 Args.ClaimAllArgs(options::OPT_fexceptions);
1567 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1568 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1569 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1570 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1571 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001572 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001573 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001574
1575 // Exceptions are enabled by default.
1576 bool ExceptionsEnabled = true;
1577
1578 // This keeps track of whether exceptions were explicitly turned on or off.
1579 bool DidHaveExplicitExceptionFlag = false;
1580
Rafael Espindola00a66572009-10-01 13:33:33 +00001581 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1582 options::OPT_fno_exceptions)) {
1583 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001584 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001585 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001586 ExceptionsEnabled = false;
1587
1588 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001589 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001590
Anders Carlssone96ab552011-02-28 02:27:16 +00001591 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001592
Anders Carlssone96ab552011-02-28 02:27:16 +00001593 // Exception tables and cleanups can be enabled with -fexceptions even if the
1594 // language itself doesn't support exceptions.
1595 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1596 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001597
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001598 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1599 // is not necessarily sensible, but follows GCC.
1600 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001601 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001602 options::OPT_fno_objc_exceptions,
1603 true)) {
1604 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001605
Eric Christopher84fbdb42011-08-19 00:30:14 +00001606 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001607 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001608 }
1609
1610 if (types::isCXX(InputType)) {
1611 bool CXXExceptionsEnabled = ExceptionsEnabled;
1612
Eric Christopher84fbdb42011-08-19 00:30:14 +00001613 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1614 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001615 options::OPT_fexceptions,
1616 options::OPT_fno_exceptions)) {
1617 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1618 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001619 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001620 CXXExceptionsEnabled = false;
1621 }
1622
1623 if (CXXExceptionsEnabled) {
1624 CmdArgs.push_back("-fcxx-exceptions");
1625
1626 ShouldUseExceptionTables = true;
1627 }
1628 }
1629
1630 if (ShouldUseExceptionTables)
1631 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001632}
1633
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001634static bool ShouldDisableAutolink(const ArgList &Args,
1635 const ToolChain &TC) {
1636 bool Default = true;
1637 if (TC.getTriple().isOSDarwin()) {
1638 // The native darwin assembler doesn't support the linker_option directives,
1639 // so we disable them if we think the .s file will be passed to it.
1640 Default = TC.useIntegratedAs();
1641 }
1642 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1643 Default);
1644}
1645
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001646static bool ShouldDisableCFI(const ArgList &Args,
1647 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001648 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001649 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001650 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001651 // we disable them if we think the .s file will be passed to it.
Rafael Espindola84b588b2013-03-18 18:10:27 +00001652 Default = TC.useIntegratedAs();
Rafael Espindolaf934f982011-05-17 16:26:17 +00001653 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001654 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher45f2e712012-12-18 00:31:10 +00001655 options::OPT_fno_dwarf2_cfi_asm,
1656 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001657}
1658
Ted Kremenek62093662013-03-12 17:02:12 +00001659static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1660 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001661 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1662 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001663 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001664 return !UseDwarfDirectory;
1665}
1666
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001667/// \brief Check whether the given input tree contains any compilation actions.
1668static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001669 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001670 return true;
1671
1672 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1673 if (ContainsCompileAction(*it))
1674 return true;
1675
1676 return false;
1677}
1678
1679/// \brief Check if -relax-all should be passed to the internal assembler.
1680/// This is done by default when compiling non-assembler source with -O0.
1681static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1682 bool RelaxDefault = true;
1683
1684 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1685 RelaxDefault = A->getOption().matches(options::OPT_O0);
1686
1687 if (RelaxDefault) {
1688 RelaxDefault = false;
1689 for (ActionList::const_iterator it = C.getActions().begin(),
1690 ie = C.getActions().end(); it != ie; ++it) {
1691 if (ContainsCompileAction(*it)) {
1692 RelaxDefault = true;
1693 break;
1694 }
1695 }
1696 }
1697
1698 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1699 RelaxDefault);
1700}
1701
David Blaikie9260ed62013-07-25 21:19:01 +00001702static void CollectArgsForIntegratedAssembler(Compilation &C,
1703 const ArgList &Args,
1704 ArgStringList &CmdArgs,
1705 const Driver &D) {
1706 if (UseRelaxAll(C, Args))
1707 CmdArgs.push_back("-mrelax-all");
1708
1709 // When using an integrated assembler, translate -Wa, and -Xassembler
1710 // options.
1711 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1712 options::OPT_Xassembler),
1713 ie = Args.filtered_end(); it != ie; ++it) {
1714 const Arg *A = *it;
1715 A->claim();
1716
1717 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1718 StringRef Value = A->getValue(i);
1719
1720 if (Value == "-force_cpusubtype_ALL") {
1721 // Do nothing, this is the default and we don't support anything else.
1722 } else if (Value == "-L") {
1723 CmdArgs.push_back("-msave-temp-labels");
1724 } else if (Value == "--fatal-warnings") {
1725 CmdArgs.push_back("-mllvm");
1726 CmdArgs.push_back("-fatal-assembler-warnings");
1727 } else if (Value == "--noexecstack") {
1728 CmdArgs.push_back("-mnoexecstack");
1729 } else {
1730 D.Diag(diag::err_drv_unsupported_option_argument)
1731 << A->getOption().getName() << Value;
1732 }
1733 }
1734 }
1735}
1736
Chandler Carruth36381702013-06-23 11:28:48 +00001737static void addProfileRTLinux(
1738 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1739 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1740 Args.hasArg(options::OPT_fprofile_generate) ||
1741 Args.hasArg(options::OPT_fcreate_profile) ||
1742 Args.hasArg(options::OPT_coverage)))
1743 return;
1744
1745 // The profile runtime is located in the Linux library directory and has name
1746 // "libclang_rt.profile-<ArchName>.a".
1747 SmallString<128> LibProfile(TC.getDriver().ResourceDir);
1748 llvm::sys::path::append(
1749 LibProfile, "lib", "linux",
1750 Twine("libclang_rt.profile-") + TC.getArchName() + ".a");
1751
1752 CmdArgs.push_back(Args.MakeArgString(LibProfile));
1753}
1754
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001755static void addSanitizerRTLinkFlagsLinux(
1756 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smithf3e624c2013-03-23 00:30:08 +00001757 const StringRef Sanitizer, bool BeforeLibStdCXX,
1758 bool ExportSymbols = true) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001759 // Sanitizer runtime is located in the Linux library directory and
1760 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1761 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1762 llvm::sys::path::append(
1763 LibSanitizer, "lib", "linux",
1764 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
Richard Smithcff3cde2013-03-20 23:49:07 +00001765
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001766 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1767 // etc.) so that the linker picks custom versions of the global 'operator
1768 // new' and 'operator delete' symbols. We take the extreme (but simple)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001769 // strategy of inserting it at the front of the link command. It also
1770 // needs to be forced to end up in the executable, so wrap it in
1771 // whole-archive.
Richard Smithcff3cde2013-03-20 23:49:07 +00001772 SmallVector<const char *, 3> LibSanitizerArgs;
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001773 LibSanitizerArgs.push_back("-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001774 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001775 LibSanitizerArgs.push_back("-no-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001776
1777 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1778 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1779
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001780 CmdArgs.push_back("-lpthread");
Evgeniy Stepanov758b5072013-05-24 14:28:03 +00001781 CmdArgs.push_back("-lrt");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001782 CmdArgs.push_back("-ldl");
Evgeniy Stepanov4ae68462013-10-29 19:48:47 +00001783 CmdArgs.push_back("-lm");
Richard Smithf3e624c2013-03-23 00:30:08 +00001784
1785 // If possible, use a dynamic symbols file to export the symbols from the
1786 // runtime library. If we can't do so, use -export-dynamic instead to export
1787 // all symbols from the binary.
1788 if (ExportSymbols) {
1789 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1790 CmdArgs.push_back(
1791 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1792 else
1793 CmdArgs.push_back("-export-dynamic");
1794 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001795}
1796
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001797/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1798/// This needs to be called before we add the C run-time (malloc, etc).
1799static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001800 ArgStringList &CmdArgs) {
Nick Lewycky609dd662013-10-11 03:33:53 +00001801 if (TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001802 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1803 llvm::sys::path::append(LibAsan, "lib", "linux",
1804 (Twine("libclang_rt.asan-") +
1805 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay35439df2012-12-04 21:18:26 +00001806 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001807 } else {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001808 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001809 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001810 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001811}
1812
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001813/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1814/// This needs to be called before we add the C run-time (malloc, etc).
1815static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1816 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001817 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001818 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001819}
1820
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001821/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1822/// This needs to be called before we add the C run-time (malloc, etc).
1823static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1824 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001825 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001826 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001827}
1828
1829/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
1830/// This needs to be called before we add the C run-time (malloc, etc).
1831static void addLsanRTLinux(const ToolChain &TC, const ArgList &Args,
1832 ArgStringList &CmdArgs) {
1833 if (!Args.hasArg(options::OPT_shared))
1834 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001835}
1836
Richard Smithe30752c2012-10-09 19:52:38 +00001837/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1838/// (Linux).
1839static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
Richard Smithcff3cde2013-03-20 23:49:07 +00001840 ArgStringList &CmdArgs, bool IsCXX,
1841 bool HasOtherSanitizerRt) {
Nick Lewycky24921692013-10-19 00:27:23 +00001842 // Need a copy of sanitizer_common. This could come from another sanitizer
1843 // runtime; if we're not including one, include our own copy.
1844 if (!HasOtherSanitizerRt)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001845 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
1846
1847 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
1848
1849 // Only include the bits of the runtime which need a C++ ABI library if
1850 // we're linking in C++ mode.
1851 if (IsCXX)
1852 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smithe30752c2012-10-09 19:52:38 +00001853}
1854
Peter Collingbournec3772752013-08-07 22:47:34 +00001855static void addDfsanRTLinux(const ToolChain &TC, const ArgList &Args,
1856 ArgStringList &CmdArgs) {
1857 if (!Args.hasArg(options::OPT_shared))
1858 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "dfsan", true);
1859}
1860
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001861static bool shouldUseFramePointerForTarget(const ArgList &Args,
1862 const llvm::Triple &Triple) {
1863 switch (Triple.getArch()) {
1864 // Don't use a frame pointer on linux if optimizing for certain targets.
1865 case llvm::Triple::mips64:
1866 case llvm::Triple::mips64el:
1867 case llvm::Triple::mips:
1868 case llvm::Triple::mipsel:
1869 case llvm::Triple::systemz:
1870 case llvm::Triple::x86:
1871 case llvm::Triple::x86_64:
1872 if (Triple.isOSLinux())
1873 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1874 if (!A->getOption().matches(options::OPT_O0))
1875 return false;
1876 return true;
1877 case llvm::Triple::xcore:
1878 return false;
1879 default:
1880 return true;
1881 }
1882}
1883
Rafael Espindola224dd632011-12-14 21:02:23 +00001884static bool shouldUseFramePointer(const ArgList &Args,
1885 const llvm::Triple &Triple) {
1886 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1887 options::OPT_fomit_frame_pointer))
1888 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1889
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001890 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00001891}
1892
Eric Christopherb7d97e92013-04-03 01:58:53 +00001893static bool shouldUseLeafFramePointer(const ArgList &Args,
1894 const llvm::Triple &Triple) {
1895 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1896 options::OPT_momit_leaf_frame_pointer))
1897 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1898
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001899 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00001900}
1901
Rafael Espindolac7367ff2013-08-10 01:40:10 +00001902/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001903static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00001904 SmallString<128> cwd;
1905 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00001906 CmdArgs.push_back("-fdebug-compilation-dir");
1907 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001908 }
1909}
1910
Eric Christopherd3804002013-02-22 20:12:52 +00001911static const char *SplitDebugName(const ArgList &Args,
1912 const InputInfoList &Inputs) {
1913 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1914 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1915 SmallString<128> T(FinalOutput->getValue());
1916 llvm::sys::path::replace_extension(T, "dwo");
1917 return Args.MakeArgString(T);
1918 } else {
1919 // Use the compilation dir.
1920 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1921 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1922 llvm::sys::path::replace_extension(F, "dwo");
1923 T += F;
1924 return Args.MakeArgString(F);
1925 }
1926}
1927
1928static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1929 const Tool &T, const JobAction &JA,
1930 const ArgList &Args, const InputInfo &Output,
1931 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00001932 ArgStringList ExtractArgs;
1933 ExtractArgs.push_back("--extract-dwo");
1934
1935 ArgStringList StripArgs;
1936 StripArgs.push_back("--strip-dwo");
1937
1938 // Grabbing the output of the earlier compile step.
1939 StripArgs.push_back(Output.getFilename());
1940 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00001941 ExtractArgs.push_back(OutFile);
1942
1943 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00001944 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00001945
1946 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00001947 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001948
1949 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00001950 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001951}
1952
Chad Rosierb71f6aa2013-04-24 18:09:54 +00001953static bool isOptimizationLevelFast(const ArgList &Args) {
1954 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1955 if (A->getOption().matches(options::OPT_Ofast))
1956 return true;
1957 return false;
1958}
1959
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001960/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
1961static bool shouldEnableVectorizerAtOLevel(const ArgList &Args) {
1962 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00001963 if (A->getOption().matches(options::OPT_O4) ||
1964 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001965 return true;
1966
1967 if (A->getOption().matches(options::OPT_O0))
1968 return false;
1969
1970 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
1971
Rafael Espindola91780de2013-08-26 14:05:41 +00001972 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001973 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00001974 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001975 return true;
1976
1977 // Don't vectorize -Oz.
1978 if (S == "z")
1979 return false;
1980
1981 unsigned OptLevel = 0;
1982 if (S.getAsInteger(10, OptLevel))
1983 return false;
1984
1985 return OptLevel > 1;
1986 }
1987
1988 return false;
1989}
1990
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001991void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001992 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001993 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001994 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001995 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001996 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1997 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001998 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001999 ArgStringList CmdArgs;
2000
Daniel Dunbare521a892009-03-31 20:53:55 +00002001 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2002
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002003 // Invoke ourselves in -cc1 mode.
2004 //
2005 // FIXME: Implement custom jobs for internal actions.
2006 CmdArgs.push_back("-cc1");
2007
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002008 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002009 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002010 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002011 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002012
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002013 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002014 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002015
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002016 if (isa<AnalyzeJobAction>(JA)) {
2017 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2018 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002019 } else if (isa<MigrateJobAction>(JA)) {
2020 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002021 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002022 if (Output.getType() == types::TY_Dependencies)
2023 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002024 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002025 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002026 if (Args.hasArg(options::OPT_rewrite_objc) &&
2027 !Args.hasArg(options::OPT_g_Group))
2028 CmdArgs.push_back("-P");
2029 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002030 } else if (isa<AssembleJobAction>(JA)) {
2031 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002032
David Blaikie9260ed62013-07-25 21:19:01 +00002033 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002034
2035 // Also ignore explicit -force_cpusubtype_ALL option.
2036 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002037 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002038 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002039 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002040
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002041 if (JA.getType() == types::TY_Nothing)
2042 CmdArgs.push_back("-fsyntax-only");
2043 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002044 CmdArgs.push_back("-emit-pch");
2045 else
2046 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002047 } else {
2048 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002049
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002050 if (JA.getType() == types::TY_Nothing) {
2051 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002052 } else if (JA.getType() == types::TY_LLVM_IR ||
2053 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002054 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002055 } else if (JA.getType() == types::TY_LLVM_BC ||
2056 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002057 CmdArgs.push_back("-emit-llvm-bc");
2058 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002059 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002060 } else if (JA.getType() == types::TY_AST) {
2061 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002062 } else if (JA.getType() == types::TY_ModuleFile) {
2063 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002064 } else if (JA.getType() == types::TY_RewrittenObjC) {
2065 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002066 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002067 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2068 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002069 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002070 } else {
2071 assert(JA.getType() == types::TY_PP_Asm &&
2072 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002073 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002074 }
2075
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002076 // The make clang go fast button.
2077 CmdArgs.push_back("-disable-free");
2078
John McCallbb79b5f2010-02-13 03:50:24 +00002079 // Disable the verification pass in -asserts builds.
2080#ifdef NDEBUG
2081 CmdArgs.push_back("-disable-llvm-verifier");
2082#endif
2083
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002084 // Set the main file name, so that debug info works even with
2085 // -save-temps.
2086 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002087 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002088
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002089 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002090 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002091 if (Args.hasArg(options::OPT_static))
2092 CmdArgs.push_back("-static-define");
2093
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002094 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002095 // Enable region store model by default.
2096 CmdArgs.push_back("-analyzer-store=region");
2097
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002098 // Treat blocks as analysis entry points.
2099 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2100
Ted Kremenek49c79792011-03-24 00:28:47 +00002101 CmdArgs.push_back("-analyzer-eagerly-assume");
2102
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002103 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002104 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002105 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002106
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002107 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
2108 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002109
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002110 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002111 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002112
2113 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002114
Jordan Rose10ad0812013-04-05 17:55:07 +00002115 if (types::isCXX(Inputs[0].getType()))
2116 CmdArgs.push_back("-analyzer-checker=cplusplus");
2117
Ted Kremenek37e96522012-01-26 02:27:38 +00002118 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00002119 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2120 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2121 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2122 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2123 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2124 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002125 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002126
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002127 // Set the output format. The default is plist, for (lame) historical
2128 // reasons.
2129 CmdArgs.push_back("-analyzer-output");
2130 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002131 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002132 else
2133 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002134
Ted Kremenekfe449a22010-03-22 22:32:05 +00002135 // Disable the presentation of standard compiler warnings when
2136 // using --analyze. We only want to show static analyzer diagnostics
2137 // or frontend errors.
2138 CmdArgs.push_back("-w");
2139
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002140 // Add -Xanalyzer arguments when running as analyzer.
2141 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002142 }
2143
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002144 CheckCodeGenerationOptions(D, Args);
2145
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002146 bool PIE = getToolChain().isPIEDefault();
2147 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002148 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002149
Alexey Samsonov090301e2013-04-09 12:28:19 +00002150 // For the PIC and PIE flag options, this logic is different from the
2151 // legacy logic in very old versions of GCC, as that logic was just
2152 // a bug no one had ever fixed. This logic is both more rational and
2153 // consistent with GCC's new logic now that the bugs are fixed. The last
2154 // argument relating to either PIC or PIE wins, and no other argument is
2155 // used. If the last argument is any flavor of the '-fno-...' arguments,
2156 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2157 // at the same level.
2158 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2159 options::OPT_fpic, options::OPT_fno_pic,
2160 options::OPT_fPIE, options::OPT_fno_PIE,
2161 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002162 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2163 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002164 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002165 if (LastPICArg) {
2166 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002167 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2168 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2169 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2170 PIC = PIE || O.matches(options::OPT_fPIC) ||
2171 O.matches(options::OPT_fpic);
2172 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2173 O.matches(options::OPT_fPIC);
2174 } else {
2175 PIE = PIC = false;
2176 }
2177 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002178 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002179
Nick Lewycky609dd662013-10-11 03:33:53 +00002180 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002181 // specified while enabling PIC enabled level 1 PIC, just force it back to
2182 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2183 // informal testing).
2184 if (PIC && getToolChain().getTriple().isOSDarwin())
2185 IsPICLevelTwo |= getToolChain().isPICDefault();
2186
Chandler Carruthc0c04552012-04-08 16:40:35 +00002187 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2188 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002189 llvm::Triple Triple(TripleStr);
Eric Christopher8d56caa2013-02-18 01:16:37 +00002190 if (KernelOrKext &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002191 (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002192 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002193 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002194 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002195
Chandler Carruth76a943b2012-11-19 03:52:03 +00002196 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2197 // This is a very special mode. It trumps the other modes, almost no one
2198 // uses it, and it isn't even valid on any OS but Darwin.
2199 if (!getToolChain().getTriple().isOSDarwin())
2200 D.Diag(diag::err_drv_unsupported_opt_for_target)
2201 << A->getSpelling() << getToolChain().getTriple().str();
2202
2203 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2204
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002205 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002206 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002207
Chandler Carruth76a943b2012-11-19 03:52:03 +00002208 // Only a forced PIC mode can cause the actual compile to have PIC defines
2209 // etc., no flags are sufficient. This behavior was selected to closely
2210 // match that of llvm-gcc and Apple GCC before that.
2211 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2212 CmdArgs.push_back("-pic-level");
2213 CmdArgs.push_back("2");
2214 }
2215 } else {
2216 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2217 // handled in Clang's IRGen by the -pie-level flag.
2218 CmdArgs.push_back("-mrelocation-model");
2219 CmdArgs.push_back(PIC ? "pic" : "static");
2220
2221 if (PIC) {
2222 CmdArgs.push_back("-pic-level");
2223 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2224 if (PIE) {
2225 CmdArgs.push_back("-pie-level");
2226 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2227 }
2228 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002229 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002230
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002231 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2232 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002233 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002234
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002235 // LLVM Code Generator Options.
2236
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002237 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2238 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002239 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002240 }
2241
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002242 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2243 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002244 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002245 D.Diag(diag::err_drv_unsupported_opt_for_target)
2246 << A->getSpelling() << getToolChain().getTriple().str();
2247 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2248 CmdArgs.push_back("-fpcc-struct-return");
2249 } else {
2250 assert(A->getOption().matches(options::OPT_freg_struct_return));
2251 CmdArgs.push_back("-freg-struct-return");
2252 }
2253 }
2254
Roman Divacky65b88cd2011-03-01 17:40:53 +00002255 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2256 CmdArgs.push_back("-mrtd");
2257
Rafael Espindola224dd632011-12-14 21:02:23 +00002258 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002259 CmdArgs.push_back("-mdisable-fp-elim");
2260 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2261 options::OPT_fno_zero_initialized_in_bss))
2262 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002263
2264 bool OFastEnabled = isOptimizationLevelFast(Args);
2265 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2266 // enabled. This alias option is being used to simplify the hasFlag logic.
2267 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2268 options::OPT_fstrict_aliasing;
2269 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00002270 options::OPT_fno_strict_aliasing,
2271 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00002272 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002273 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2274 options::OPT_fno_struct_path_tbaa))
2275 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002276 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2277 false))
2278 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002279 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2280 options::OPT_fno_optimize_sibling_calls))
2281 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002282
Eric Christopher006208c2013-04-04 06:29:47 +00002283 // Handle segmented stacks.
2284 if (Args.hasArg(options::OPT_fsplit_stack))
2285 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002286
2287 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2288 // This alias option is being used to simplify the getLastArg logic.
2289 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2290 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002291
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002292 // Handle various floating point optimization flags, mapping them to the
2293 // appropriate LLVM code generation flags. The pattern for all of these is to
2294 // default off the codegen optimizations, and if any flag enables them and no
2295 // flag disables them after the flag enabling them, enable the codegen
2296 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002297 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002298 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002299 options::OPT_ffinite_math_only,
2300 options::OPT_fno_finite_math_only,
2301 options::OPT_fhonor_infinities,
2302 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002303 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2304 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002305 A->getOption().getID() != options::OPT_fhonor_infinities)
2306 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002307 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002308 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002309 options::OPT_ffinite_math_only,
2310 options::OPT_fno_finite_math_only,
2311 options::OPT_fhonor_nans,
2312 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002313 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2314 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002315 A->getOption().getID() != options::OPT_fhonor_nans)
2316 CmdArgs.push_back("-menable-no-nans");
2317
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002318 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2319 bool MathErrno = getToolChain().IsMathErrnoDefault();
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_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002323 options::OPT_fno_math_errno)) {
2324 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2325 // However, turning *off* -ffast_math merely restores the toolchain default
2326 // (which may be false).
2327 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2328 A->getOption().getID() == options::OPT_ffast_math ||
2329 A->getOption().getID() == options::OPT_Ofast)
2330 MathErrno = false;
2331 else if (A->getOption().getID() == options::OPT_fmath_errno)
2332 MathErrno = true;
2333 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002334 if (MathErrno)
2335 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002336
2337 // There are several flags which require disabling very specific
2338 // optimizations. Any of these being disabled forces us to turn off the
2339 // entire set of LLVM optimizations, so collect them through all the flag
2340 // madness.
2341 bool AssociativeMath = false;
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_fassociative_math,
2347 options::OPT_fno_associative_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_fno_associative_math)
2351 AssociativeMath = true;
2352 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002353 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002354 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002355 options::OPT_funsafe_math_optimizations,
2356 options::OPT_fno_unsafe_math_optimizations,
2357 options::OPT_freciprocal_math,
2358 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002359 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2360 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002361 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2362 ReciprocalMath = true;
2363 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002364 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002365 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002366 options::OPT_funsafe_math_optimizations,
2367 options::OPT_fno_unsafe_math_optimizations,
2368 options::OPT_fsigned_zeros,
2369 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002370 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2371 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002372 A->getOption().getID() != options::OPT_fsigned_zeros)
2373 SignedZeros = false;
2374 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002375 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002376 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002377 options::OPT_funsafe_math_optimizations,
2378 options::OPT_fno_unsafe_math_optimizations,
2379 options::OPT_ftrapping_math,
2380 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002381 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2382 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002383 A->getOption().getID() != options::OPT_ftrapping_math)
2384 TrappingMath = false;
2385 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2386 !TrappingMath)
2387 CmdArgs.push_back("-menable-unsafe-fp-math");
2388
Lang Hamesaa53b932012-07-06 00:59:19 +00002389
2390 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002391 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002392 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002393 options::OPT_ffp_contract)) {
2394 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002395 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002396 if (Val == "fast" || Val == "on" || Val == "off") {
2397 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2398 } else {
2399 D.Diag(diag::err_drv_unsupported_option_argument)
2400 << A->getOption().getName() << Val;
2401 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002402 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2403 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002404 // If fast-math is set then set the fp-contract mode to fast.
2405 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2406 }
2407 }
2408
Bob Wilson6a039162012-07-19 03:52:53 +00002409 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2410 // and if we find them, tell the frontend to provide the appropriate
2411 // preprocessor macros. This is distinct from enabling any optimizations as
2412 // these options induce language changes which must survive serialization
2413 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002414 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2415 options::OPT_fno_fast_math))
2416 if (!A->getOption().matches(options::OPT_fno_fast_math))
2417 CmdArgs.push_back("-ffast-math");
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002418 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2419 if (A->getOption().matches(options::OPT_ffinite_math_only))
2420 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002421
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002422 // Decide whether to use verbose asm. Verbose assembly is the default on
2423 // toolchains which have the integrated assembler on by default.
2424 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2425 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002426 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002427 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002428 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002429
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002430 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2431 CmdArgs.push_back("-mdebug-pass");
2432 CmdArgs.push_back("Structure");
2433 }
2434 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2435 CmdArgs.push_back("-mdebug-pass");
2436 CmdArgs.push_back("Arguments");
2437 }
2438
John McCall8517abc2010-02-19 02:45:38 +00002439 // Enable -mconstructor-aliases except on darwin, where we have to
2440 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002441 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002442 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002443
John McCall7ef5cb32011-03-18 02:56:14 +00002444 // Darwin's kernel doesn't support guard variables; just die if we
2445 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002446 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002447 CmdArgs.push_back("-fforbid-guard-variables");
2448
Douglas Gregordbe39272011-02-01 15:15:22 +00002449 if (Args.hasArg(options::OPT_mms_bitfields)) {
2450 CmdArgs.push_back("-mms-bitfields");
2451 }
John McCall8517abc2010-02-19 02:45:38 +00002452
Daniel Dunbar306945d2009-09-16 06:17:29 +00002453 // This is a coarse approximation of what llvm-gcc actually does, both
2454 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2455 // complicated ways.
2456 bool AsynchronousUnwindTables =
2457 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2458 options::OPT_fno_asynchronous_unwind_tables,
2459 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002460 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002461 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2462 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002463 CmdArgs.push_back("-munwind-tables");
2464
Chandler Carruth05fb5852012-11-21 23:40:23 +00002465 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002466
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002467 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2468 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002469 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002470 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002471
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002472 // FIXME: Handle -mtune=.
2473 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002474
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002475 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002476 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002477 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002478 }
2479
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002480 // Add the target cpu
2481 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2482 llvm::Triple ETriple(ETripleStr);
2483 std::string CPU = getCPUName(Args, ETriple);
2484 if (!CPU.empty()) {
2485 CmdArgs.push_back("-target-cpu");
2486 CmdArgs.push_back(Args.MakeArgString(CPU));
2487 }
2488
Rafael Espindolaeb265472013-08-21 21:59:03 +00002489 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2490 CmdArgs.push_back("-mfpmath");
2491 CmdArgs.push_back(A->getValue());
2492 }
2493
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002494 // Add the target features
2495 getTargetFeatures(D, ETriple, Args, CmdArgs);
2496
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002497 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002498 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002499 default:
2500 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002501
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002502 case llvm::Triple::arm:
2503 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002504 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002505 break;
2506
Eric Christopher0b26a612010-03-02 02:41:08 +00002507 case llvm::Triple::mips:
2508 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002509 case llvm::Triple::mips64:
2510 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002511 AddMIPSTargetArgs(Args, CmdArgs);
2512 break;
2513
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002514 case llvm::Triple::sparc:
2515 AddSparcTargetArgs(Args, CmdArgs);
2516 break;
2517
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002518 case llvm::Triple::x86:
2519 case llvm::Triple::x86_64:
2520 AddX86TargetArgs(Args, CmdArgs);
2521 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002522
2523 case llvm::Triple::hexagon:
2524 AddHexagonTargetArgs(Args, CmdArgs);
2525 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002526 }
2527
Hans Wennborg75958c42013-08-08 00:17:41 +00002528 // Add clang-cl arguments.
2529 if (getToolChain().getDriver().IsCLMode())
2530 AddClangCLArgs(Args, CmdArgs);
2531
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002532 // Pass the linker version in use.
2533 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2534 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002535 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002536 }
2537
Eric Christopherb7d97e92013-04-03 01:58:53 +00002538 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002539 CmdArgs.push_back("-momit-leaf-frame-pointer");
2540
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002541 // Explicitly error on some things we know we don't support and can't just
2542 // ignore.
2543 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002544 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2545 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002546 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002547 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002548 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002549 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2550 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002551 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002552 << Unsupported->getOption().getName();
2553 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002554 }
2555
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002556 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002557 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002558 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002559 CmdArgs.push_back("-header-include-file");
2560 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2561 D.CCPrintHeadersFilename : "-");
2562 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002563 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002564 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002565
Chad Rosierbe10f982011-08-02 17:58:04 +00002566 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002567 CmdArgs.push_back("-diagnostic-log-file");
2568 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2569 D.CCLogDiagnosticsFilename : "-");
2570 }
2571
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002572 // Use the last option from "-g" group. "-gline-tables-only"
2573 // is preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002574 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002575 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002576 if (A->getOption().matches(options::OPT_gline_tables_only))
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002577 CmdArgs.push_back("-gline-tables-only");
Manman Ren9691f7f2013-06-19 01:46:49 +00002578 else if (A->getOption().matches(options::OPT_gdwarf_2))
2579 CmdArgs.push_back("-gdwarf-2");
2580 else if (A->getOption().matches(options::OPT_gdwarf_3))
2581 CmdArgs.push_back("-gdwarf-3");
2582 else if (A->getOption().matches(options::OPT_gdwarf_4))
2583 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002584 else if (!A->getOption().matches(options::OPT_g0) &&
Manman Ren38db0922013-07-02 23:15:25 +00002585 !A->getOption().matches(options::OPT_ggdb0)) {
2586 // Default is dwarf-2 for darwin.
2587 if (getToolChain().getTriple().isOSDarwin())
2588 CmdArgs.push_back("-gdwarf-2");
2589 else
2590 CmdArgs.push_back("-g");
2591 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002592 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002593
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002594 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2595 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002596 if (Args.hasArg(options::OPT_gcolumn_info))
2597 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002598
Eric Christopher138c32b2013-09-13 22:37:55 +00002599 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002600 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2601 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00002602 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002603 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00002604 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002605 CmdArgs.push_back("-g");
2606 CmdArgs.push_back("-backend-option");
2607 CmdArgs.push_back("-split-dwarf=Enable");
2608 }
2609
Eric Christopher138c32b2013-09-13 22:37:55 +00002610 // -ggnu-pubnames turns on gnu style pubnames in the backend.
2611 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2612 CmdArgs.push_back("-backend-option");
2613 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2614 }
Eric Christophereec89c22013-06-18 00:03:50 +00002615
2616 Args.AddAllArgs(CmdArgs, options::OPT_fdebug_types_section);
2617
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002618 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2619 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2620
Chris Lattner3c77a352010-06-22 00:03:40 +00002621 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2622
Nick Lewycky207bce32011-04-21 23:44:07 +00002623 if (Args.hasArg(options::OPT_ftest_coverage) ||
2624 Args.hasArg(options::OPT_coverage))
2625 CmdArgs.push_back("-femit-coverage-notes");
2626 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2627 Args.hasArg(options::OPT_coverage))
2628 CmdArgs.push_back("-femit-coverage-data");
2629
Nick Lewycky480cb992011-05-04 20:46:58 +00002630 if (C.getArgs().hasArg(options::OPT_c) ||
2631 C.getArgs().hasArg(options::OPT_S)) {
2632 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002633 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00002634 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00002635 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002636 SmallString<128> Pwd;
2637 if (!llvm::sys::fs::current_path(Pwd)) {
2638 llvm::sys::path::append(Pwd, CoverageFilename.str());
2639 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00002640 }
2641 }
Eric Christophere30f61c2013-02-22 00:24:40 +00002642 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002643 }
2644 }
2645
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002646 // Pass options for controlling the default header search paths.
2647 if (Args.hasArg(options::OPT_nostdinc)) {
2648 CmdArgs.push_back("-nostdsysteminc");
2649 CmdArgs.push_back("-nobuiltininc");
2650 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002651 if (Args.hasArg(options::OPT_nostdlibinc))
2652 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002653 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2654 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2655 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002656
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002657 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002658 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002659 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002660
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002661 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2662
Ted Kremenekf7639e12012-03-06 20:06:33 +00002663 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00002664 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002665 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002666 options::OPT_ccc_arcmt_modify,
2667 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002668 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002669 switch (A->getOption().getID()) {
2670 default:
2671 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002672 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002673 CmdArgs.push_back("-arcmt-check");
2674 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002675 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002676 CmdArgs.push_back("-arcmt-modify");
2677 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002678 case options::OPT_ccc_arcmt_migrate:
2679 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002680 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002681 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002682
2683 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2684 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002685 break;
John McCalld70fb982011-06-15 23:25:17 +00002686 }
2687 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00002688 } else {
2689 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2690 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2691 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00002692 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002693
Ted Kremenekf7639e12012-03-06 20:06:33 +00002694 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2695 if (ARCMTEnabled) {
2696 D.Diag(diag::err_drv_argument_not_allowed_with)
2697 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2698 }
2699 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002700 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002701
2702 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002703 options::OPT_objcmt_migrate_subscripting,
2704 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002705 // None specified, means enable them all.
2706 CmdArgs.push_back("-objcmt-migrate-literals");
2707 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002708 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002709 } else {
2710 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2711 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002712 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00002713 }
2714 }
2715
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002716 // Add preprocessing options like -I, -D, etc. if we are using the
2717 // preprocessor.
2718 //
2719 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002720 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00002721 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002722
Rafael Espindolaa7431922011-07-21 23:40:37 +00002723 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2724 // that "The compiler can only warn and ignore the option if not recognized".
2725 // When building with ccache, it will pass -D options to clang even on
2726 // preprocessed inputs and configure concludes that -fPIC is not supported.
2727 Args.ClaimAllArgs(options::OPT_D);
2728
Rafael Espindolaad70d962013-08-27 16:58:15 +00002729 // Manually translate -O4 to -O3; let clang reject others.
2730 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2731 if (A->getOption().matches(options::OPT_O4)) {
2732 CmdArgs.push_back("-O3");
2733 D.Diag(diag::warn_O4_is_O3);
2734 } else {
2735 A->render(Args, CmdArgs);
2736 }
2737 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002738
Chad Rosier86b82082012-12-12 20:06:31 +00002739 // Don't warn about unused -flto. This can happen when we're preprocessing or
2740 // precompiling.
2741 Args.ClaimAllArgs(options::OPT_flto);
2742
Daniel Dunbar945577c2009-10-29 02:24:45 +00002743 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002744 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2745 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002746 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002747 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002748
2749 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00002750 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002751 //
2752 // If a std is supplied, only add -trigraphs if it follows the
2753 // option.
2754 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2755 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002756 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002757 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002758 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002759 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002760 else
2761 Std->render(Args, CmdArgs);
2762
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002763 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2764 options::OPT_trigraphs))
2765 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002766 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002767 } else {
2768 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002769 //
2770 // FIXME: Clang doesn't correctly handle -std= when the input language
2771 // doesn't match. For the time being just ignore this for C++ inputs;
2772 // eventually we want to do all the standard defaulting here instead of
2773 // splitting it between the driver and clang -cc1.
2774 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002775 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2776 "-std=", /*Joined=*/true);
2777 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2778 CmdArgs.push_back("-std=c++11");
2779
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002780 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002781 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002782
Richard Smith282b4492013-09-04 22:50:31 +00002783 // GCC's behavior for -Wwrite-strings is a bit strange:
2784 // * In C, this "warning flag" changes the types of string literals from
2785 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
2786 // for the discarded qualifier.
2787 // * In C++, this is just a normal warning flag.
2788 //
2789 // Implementing this warning correctly in C is hard, so we follow GCC's
2790 // behavior for now. FIXME: Directly diagnose uses of a string literal as
2791 // a non-const char* in C, rather than using this crude hack.
2792 if (!types::isCXX(InputType)) {
2793 // FIXME: This should behave just like a warning flag, and thus should also
2794 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
2795 Arg *WriteStrings =
2796 Args.getLastArg(options::OPT_Wwrite_strings,
2797 options::OPT_Wno_write_strings, options::OPT_w);
2798 if (WriteStrings &&
2799 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
2800 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00002801 }
2802
Chandler Carruth61fbf622011-04-23 09:27:53 +00002803 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002804 // during C++ compilation, which it is by default. GCC keeps this define even
2805 // in the presence of '-w', match this behavior bug-for-bug.
2806 if (types::isCXX(InputType) &&
2807 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2808 true)) {
2809 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002810 }
2811
Chandler Carruthe0391482010-05-22 02:21:53 +00002812 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2813 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2814 if (Asm->getOption().matches(options::OPT_fasm))
2815 CmdArgs.push_back("-fgnu-keywords");
2816 else
2817 CmdArgs.push_back("-fno-gnu-keywords");
2818 }
2819
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002820 if (ShouldDisableCFI(Args, getToolChain()))
2821 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002822
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002823 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2824 CmdArgs.push_back("-fno-dwarf-directory-asm");
2825
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002826 if (ShouldDisableAutolink(Args, getToolChain()))
2827 CmdArgs.push_back("-fno-autolink");
2828
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002829 // Add in -fdebug-compilation-dir if necessary.
2830 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00002831
Richard Smith9a568822011-11-21 19:36:32 +00002832 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2833 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002834 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002835 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002836 }
2837
Richard Smith9a568822011-11-21 19:36:32 +00002838 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2839 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002840 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00002841 }
2842
Richard Smitha3d3bd22013-05-08 02:12:03 +00002843 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
2844 CmdArgs.push_back("-fconstexpr-steps");
2845 CmdArgs.push_back(A->getValue());
2846 }
2847
Richard Smithb3a14522013-02-22 01:59:51 +00002848 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2849 CmdArgs.push_back("-fbracket-depth");
2850 CmdArgs.push_back(A->getValue());
2851 }
2852
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002853 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2854 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002855 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002856 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002857 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2858 } else
2859 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002860 }
2861
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002862
Michael J. Spencer929fccd2012-10-22 22:13:48 +00002863 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002864 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002865
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002866 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2867 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00002868 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002869 }
David Chisnall5778fce2009-08-31 16:41:57 +00002870
Chris Lattnere23003d2010-01-09 21:54:33 +00002871 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2872 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00002873 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00002874 }
2875
Chris Lattnerb35583d2010-04-07 20:49:23 +00002876 CmdArgs.push_back("-ferror-limit");
2877 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00002878 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00002879 else
2880 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002881
Chandler Carrutha77a7272010-05-06 04:55:18 +00002882 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2883 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002884 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002885 }
2886
2887 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2888 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002889 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002890 }
2891
Richard Smithf6f003a2011-12-16 19:06:07 +00002892 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2893 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002894 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00002895 }
2896
Daniel Dunbar2c978472009-11-04 06:24:47 +00002897 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002898 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002899 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002900 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00002901 } else {
2902 // If -fmessage-length=N was not specified, determine whether this is a
2903 // terminal and, if so, implicitly define -fmessage-length appropriately.
2904 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002905 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002906 }
2907
John McCallb4a99d32013-02-19 01:57:35 +00002908 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2909 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2910 options::OPT_fvisibility_ms_compat)) {
2911 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2912 CmdArgs.push_back("-fvisibility");
2913 CmdArgs.push_back(A->getValue());
2914 } else {
2915 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2916 CmdArgs.push_back("-fvisibility");
2917 CmdArgs.push_back("hidden");
2918 CmdArgs.push_back("-ftype-visibility");
2919 CmdArgs.push_back("default");
2920 }
Daniel Dunbare357d562009-12-03 18:42:11 +00002921 }
2922
Douglas Gregor08329632010-06-15 17:05:35 +00002923 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002924
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002925 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2926
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002927 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002928 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2929 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002930 CmdArgs.push_back("-ffreestanding");
2931
Daniel Dunbare357d562009-12-03 18:42:11 +00002932 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002933 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002934 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002935 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002936 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002937 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00002938 // AltiVec language extensions aren't relevant for assembling.
2939 if (!isa<PreprocessJobAction>(JA) ||
2940 Output.getType() != types::TY_PP_Asm)
2941 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002942 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2943 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002944
Peter Collingbourne32701642013-11-01 18:16:25 +00002945 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
2946 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00002947
Will Dietz3676d562012-12-30 20:53:28 +00002948 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2949 options::OPT_fno_sanitize_recover,
2950 true))
2951 CmdArgs.push_back("-fno-sanitize-recover");
2952
Chad Rosierae229d52013-01-29 23:31:22 +00002953 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2954 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2955 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2956 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2957
Eric Christopher459d2712013-02-19 06:16:53 +00002958 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00002959 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002960 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00002961 getToolChain().getArch() == llvm::Triple::ppc64 ||
2962 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00002963 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00002964 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00002965
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002966 if (getToolChain().SupportsProfiling())
2967 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002968
2969 // -flax-vector-conversions is default.
2970 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2971 options::OPT_fno_lax_vector_conversions))
2972 CmdArgs.push_back("-fno-lax-vector-conversions");
2973
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002974 if (Args.getLastArg(options::OPT_fapple_kext))
2975 CmdArgs.push_back("-fapple-kext");
2976
David Blaikie690f21e2012-06-14 18:55:27 +00002977 if (Args.hasFlag(options::OPT_frewrite_includes,
2978 options::OPT_fno_rewrite_includes, false))
2979 CmdArgs.push_back("-frewrite-includes");
2980
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002981 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002982 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002983 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002984 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2985 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002986
2987 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2988 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00002989 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00002990 }
2991
Bob Wilson14adb362012-02-03 06:27:22 +00002992 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002993
Chandler Carruth6e501032011-03-27 00:04:55 +00002994 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2995 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2996 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2997 options::OPT_fno_wrapv)) {
2998 if (A->getOption().matches(options::OPT_fwrapv))
2999 CmdArgs.push_back("-fwrapv");
3000 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3001 options::OPT_fno_strict_overflow)) {
3002 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3003 CmdArgs.push_back("-fwrapv");
3004 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003005 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003006 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3007 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003008
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003009 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3010
Mahesha S6a682be42012-10-27 07:47:56 +00003011
Daniel Dunbar4930e332009-11-17 08:07:36 +00003012 // -stack-protector=0 is default.
3013 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003014 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3015 options::OPT_fstack_protector_all,
3016 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003017 if (A->getOption().matches(options::OPT_fstack_protector))
3018 StackProtectorLevel = 1;
3019 else if (A->getOption().matches(options::OPT_fstack_protector_all))
3020 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00003021 } else {
3022 StackProtectorLevel =
3023 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3024 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003025 if (StackProtectorLevel) {
3026 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003027 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003028 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003029
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003030 // --param ssp-buffer-size=
3031 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3032 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003033 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003034 if (Str.startswith("ssp-buffer-size=")) {
3035 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003036 CmdArgs.push_back("-stack-protector-buffer-size");
3037 // FIXME: Verify the argument is a valid integer.
3038 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003039 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003040 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003041 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003042 }
3043
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003044 // Translate -mstackrealign
3045 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3046 false)) {
3047 CmdArgs.push_back("-backend-option");
3048 CmdArgs.push_back("-force-align-stack");
3049 }
3050 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3051 false)) {
3052 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3053 }
3054
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003055 if (Args.hasArg(options::OPT_mstack_alignment)) {
3056 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3057 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003058 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00003059 // -mkernel implies -mstrict-align; don't add the redundant option.
Renato Golina146a482013-08-24 14:44:41 +00003060 if (!KernelOrKext) {
Renato Golin8d5f3142013-08-28 23:56:07 +00003061 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3062 options::OPT_munaligned_access)) {
3063 if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3064 CmdArgs.push_back("-backend-option");
3065 CmdArgs.push_back("-arm-strict-align");
3066 } else {
3067 CmdArgs.push_back("-backend-option");
3068 CmdArgs.push_back("-arm-no-strict-align");
3069 }
Renato Golina146a482013-08-24 14:44:41 +00003070 }
Chad Rosier60027022012-11-09 17:29:19 +00003071 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003072
Daniel Dunbard18049a2009-04-07 21:16:11 +00003073 // Forward -f options with positive and negative forms; we translate
3074 // these by hand.
3075
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003076 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003077 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003078 CmdArgs.push_back("-fapple-kext");
3079 if (!Args.hasArg(options::OPT_fbuiltin))
3080 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003081 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003082 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003083 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003084 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003085 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003086
Nuno Lopes13c88c72009-12-16 16:59:22 +00003087 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3088 options::OPT_fno_assume_sane_operator_new))
3089 CmdArgs.push_back("-fno-assume-sane-operator-new");
3090
Daniel Dunbar4930e332009-11-17 08:07:36 +00003091 // -fblocks=0 is default.
3092 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003093 getToolChain().IsBlocksDefault()) ||
3094 (Args.hasArg(options::OPT_fgnu_runtime) &&
3095 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3096 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003097 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003098
3099 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3100 !getToolChain().hasBlocksRuntime())
3101 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003102 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003103
Douglas Gregor226173a2012-01-18 15:19:58 +00003104 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3105 // users must also pass -fcxx-modules. The latter flag will disappear once the
3106 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003107 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003108 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3109 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3110 options::OPT_fno_cxx_modules,
3111 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003112 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003113 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003114 HaveModules = true;
3115 }
3116 }
3117
Daniel Jasper07e6c402013-08-05 20:26:17 +00003118 // -fmodule-maps enables module map processing (off by default) for header
3119 // checking. It is implied by -fmodules.
3120 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3121 false)) {
3122 CmdArgs.push_back("-fmodule-maps");
3123 }
3124
Daniel Jasperac42b752013-10-21 06:34:34 +00003125 // -fmodules-decluse checks that modules used are declared so (off by
3126 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003127 if (Args.hasFlag(options::OPT_fmodules_decluse,
3128 options::OPT_fno_modules_decluse,
3129 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003130 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003131 }
3132
Daniel Jasperac42b752013-10-21 06:34:34 +00003133 // -fmodule-name specifies the module that is currently being built (or
3134 // used for header checking by -fmodule-maps).
3135 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name)) {
3136 A->claim();
3137 A->render(Args, CmdArgs);
3138 }
3139
3140 // -fmodule-map-file can be used to specify a file containing module
3141 // definitions.
3142 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file)) {
3143 A->claim();
3144 A->render(Args, CmdArgs);
3145 }
3146
Douglas Gregor35b04d62013-02-07 19:01:24 +00003147 // If a module path was provided, pass it along. Otherwise, use a temporary
3148 // directory.
3149 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3150 A->claim();
3151 if (HaveModules) {
3152 A->render(Args, CmdArgs);
3153 }
3154 } else if (HaveModules) {
3155 SmallString<128> DefaultModuleCache;
3156 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3157 DefaultModuleCache);
Douglas Gregor23c7d672013-03-21 21:48:48 +00003158 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3159 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor4bedb492013-02-07 22:59:12 +00003160 const char Arg[] = "-fmodules-cache-path=";
3161 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3162 Arg, Arg + strlen(Arg));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003163 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3164 }
3165
3166 // Pass through all -fmodules-ignore-macro arguments.
3167 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003168 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3169 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003170
John McCalldfea9982010-04-09 19:12:06 +00003171 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003172 if (Args.hasFlag(options::OPT_fno_access_control,
3173 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003174 false))
John McCall3155f572010-04-09 19:03:51 +00003175 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003176
Anders Carlssond470fef2010-11-21 00:09:52 +00003177 // -felide-constructors is the default.
3178 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3179 options::OPT_felide_constructors,
3180 false))
3181 CmdArgs.push_back("-fno-elide-constructors");
3182
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003183 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003184 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00003185 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00003186 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00003187
Richard Smith52be6192012-11-05 22:04:41 +00003188 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003189 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00003190 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00003191 Args.getLastArg(options::OPT_mkernel,
3192 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00003193 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00003194 D.Diag(diag::err_drv_argument_not_allowed_with)
3195 << "-fsanitize=vptr" << NoRttiArg;
3196 }
3197 }
3198
Tony Linthicum76329bf2011-12-12 21:14:55 +00003199 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003200 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003201 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003202 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00003203 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003204 CmdArgs.push_back("-fshort-enums");
3205
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003206 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003207 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003208 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00003209 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00003210
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003211 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003212 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003213 options::OPT_fno_threadsafe_statics))
3214 CmdArgs.push_back("-fno-threadsafe-statics");
3215
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003216 // -fuse-cxa-atexit is default.
Rafael Espindolaa6775b62013-11-04 17:13:51 +00003217 if (!Args.hasFlag(
3218 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
3219 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
3220 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
3221 getToolChain().getArch() != llvm::Triple::hexagon) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00003222 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003223 CmdArgs.push_back("-fno-use-cxa-atexit");
3224
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003225 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003226 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003227 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3228 CmdArgs.push_back("-fms-extensions");
3229
Francois Pichet1b4f1632011-09-17 04:32:15 +00003230 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003231 if (Args.hasFlag(options::OPT_fms_compatibility,
3232 options::OPT_fno_ms_compatibility,
3233 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3234 Args.hasFlag(options::OPT_fms_extensions,
3235 options::OPT_fno_ms_extensions,
3236 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003237 CmdArgs.push_back("-fms-compatibility");
3238
Reid Klecknerc106fda2013-09-18 00:33:59 +00003239 // -fmsc-version=1700 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003240 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3241 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3242 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003243 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003244 if (msc_ver.empty())
Reid Klecknerc106fda2013-09-18 00:33:59 +00003245 CmdArgs.push_back("-fmsc-version=1700");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003246 else
3247 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3248 }
3249
3250
Eric Christopher5ecce122013-02-18 00:38:31 +00003251 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00003252 if (Args.hasFlag(options::OPT_fborland_extensions,
3253 options::OPT_fno_borland_extensions, false))
3254 CmdArgs.push_back("-fborland-extensions");
3255
Francois Pichet02744872011-09-01 16:38:08 +00003256 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3257 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003258 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3259 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00003260 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003261 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003262
Chandler Carruthe03aa552010-04-17 20:17:31 +00003263 // -fgnu-keywords default varies depending on language; only pass if
3264 // specified.
3265 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003266 options::OPT_fno_gnu_keywords))
3267 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00003268
Rafael Espindola922a6242011-06-02 17:30:53 +00003269 if (Args.hasFlag(options::OPT_fgnu89_inline,
3270 options::OPT_fno_gnu89_inline,
3271 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00003272 CmdArgs.push_back("-fgnu89-inline");
3273
Chad Rosier9c76d242012-03-15 22:31:42 +00003274 if (Args.hasArg(options::OPT_fno_inline))
3275 CmdArgs.push_back("-fno-inline");
3276
Chad Rosier64d6be92012-03-06 21:17:19 +00003277 if (Args.hasArg(options::OPT_fno_inline_functions))
3278 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00003279
John McCall5fb5df92012-06-20 06:18:46 +00003280 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00003281
John McCall5fb5df92012-06-20 06:18:46 +00003282 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahaniandaf48312013-10-15 17:16:30 +00003283 // legacy is the default. Next runtime is always legacy dispatch and
3284 // -fno-objc-legacy-dispatch gets ignored silently.
3285 if (objcRuntime.isNonFragile() && !objcRuntime.isNeXTFamily()) {
David Chisnall3154e682011-09-30 13:32:35 +00003286 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3287 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00003288 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003289 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00003290 if (getToolChain().UseObjCMixedDispatch())
3291 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3292 else
3293 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3294 }
3295 }
3296
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00003297 // -fencode-extended-block-signature=1 is default.
3298 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3299 CmdArgs.push_back("-fencode-extended-block-signature");
3300 }
3301
John McCall24fc0de2011-07-06 00:26:06 +00003302 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3303 // NOTE: This logic is duplicated in ToolChains.cpp.
3304 bool ARC = isObjCAutoRefCount(Args);
3305 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00003306 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00003307
John McCall24fc0de2011-07-06 00:26:06 +00003308 CmdArgs.push_back("-fobjc-arc");
3309
Chandler Carruth491db322011-11-04 07:34:47 +00003310 // FIXME: It seems like this entire block, and several around it should be
3311 // wrapped in isObjC, but for now we just use it here as this is where it
3312 // was being used previously.
3313 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3314 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3315 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3316 else
3317 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3318 }
3319
John McCall24fc0de2011-07-06 00:26:06 +00003320 // Allow the user to enable full exceptions code emission.
3321 // We define off for Objective-CC, on for Objective-C++.
3322 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3323 options::OPT_fno_objc_arc_exceptions,
3324 /*default*/ types::isCXX(InputType)))
3325 CmdArgs.push_back("-fobjc-arc-exceptions");
3326 }
3327
3328 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3329 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00003330 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00003331 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003332
John McCall24fc0de2011-07-06 00:26:06 +00003333 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3334 // takes precedence.
3335 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3336 if (!GCArg)
3337 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3338 if (GCArg) {
3339 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003340 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00003341 << GCArg->getAsString(Args);
3342 } else if (getToolChain().SupportsObjCGC()) {
3343 GCArg->render(Args, CmdArgs);
3344 } else {
3345 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003346 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00003347 << GCArg->getAsString(Args);
3348 }
3349 }
3350
John McCallb5f652e2011-06-22 00:53:57 +00003351 // Add exception args.
3352 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00003353 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00003354
3355 if (getToolChain().UseSjLjExceptions())
3356 CmdArgs.push_back("-fsjlj-exceptions");
3357
3358 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00003359 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3360 options::OPT_fno_assume_sane_operator_new))
3361 CmdArgs.push_back("-fno-assume-sane-operator-new");
3362
Daniel Dunbar34d7a992010-04-27 15:34:57 +00003363 // -fconstant-cfstrings is default, and may be subject to argument translation
3364 // on Darwin.
3365 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3366 options::OPT_fno_constant_cfstrings) ||
3367 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3368 options::OPT_mno_constant_cfstrings))
3369 CmdArgs.push_back("-fno-constant-cfstrings");
3370
John Thompsoned4e2952009-11-05 20:14:16 +00003371 // -fshort-wchar default varies depending on platform; only
3372 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00003373 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3374 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00003375
Hans Wennborg28c96312013-07-31 23:39:13 +00003376 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003377 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003378 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003379 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003380 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003381
Daniel Dunbar096ed292011-10-05 21:04:55 +00003382 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3383 // -fno-pack-struct doesn't apply to -fpack-struct=.
3384 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00003385 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00003386 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00003387 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00003388 } else if (Args.hasFlag(options::OPT_fpack_struct,
3389 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00003390 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00003391 }
3392
Robert Lytton0e076492013-08-13 09:43:10 +00003393 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003394 if (!Args.hasArg(options::OPT_fcommon))
3395 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00003396 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003397 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00003398
Daniel Dunbard18049a2009-04-07 21:16:11 +00003399 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003400 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003401 CmdArgs.push_back("-fno-common");
3402
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003403 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00003404 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00003405 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003406 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003407 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003408 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3409
Daniel Dunbar6358d682010-10-15 22:30:42 +00003410 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3411 if (!Args.hasFlag(options::OPT_ffor_scope,
3412 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003413 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00003414 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3415
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00003416 // -fcaret-diagnostics is default.
3417 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3418 options::OPT_fno_caret_diagnostics, true))
3419 CmdArgs.push_back("-fno-caret-diagnostics");
3420
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003421 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00003422 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003423 options::OPT_fno_diagnostics_fixit_info))
3424 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003425
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003426 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00003427 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003428 options::OPT_fno_diagnostics_show_option))
3429 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003430
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003431 if (const Arg *A =
3432 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3433 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00003434 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003435 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003436
Douglas Gregor643c9222011-05-21 17:07:29 +00003437 if (const Arg *A =
3438 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3439 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003440 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003441 }
3442
Chandler Carruthb6766f02011-03-27 01:50:55 +00003443 if (Arg *A = Args.getLastArg(
3444 options::OPT_fdiagnostics_show_note_include_stack,
3445 options::OPT_fno_diagnostics_show_note_include_stack)) {
3446 if (A->getOption().matches(
3447 options::OPT_fdiagnostics_show_note_include_stack))
3448 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3449 else
3450 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3451 }
3452
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003453 // Color diagnostics are the default, unless the terminal doesn't support
3454 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00003455 // Support both clang's -f[no-]color-diagnostics and gcc's
3456 // -f[no-]diagnostics-colors[=never|always|auto].
3457 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3458 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3459 it != ie; ++it) {
3460 const Option &O = (*it)->getOption();
3461 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3462 !O.matches(options::OPT_fdiagnostics_color) &&
3463 !O.matches(options::OPT_fno_color_diagnostics) &&
3464 !O.matches(options::OPT_fno_diagnostics_color) &&
3465 !O.matches(options::OPT_fdiagnostics_color_EQ))
3466 continue;
3467
3468 (*it)->claim();
3469 if (O.matches(options::OPT_fcolor_diagnostics) ||
3470 O.matches(options::OPT_fdiagnostics_color)) {
3471 ShowColors = Colors_On;
3472 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3473 O.matches(options::OPT_fno_diagnostics_color)) {
3474 ShowColors = Colors_Off;
3475 } else {
3476 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3477 StringRef value((*it)->getValue());
3478 if (value == "always")
3479 ShowColors = Colors_On;
3480 else if (value == "never")
3481 ShowColors = Colors_Off;
3482 else if (value == "auto")
3483 ShowColors = Colors_Auto;
3484 else
3485 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3486 << ("-fdiagnostics-color=" + value).str();
3487 }
3488 }
3489 if (ShowColors == Colors_On ||
3490 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003491 CmdArgs.push_back("-fcolor-diagnostics");
3492
Nico Rieck7857d462013-09-11 00:38:02 +00003493 if (Args.hasArg(options::OPT_fansi_escape_codes))
3494 CmdArgs.push_back("-fansi-escape-codes");
3495
Daniel Dunbardb097022009-06-08 21:13:54 +00003496 if (!Args.hasFlag(options::OPT_fshow_source_location,
3497 options::OPT_fno_show_source_location))
3498 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003499
Douglas Gregor643c9222011-05-21 17:07:29 +00003500 if (!Args.hasFlag(options::OPT_fshow_column,
3501 options::OPT_fno_show_column,
3502 true))
3503 CmdArgs.push_back("-fno-show-column");
3504
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00003505 if (!Args.hasFlag(options::OPT_fspell_checking,
3506 options::OPT_fno_spell_checking))
3507 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003508
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003509
Chad Rosierc8e56e82012-12-05 21:08:21 +00003510 // -fno-asm-blocks is default.
3511 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3512 false))
3513 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003514
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003515 // Enable vectorization per default according to the optimization level
3516 // selected. For optimization levels that want vectorization we use the alias
3517 // option to simplify the hasFlag logic.
3518 bool EnableVec = shouldEnableVectorizerAtOLevel(Args);
3519 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00003520 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00003521 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00003522 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003523 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003524
Rafael Espindolaf818ef42013-08-01 23:56:42 +00003525 // -fslp-vectorize is default.
3526 if (Args.hasFlag(options::OPT_fslp_vectorize,
3527 options::OPT_fno_slp_vectorize, true))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00003528 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00003529
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003530 // -fno-slp-vectorize-aggressive is default.
3531 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003532 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003533 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003534
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00003535 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3536 A->render(Args, CmdArgs);
3537
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003538 // -fdollars-in-identifiers default varies depending on platform and
3539 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00003540 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003541 options::OPT_fno_dollars_in_identifiers)) {
3542 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003543 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003544 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003545 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003546 }
3547
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003548 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3549 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00003550 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003551 options::OPT_fno_unit_at_a_time)) {
3552 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003553 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003554 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003555
Eli Friedman055c9702011-11-02 01:53:16 +00003556 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3557 options::OPT_fno_apple_pragma_pack, false))
3558 CmdArgs.push_back("-fapple-pragma-pack");
3559
Eli Benderskyc95cfe82013-07-24 18:20:14 +00003560 // le32-specific flags:
3561 // -fno-math-builtin: clang should not convert math builtins to intrinsics
3562 // by default.
3563 if (getToolChain().getArch() == llvm::Triple::le32) {
3564 CmdArgs.push_back("-fno-math-builtin");
3565 }
3566
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003567 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003568 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003569 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003570#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003571 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003572 (getToolChain().getArch() == llvm::Triple::arm ||
3573 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003574 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3575 CmdArgs.push_back("-fno-builtin-strcat");
3576 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3577 CmdArgs.push_back("-fno-builtin-strcpy");
3578 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003579#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003580
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003581 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003582 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003583 options::OPT_traditional_cpp)) {
3584 if (isa<PreprocessJobAction>(JA))
3585 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003586 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003587 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003588 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003589
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003590 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003591 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003592
3593 // Handle serialized diagnostics.
3594 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3595 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003596 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003597 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003598
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003599 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3600 CmdArgs.push_back("-fretain-comments-from-system-headers");
3601
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003602 // Forward -fcomment-block-commands to -cc1.
3603 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00003604 // Forward -fparse-all-comments to -cc1.
3605 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003606
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003607 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3608 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003609 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003610 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3611 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003612 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003613
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003614 // We translate this by hand to the -cc1 argument, since nightly test uses
3615 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003616 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003617 CmdArgs.push_back("-disable-llvm-optzns");
3618 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003619 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003620 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003621
Daniel Dunbard67a3222009-03-30 06:36:42 +00003622 if (Output.getType() == types::TY_Dependencies) {
3623 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003624 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003625 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003626 CmdArgs.push_back(Output.getFilename());
3627 } else {
3628 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003629 }
3630
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003631 for (InputInfoList::const_iterator
3632 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3633 const InputInfo &II = *it;
3634 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00003635 if (Args.hasArg(options::OPT_rewrite_objc))
3636 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3637 else
3638 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00003639 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003640 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003641 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003642 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003643 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003644
Chris Lattnere9d7d782009-11-03 19:50:27 +00003645 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3646
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003647 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003648
3649 // Optionally embed the -cc1 level arguments into the debug info, for build
3650 // analysis.
3651 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003652 ArgStringList OriginalArgs;
3653 for (ArgList::const_iterator it = Args.begin(),
3654 ie = Args.end(); it != ie; ++it)
3655 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003656
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003657 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003658 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003659 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003660 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003661 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003662 }
3663 CmdArgs.push_back("-dwarf-debug-flags");
3664 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3665 }
3666
Eric Christopherd3804002013-02-22 20:12:52 +00003667 // Add the split debug info name to the command lines here so we
3668 // can propagate it to the backend.
3669 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003670 getToolChain().getTriple().isOSLinux() &&
Eric Christopherf1545832013-02-22 23:50:16 +00003671 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00003672 const char *SplitDwarfOut;
3673 if (SplitDwarf) {
3674 CmdArgs.push_back("-split-dwarf-file");
3675 SplitDwarfOut = SplitDebugName(Args, Inputs);
3676 CmdArgs.push_back(SplitDwarfOut);
3677 }
3678
3679 // Finally add the compile command to the compilation.
Hans Wennborg87cfa712013-09-19 20:32:16 +00003680 if (Args.hasArg(options::OPT__SLASH_fallback)) {
3681 tools::visualstudio::Compile CL(getToolChain());
3682 Command *CLCommand = CL.GetCommand(C, JA, Output, Inputs, Args,
3683 LinkingOutput);
3684 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
3685 } else {
3686 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3687 }
3688
Daniel Dunbar17731772009-03-23 19:03:36 +00003689
Eric Christopherf1545832013-02-22 23:50:16 +00003690 // Handle the debug info splitting at object creation time if we're
3691 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00003692 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00003693 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00003694 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00003695
Roman Divacky178e01602011-02-10 16:52:03 +00003696 if (Arg *A = Args.getLastArg(options::OPT_pg))
3697 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003698 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00003699 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003700
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003701 // Claim some arguments which clang supports automatically.
3702
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00003703 // -fpch-preprocess is used with gcc to add a special marker in the output to
3704 // include the PCH file. Clang's PTH solution is completely transparent, so we
3705 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003706 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003707
Daniel Dunbar17731772009-03-23 19:03:36 +00003708 // Claim some arguments which clang doesn't support, but we don't
3709 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003710 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3711 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00003712
Rafael Espindolab0092d72013-09-04 19:37:35 +00003713 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00003714 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003715}
3716
John McCall5fb5df92012-06-20 06:18:46 +00003717/// Add options related to the Objective-C runtime/ABI.
3718///
3719/// Returns true if the runtime is non-fragile.
3720ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3721 ArgStringList &cmdArgs,
3722 RewriteKind rewriteKind) const {
3723 // Look for the controlling runtime option.
3724 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3725 options::OPT_fgnu_runtime,
3726 options::OPT_fobjc_runtime_EQ);
3727
3728 // Just forward -fobjc-runtime= to the frontend. This supercedes
3729 // options about fragility.
3730 if (runtimeArg &&
3731 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3732 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003733 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003734 if (runtime.tryParse(value)) {
3735 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3736 << value;
3737 }
3738
3739 runtimeArg->render(args, cmdArgs);
3740 return runtime;
3741 }
3742
3743 // Otherwise, we'll need the ABI "version". Version numbers are
3744 // slightly confusing for historical reasons:
3745 // 1 - Traditional "fragile" ABI
3746 // 2 - Non-fragile ABI, version 1
3747 // 3 - Non-fragile ABI, version 2
3748 unsigned objcABIVersion = 1;
3749 // If -fobjc-abi-version= is present, use that to set the version.
3750 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003751 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003752 if (value == "1")
3753 objcABIVersion = 1;
3754 else if (value == "2")
3755 objcABIVersion = 2;
3756 else if (value == "3")
3757 objcABIVersion = 3;
3758 else
3759 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3760 << value;
3761 } else {
3762 // Otherwise, determine if we are using the non-fragile ABI.
3763 bool nonFragileABIIsDefault =
3764 (rewriteKind == RK_NonFragile ||
3765 (rewriteKind == RK_None &&
3766 getToolChain().IsObjCNonFragileABIDefault()));
3767 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3768 options::OPT_fno_objc_nonfragile_abi,
3769 nonFragileABIIsDefault)) {
3770 // Determine the non-fragile ABI version to use.
3771#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3772 unsigned nonFragileABIVersion = 1;
3773#else
3774 unsigned nonFragileABIVersion = 2;
3775#endif
3776
3777 if (Arg *abiArg = args.getLastArg(
3778 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003779 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003780 if (value == "1")
3781 nonFragileABIVersion = 1;
3782 else if (value == "2")
3783 nonFragileABIVersion = 2;
3784 else
3785 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3786 << value;
3787 }
3788
3789 objcABIVersion = 1 + nonFragileABIVersion;
3790 } else {
3791 objcABIVersion = 1;
3792 }
3793 }
3794
3795 // We don't actually care about the ABI version other than whether
3796 // it's non-fragile.
3797 bool isNonFragile = objcABIVersion != 1;
3798
3799 // If we have no runtime argument, ask the toolchain for its default runtime.
3800 // However, the rewriter only really supports the Mac runtime, so assume that.
3801 ObjCRuntime runtime;
3802 if (!runtimeArg) {
3803 switch (rewriteKind) {
3804 case RK_None:
3805 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3806 break;
3807 case RK_Fragile:
3808 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3809 break;
3810 case RK_NonFragile:
3811 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3812 break;
3813 }
3814
3815 // -fnext-runtime
3816 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3817 // On Darwin, make this use the default behavior for the toolchain.
3818 if (getToolChain().getTriple().isOSDarwin()) {
3819 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3820
3821 // Otherwise, build for a generic macosx port.
3822 } else {
3823 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3824 }
3825
3826 // -fgnu-runtime
3827 } else {
3828 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003829 // Legacy behaviour is to target the gnustep runtime if we are i
3830 // non-fragile mode or the GCC runtime in fragile mode.
3831 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003832 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003833 else
3834 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003835 }
3836
3837 cmdArgs.push_back(args.MakeArgString(
3838 "-fobjc-runtime=" + runtime.getAsString()));
3839 return runtime;
3840}
3841
Hans Wennborg75958c42013-08-08 00:17:41 +00003842void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
3843 unsigned RTOptionID = options::OPT__SLASH_MT;
3844
Hans Wennborgf1a74252013-09-10 20:18:04 +00003845 if (Args.hasArg(options::OPT__SLASH_LDd))
3846 // The /LDd option implies /MTd. The dependent lib part can be overridden,
3847 // but defining _DEBUG is sticky.
3848 RTOptionID = options::OPT__SLASH_MTd;
3849
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00003850 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00003851 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00003852
Hans Wennborg75958c42013-08-08 00:17:41 +00003853 switch(RTOptionID) {
3854 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00003855 if (Args.hasArg(options::OPT__SLASH_LDd))
3856 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00003857 CmdArgs.push_back("-D_MT");
3858 CmdArgs.push_back("-D_DLL");
3859 CmdArgs.push_back("--dependent-lib=msvcrt");
3860 break;
3861 case options::OPT__SLASH_MDd:
3862 CmdArgs.push_back("-D_DEBUG");
3863 CmdArgs.push_back("-D_MT");
3864 CmdArgs.push_back("-D_DLL");
3865 CmdArgs.push_back("--dependent-lib=msvcrtd");
3866 break;
3867 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00003868 if (Args.hasArg(options::OPT__SLASH_LDd))
3869 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00003870 CmdArgs.push_back("-D_MT");
3871 CmdArgs.push_back("--dependent-lib=libcmt");
3872 break;
3873 case options::OPT__SLASH_MTd:
3874 CmdArgs.push_back("-D_DEBUG");
3875 CmdArgs.push_back("-D_MT");
3876 CmdArgs.push_back("--dependent-lib=libcmtd");
3877 break;
3878 default:
3879 llvm_unreachable("Unexpected option ID.");
3880 }
3881
Reid Kleckner6beca0e2013-08-08 19:33:10 +00003882 // This provides POSIX compatibility (maps 'open' to '_open'), which most
3883 // users want. The /Za flag to cl.exe turns this off, but it's not
3884 // implemented in clang.
3885 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00003886
3887 // FIXME: Make this default for the win32 triple.
3888 CmdArgs.push_back("-cxx-abi");
3889 CmdArgs.push_back("microsoft");
Hans Wennborg0fd62072013-08-09 00:32:23 +00003890
3891 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
3892 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00003893
3894 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
3895 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00003896 if (Args.hasArg(options::OPT__SLASH_fallback))
3897 CmdArgs.push_back("msvc-fallback");
3898 else
3899 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00003900 }
Hans Wennborg75958c42013-08-08 00:17:41 +00003901}
3902
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003903void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003904 const InputInfo &Output,
3905 const InputInfoList &Inputs,
3906 const ArgList &Args,
3907 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003908 ArgStringList CmdArgs;
3909
3910 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3911 const InputInfo &Input = Inputs[0];
3912
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003913 // Don't warn about "clang -w -c foo.s"
3914 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003915 // and "clang -emit-llvm -c foo.s"
3916 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003917
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003918 // Invoke ourselves in -cc1as mode.
3919 //
3920 // FIXME: Implement custom jobs for internal actions.
3921 CmdArgs.push_back("-cc1as");
3922
3923 // Add the "effective" target triple.
3924 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003925 std::string TripleStr =
3926 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003927 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3928
3929 // Set the output mode, we currently only expect to be used as a real
3930 // assembler.
3931 CmdArgs.push_back("-filetype");
3932 CmdArgs.push_back("obj");
3933
Eric Christopher45f2e712012-12-18 00:31:10 +00003934 // Set the main file name, so that debug info works even with
3935 // -save-temps or preprocessed assembly.
3936 CmdArgs.push_back("-main-file-name");
3937 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3938
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003939 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003940 const llvm::Triple &Triple = getToolChain().getTriple();
3941 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003942 if (!CPU.empty()) {
3943 CmdArgs.push_back("-target-cpu");
3944 CmdArgs.push_back(Args.MakeArgString(CPU));
3945 }
3946
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003947 // Add the target features
3948 const Driver &D = getToolChain().getDriver();
3949 getTargetFeatures(D, Triple, Args, CmdArgs);
Jim Grosbach576452b2012-02-10 20:37:10 +00003950
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003951 // Ignore explicit -force_cpusubtype_ALL option.
3952 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003953
Eric Christopherfc3ee562012-01-10 00:38:01 +00003954 // Determine the original source input.
3955 const Action *SourceAction = &JA;
3956 while (SourceAction->getKind() != Action::InputClass) {
3957 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3958 SourceAction = SourceAction->getInputs()[0];
3959 }
3960
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003961 // Forward -g and handle debug info related flags, assuming we are dealing
3962 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00003963 if (SourceAction->getType() == types::TY_Asm ||
3964 SourceAction->getType() == types::TY_PP_Asm) {
3965 Args.ClaimAllArgs(options::OPT_g_Group);
3966 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3967 if (!A->getOption().matches(options::OPT_g0))
3968 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003969
3970 // Add the -fdebug-compilation-dir flag if needed.
3971 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00003972
3973 // Set the AT_producer to the clang version when using the integrated
3974 // assembler on assembly source files.
3975 CmdArgs.push_back("-dwarf-debug-producer");
3976 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00003977 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003978
3979 // Optionally embed the -cc1as level arguments into the debug info, for build
3980 // analysis.
3981 if (getToolChain().UseDwarfDebugFlags()) {
3982 ArgStringList OriginalArgs;
3983 for (ArgList::const_iterator it = Args.begin(),
3984 ie = Args.end(); it != ie; ++it)
3985 (*it)->render(Args, OriginalArgs);
3986
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003987 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003988 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3989 Flags += Exec;
3990 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3991 Flags += " ";
3992 Flags += OriginalArgs[i];
3993 }
3994 CmdArgs.push_back("-dwarf-debug-flags");
3995 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3996 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003997
3998 // FIXME: Add -static support, once we have it.
3999
David Blaikie9260ed62013-07-25 21:19:01 +00004000 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
4001 getToolChain().getDriver());
4002
Daniel Dunbar252e8f92011-04-29 17:53:18 +00004003 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004004
4005 assert(Output.isFilename() && "Unexpected lipo output.");
4006 CmdArgs.push_back("-o");
4007 CmdArgs.push_back(Output.getFilename());
4008
Daniel Dunbarb440f562010-08-02 02:38:21 +00004009 assert(Input.isFilename() && "Invalid input.");
4010 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004011
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004012 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004013 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00004014
4015 // Handle the debug info splitting at object creation time if we're
4016 // creating an object.
4017 // TODO: Currently only works on linux with newer objcopy.
4018 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004019 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00004020 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
4021 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004022}
4023
Daniel Dunbara3246a02009-03-18 08:07:30 +00004024void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004025 const InputInfo &Output,
4026 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004027 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004028 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004029 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00004030 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004031
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004032 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004033 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004034 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00004035 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00004036 // Don't forward any -g arguments to assembly steps.
4037 if (isa<AssembleJobAction>(JA) &&
4038 A->getOption().matches(options::OPT_g_Group))
4039 continue;
4040
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00004041 // Don't forward any -W arguments to assembly and link steps.
4042 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4043 A->getOption().matches(options::OPT_W_Group))
4044 continue;
4045
Daniel Dunbar2da02722009-03-19 07:55:12 +00004046 // It is unfortunate that we have to claim here, as this means
4047 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00004048 // platforms using a generic gcc, even if we are just using gcc
4049 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00004050 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004051 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00004052 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004053 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004054
Daniel Dunbar4e295052010-01-25 22:35:08 +00004055 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004056
4057 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004058 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00004059 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004060 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00004061
4062 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004063 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004064 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004065 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004066 CmdArgs.push_back("ppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00004067 else if (Arch == llvm::Triple::ppc64le)
4068 CmdArgs.push_back("ppc64le");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004069 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004070 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00004071 }
4072
Daniel Dunbar5716d872009-05-02 21:41:52 +00004073 // Try to force gcc to match the tool chain we want, if we recognize
4074 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004075 //
4076 // FIXME: The triple class should directly provide the information we want
4077 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004078 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004079 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00004080 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4081 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004082 CmdArgs.push_back("-m64");
4083
Daniel Dunbarb440f562010-08-02 02:38:21 +00004084 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004085 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004086 CmdArgs.push_back(Output.getFilename());
4087 } else {
4088 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004089 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004090 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004091
Tony Linthicum76329bf2011-12-12 21:14:55 +00004092 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4093 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004094
4095 // Only pass -x if gcc will understand it; otherwise hope gcc
4096 // understands the suffix correctly. The main use case this would go
4097 // wrong in is for linker inputs if they happened to have an odd
4098 // suffix; really the only way to get this to happen is a command
4099 // like '-x foobar a.c' which will treat a.c like a linker input.
4100 //
4101 // FIXME: For the linker case specifically, can we safely convert
4102 // inputs into '-Wl,' options?
4103 for (InputInfoList::const_iterator
4104 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4105 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004106
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004107 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004108 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4109 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004110 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004111 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004112 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004113 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004114 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004115 else if (II.getType() == types::TY_ModuleFile)
4116 D.Diag(diag::err_drv_no_module_support)
4117 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004118
Daniel Dunbara3246a02009-03-18 08:07:30 +00004119 if (types::canTypeBeUserSpecified(II.getType())) {
4120 CmdArgs.push_back("-x");
4121 CmdArgs.push_back(types::getTypeName(II.getType()));
4122 }
4123
Daniel Dunbarb440f562010-08-02 02:38:21 +00004124 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004125 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00004126 else {
4127 const Arg &A = II.getInputArg();
4128
4129 // Reverse translate some rewritten options.
4130 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4131 CmdArgs.push_back("-lstdc++");
4132 continue;
4133 }
4134
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004135 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00004136 A.render(Args, CmdArgs);
4137 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004138 }
4139
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004140 const std::string customGCCName = D.getCCCGenericGCCName();
4141 const char *GCCName;
4142 if (!customGCCName.empty())
4143 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00004144 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004145 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004146 } else
4147 GCCName = "gcc";
4148
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004149 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004150 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004151 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004152}
4153
Daniel Dunbar4e295052010-01-25 22:35:08 +00004154void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4155 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004156 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004157}
4158
Daniel Dunbar4e295052010-01-25 22:35:08 +00004159void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
4160 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004161 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004162}
4163
Daniel Dunbar4e295052010-01-25 22:35:08 +00004164void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4165 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004166 const Driver &D = getToolChain().getDriver();
4167
Daniel Dunbar4e295052010-01-25 22:35:08 +00004168 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004169 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4170 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00004171 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004172 else {
4173 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004174 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004175 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004176
Daniel Dunbar4e295052010-01-25 22:35:08 +00004177 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004178 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004179}
4180
Daniel Dunbar4e295052010-01-25 22:35:08 +00004181void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
4182 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004183 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004184}
Daniel Dunbara3246a02009-03-18 08:07:30 +00004185
Daniel Dunbar4e295052010-01-25 22:35:08 +00004186void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4187 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004188 // The types are (hopefully) good enough.
4189}
4190
Tony Linthicum76329bf2011-12-12 21:14:55 +00004191// Hexagon tools start.
4192void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4193 ArgStringList &CmdArgs) const {
4194
4195}
4196void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4197 const InputInfo &Output,
4198 const InputInfoList &Inputs,
4199 const ArgList &Args,
4200 const char *LinkingOutput) const {
4201
4202 const Driver &D = getToolChain().getDriver();
4203 ArgStringList CmdArgs;
4204
4205 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00004206 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00004207 CmdArgs.push_back(Args.MakeArgString(MarchString));
4208
4209 RenderExtraToolArgs(JA, CmdArgs);
4210
4211 if (Output.isFilename()) {
4212 CmdArgs.push_back("-o");
4213 CmdArgs.push_back(Output.getFilename());
4214 } else {
4215 assert(Output.isNothing() && "Unexpected output");
4216 CmdArgs.push_back("-fsyntax-only");
4217 }
4218
Matthew Curtise8f80a12012-12-06 17:49:03 +00004219 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4220 if (!SmallDataThreshold.empty())
4221 CmdArgs.push_back(
4222 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004223
Matthew Curtise5df3812012-12-07 17:23:04 +00004224 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4225 options::OPT_Xassembler);
4226
Tony Linthicum76329bf2011-12-12 21:14:55 +00004227 // Only pass -x if gcc will understand it; otherwise hope gcc
4228 // understands the suffix correctly. The main use case this would go
4229 // wrong in is for linker inputs if they happened to have an odd
4230 // suffix; really the only way to get this to happen is a command
4231 // like '-x foobar a.c' which will treat a.c like a linker input.
4232 //
4233 // FIXME: For the linker case specifically, can we safely convert
4234 // inputs into '-Wl,' options?
4235 for (InputInfoList::const_iterator
4236 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4237 const InputInfo &II = *it;
4238
4239 // Don't try to pass LLVM or AST inputs to a generic gcc.
4240 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4241 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4242 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4243 << getToolChain().getTripleString();
4244 else if (II.getType() == types::TY_AST)
4245 D.Diag(clang::diag::err_drv_no_ast_support)
4246 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004247 else if (II.getType() == types::TY_ModuleFile)
4248 D.Diag(diag::err_drv_no_module_support)
4249 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00004250
4251 if (II.isFilename())
4252 CmdArgs.push_back(II.getFilename());
4253 else
4254 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4255 II.getInputArg().render(Args, CmdArgs);
4256 }
4257
4258 const char *GCCName = "hexagon-as";
4259 const char *Exec =
4260 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4261 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4262
4263}
4264void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4265 ArgStringList &CmdArgs) const {
4266 // The types are (hopefully) good enough.
4267}
4268
4269void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4270 const InputInfo &Output,
4271 const InputInfoList &Inputs,
4272 const ArgList &Args,
4273 const char *LinkingOutput) const {
4274
Matthew Curtise689b052012-12-06 15:46:07 +00004275 const toolchains::Hexagon_TC& ToolChain =
4276 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4277 const Driver &D = ToolChain.getDriver();
4278
Tony Linthicum76329bf2011-12-12 21:14:55 +00004279 ArgStringList CmdArgs;
4280
Matthew Curtise689b052012-12-06 15:46:07 +00004281 //----------------------------------------------------------------------------
4282 //
4283 //----------------------------------------------------------------------------
4284 bool hasStaticArg = Args.hasArg(options::OPT_static);
4285 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00004286 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00004287 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4288 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4289 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4290 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004291
Matthew Curtise689b052012-12-06 15:46:07 +00004292 //----------------------------------------------------------------------------
4293 // Silence warnings for various options
4294 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00004295
Matthew Curtise689b052012-12-06 15:46:07 +00004296 Args.ClaimAllArgs(options::OPT_g_Group);
4297 Args.ClaimAllArgs(options::OPT_emit_llvm);
4298 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4299 // handled somewhere else.
4300 Args.ClaimAllArgs(options::OPT_static_libgcc);
4301
4302 //----------------------------------------------------------------------------
4303 //
4304 //----------------------------------------------------------------------------
4305 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4306 e = ToolChain.ExtraOpts.end();
4307 i != e; ++i)
4308 CmdArgs.push_back(i->c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004309
Matthew Curtisf10a5952012-12-06 14:16:43 +00004310 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4311 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00004312
Matthew Curtise689b052012-12-06 15:46:07 +00004313 if (buildingLib) {
4314 CmdArgs.push_back("-shared");
4315 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4316 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00004317 }
4318
Matthew Curtise689b052012-12-06 15:46:07 +00004319 if (hasStaticArg)
4320 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004321
Matthew Curtise8f80a12012-12-06 17:49:03 +00004322 if (buildPIE && !buildingLib)
4323 CmdArgs.push_back("-pie");
4324
4325 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4326 if (!SmallDataThreshold.empty()) {
4327 CmdArgs.push_back(
4328 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4329 }
4330
Matthew Curtise689b052012-12-06 15:46:07 +00004331 //----------------------------------------------------------------------------
4332 //
4333 //----------------------------------------------------------------------------
4334 CmdArgs.push_back("-o");
4335 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004336
Matthew Curtise689b052012-12-06 15:46:07 +00004337 const std::string MarchSuffix = "/" + MarchString;
4338 const std::string G0Suffix = "/G0";
4339 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4340 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4341 + "/";
4342 const std::string StartFilesDir = RootDir
4343 + "hexagon/lib"
4344 + (buildingLib
4345 ? MarchG0Suffix : MarchSuffix);
4346
4347 //----------------------------------------------------------------------------
4348 // moslib
4349 //----------------------------------------------------------------------------
4350 std::vector<std::string> oslibs;
4351 bool hasStandalone= false;
4352
4353 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4354 ie = Args.filtered_end(); it != ie; ++it) {
4355 (*it)->claim();
4356 oslibs.push_back((*it)->getValue());
4357 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004358 }
Matthew Curtise689b052012-12-06 15:46:07 +00004359 if (oslibs.empty()) {
4360 oslibs.push_back("standalone");
4361 hasStandalone = true;
4362 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004363
Matthew Curtise689b052012-12-06 15:46:07 +00004364 //----------------------------------------------------------------------------
4365 // Start Files
4366 //----------------------------------------------------------------------------
4367 if (incStdLib && incStartFiles) {
4368
4369 if (!buildingLib) {
4370 if (hasStandalone) {
4371 CmdArgs.push_back(
4372 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4373 }
4374 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4375 }
4376 std::string initObj = useShared ? "/initS.o" : "/init.o";
4377 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4378 }
4379
4380 //----------------------------------------------------------------------------
4381 // Library Search Paths
4382 //----------------------------------------------------------------------------
4383 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4384 for (ToolChain::path_list::const_iterator
4385 i = LibPaths.begin(),
4386 e = LibPaths.end();
4387 i != e;
4388 ++i)
4389 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4390
4391 //----------------------------------------------------------------------------
4392 //
4393 //----------------------------------------------------------------------------
4394 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4395 Args.AddAllArgs(CmdArgs, options::OPT_e);
4396 Args.AddAllArgs(CmdArgs, options::OPT_s);
4397 Args.AddAllArgs(CmdArgs, options::OPT_t);
4398 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4399
4400 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4401
4402 //----------------------------------------------------------------------------
4403 // Libraries
4404 //----------------------------------------------------------------------------
4405 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00004406 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00004407 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4408 CmdArgs.push_back("-lm");
4409 }
4410
4411 CmdArgs.push_back("--start-group");
4412
4413 if (!buildingLib) {
4414 for(std::vector<std::string>::iterator i = oslibs.begin(),
4415 e = oslibs.end(); i != e; ++i)
4416 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4417 CmdArgs.push_back("-lc");
4418 }
4419 CmdArgs.push_back("-lgcc");
4420
4421 CmdArgs.push_back("--end-group");
4422 }
4423
4424 //----------------------------------------------------------------------------
4425 // End files
4426 //----------------------------------------------------------------------------
4427 if (incStdLib && incStartFiles) {
4428 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4429 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4430 }
4431
4432 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00004433 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004434}
4435// Hexagon tools end.
4436
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004437llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4438 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4439 // archs which Darwin doesn't use.
4440
4441 // The matching this routine does is fairly pointless, since it is neither the
4442 // complete architecture list, nor a reasonable subset. The problem is that
4443 // historically the driver driver accepts this and also ties its -march=
4444 // handling to the architecture name, so we need to be careful before removing
4445 // support for it.
4446
4447 // This code must be kept in sync with Clang's Darwin specific argument
4448 // translation.
4449
4450 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4451 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4452 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4453 .Case("ppc64", llvm::Triple::ppc64)
4454 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4455 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4456 llvm::Triple::x86)
4457 .Case("x86_64", llvm::Triple::x86_64)
4458 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00004459 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4460 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4461 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004462 .Case("r600", llvm::Triple::r600)
4463 .Case("nvptx", llvm::Triple::nvptx)
4464 .Case("nvptx64", llvm::Triple::nvptx64)
4465 .Case("amdil", llvm::Triple::amdil)
4466 .Case("spir", llvm::Triple::spir)
4467 .Default(llvm::Triple::UnknownArch);
4468}
Tony Linthicum76329bf2011-12-12 21:14:55 +00004469
Bob Wilsondecc03e2012-11-23 06:14:39 +00004470const char *Clang::getBaseInputName(const ArgList &Args,
4471 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00004472 return Args.MakeArgString(
4473 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004474}
4475
Bob Wilsondecc03e2012-11-23 06:14:39 +00004476const char *Clang::getBaseInputStem(const ArgList &Args,
4477 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004478 const char *Str = getBaseInputName(Args, Inputs);
4479
Chris Lattner906bb902011-01-16 08:14:11 +00004480 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004481 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004482
4483 return Str;
4484}
4485
Bob Wilsondecc03e2012-11-23 06:14:39 +00004486const char *Clang::getDependencyFileName(const ArgList &Args,
4487 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004488 // FIXME: Think about this more.
4489 std::string Res;
4490
4491 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004492 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004493 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004494 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00004495 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004496 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004497 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004498}
4499
Daniel Dunbarbe220842009-03-20 16:06:39 +00004500void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004501 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004502 const InputInfoList &Inputs,
4503 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004504 const char *LinkingOutput) const {
4505 ArgStringList CmdArgs;
4506
4507 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4508 const InputInfo &Input = Inputs[0];
4509
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004510 // Determine the original source input.
4511 const Action *SourceAction = &JA;
4512 while (SourceAction->getKind() != Action::InputClass) {
4513 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4514 SourceAction = SourceAction->getInputs()[0];
4515 }
4516
4517 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004518 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004519 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004520 if (Args.hasArg(options::OPT_gstabs))
4521 CmdArgs.push_back("--gstabs");
4522 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004523 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004524 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004525
Daniel Dunbarbe220842009-03-20 16:06:39 +00004526 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004527 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004528
Daniel Dunbar6d484762010-07-22 01:47:22 +00004529 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004530 if (getToolChain().getArch() == llvm::Triple::x86 ||
4531 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004532 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4533 CmdArgs.push_back("-force_cpusubtype_ALL");
4534
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004535 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004536 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00004537 Args.hasArg(options::OPT_fapple_kext)) &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004538 (!getDarwinToolChain().isTargetIPhoneOS() ||
4539 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4540 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004541 CmdArgs.push_back("-static");
4542
Daniel Dunbarbe220842009-03-20 16:06:39 +00004543 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4544 options::OPT_Xassembler);
4545
4546 assert(Output.isFilename() && "Unexpected lipo output.");
4547 CmdArgs.push_back("-o");
4548 CmdArgs.push_back(Output.getFilename());
4549
Daniel Dunbarb440f562010-08-02 02:38:21 +00004550 assert(Input.isFilename() && "Invalid input.");
4551 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004552
4553 // asm_final spec is empty.
4554
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004555 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004556 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004557 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004558}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004559
David Blaikie68e081d2011-12-20 02:48:34 +00004560void darwin::DarwinTool::anchor() {}
4561
Daniel Dunbare9ded432009-09-09 18:36:20 +00004562void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4563 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004564 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004565
Daniel Dunbarc1964212009-03-26 16:23:12 +00004566 // Derived from darwin_arch spec.
4567 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004568 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004569
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004570 // FIXME: Is this needed anymore?
4571 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004572 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004573}
4574
Bill Wendling3b2000f2012-10-02 18:02:50 +00004575bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4576 // We only need to generate a temp path for LTO if we aren't compiling object
4577 // files. When compiling source files, we run 'dsymutil' after linking. We
4578 // don't run 'dsymutil' when compiling object files.
4579 for (InputInfoList::const_iterator
4580 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4581 if (it->getType() != types::TY_Object)
4582 return true;
4583
4584 return false;
4585}
4586
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004587void darwin::Link::AddLinkArgs(Compilation &C,
4588 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004589 ArgStringList &CmdArgs,
4590 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004591 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004592 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004593
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004594 unsigned Version[3] = { 0, 0, 0 };
4595 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4596 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00004597 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004598 Version[1], Version[2], HadExtra) ||
4599 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004600 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004601 << A->getAsString(Args);
4602 }
4603
4604 // Newer linkers support -demangle, pass it if supported and not disabled by
4605 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004606 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004607 // Don't pass -demangle to ld_classic.
4608 //
4609 // FIXME: This is a temporary workaround, ld should be handling this.
4610 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4611 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004612 if (getToolChain().getArch() == llvm::Triple::x86) {
4613 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4614 options::OPT_Wl_COMMA),
4615 ie = Args.filtered_end(); it != ie; ++it) {
4616 const Arg *A = *it;
4617 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smithbd55daf2012-11-01 04:30:05 +00004618 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004619 UsesLdClassic = true;
4620 }
4621 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004622 if (!UsesLdClassic)
4623 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004624 }
4625
Bob Wilson3d27dad2013-08-02 22:25:34 +00004626 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
4627 CmdArgs.push_back("-export_dynamic");
4628
Bill Wendling313b6bf2012-11-16 23:03:00 +00004629 // If we are using LTO, then automatically create a temporary file path for
4630 // the linker to use, so that it's lifetime will extend past a possible
4631 // dsymutil step.
4632 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4633 const char *TmpPath = C.getArgs().MakeArgString(
4634 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4635 C.addTempFile(TmpPath);
4636 CmdArgs.push_back("-object_path_lto");
4637 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00004638 }
4639
Daniel Dunbarc1964212009-03-26 16:23:12 +00004640 // Derived from the "link" spec.
4641 Args.AddAllArgs(CmdArgs, options::OPT_static);
4642 if (!Args.hasArg(options::OPT_static))
4643 CmdArgs.push_back("-dynamic");
4644 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4645 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4646 // here. How do we wish to handle such things?
4647 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004648
Daniel Dunbarc1964212009-03-26 16:23:12 +00004649 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004650 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004651 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004652 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004653
4654 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4655 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4656 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4657
4658 Arg *A;
4659 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4660 (A = Args.getLastArg(options::OPT_current__version)) ||
4661 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004662 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004663 << A->getAsString(Args) << "-dynamiclib";
4664
4665 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4666 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4667 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4668 } else {
4669 CmdArgs.push_back("-dylib");
4670
4671 Arg *A;
4672 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4673 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4674 (A = Args.getLastArg(options::OPT_client__name)) ||
4675 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4676 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4677 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004678 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004679 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004680
Daniel Dunbarc1964212009-03-26 16:23:12 +00004681 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4682 "-dylib_compatibility_version");
4683 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4684 "-dylib_current_version");
4685
Daniel Dunbara48823f2010-01-22 02:04:52 +00004686 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004687
4688 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4689 "-dylib_install_name");
4690 }
4691
4692 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4693 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4694 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004695 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004696 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004697 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4698 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4699 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4700 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4701 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4702 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004703 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004704 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4705 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4706 Args.AddAllArgs(CmdArgs, options::OPT_init);
4707
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004708 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004709 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004710
4711 // If we had an explicit -mios-simulator-version-min argument, honor that,
4712 // otherwise use the traditional deployment targets. We can't just check the
4713 // is-sim attribute because existing code follows this path, and the linker
4714 // may not handle the argument.
4715 //
4716 // FIXME: We may be able to remove this, once we can verify no one depends on
4717 // it.
4718 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4719 CmdArgs.push_back("-ios_simulator_version_min");
4720 else if (DarwinTC.isTargetIPhoneOS())
4721 CmdArgs.push_back("-iphoneos_version_min");
4722 else
4723 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004724 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004725
Daniel Dunbarc1964212009-03-26 16:23:12 +00004726 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4727 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4728 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4729 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4730 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004731
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004732 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4733 options::OPT_fno_pie,
4734 options::OPT_fno_PIE)) {
4735 if (A->getOption().matches(options::OPT_fpie) ||
4736 A->getOption().matches(options::OPT_fPIE))
4737 CmdArgs.push_back("-pie");
4738 else
4739 CmdArgs.push_back("-no_pie");
4740 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004741
4742 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4743 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4744 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4745 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4746 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4747 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4748 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4749 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4750 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4751 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4752 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4753 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4754 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4755 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4756 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4757 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004758
Daniel Dunbar84384642011-05-02 21:03:47 +00004759 // Give --sysroot= preference, over the Apple specific behavior to also use
4760 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004761 StringRef sysroot = C.getSysRoot();
4762 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004763 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004764 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004765 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4766 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00004767 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004768 }
4769
Daniel Dunbarc1964212009-03-26 16:23:12 +00004770 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4771 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4772 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4773 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4774 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004775 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004776 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4777 Args.AddAllArgs(CmdArgs, options::OPT_y);
4778 Args.AddLastArg(CmdArgs, options::OPT_w);
4779 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4780 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4781 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4782 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4783 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4784 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4785 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4786 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4787 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4788 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4789 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4790 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4791}
4792
4793void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004794 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004795 const InputInfoList &Inputs,
4796 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004797 const char *LinkingOutput) const {
4798 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004799
Daniel Dunbarc1964212009-03-26 16:23:12 +00004800 // The logic here is derived from gcc's behavior; most of which
4801 // comes from specs (starting with link_command). Consult gcc for
4802 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004803 ArgStringList CmdArgs;
4804
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004805 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4806 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4807 options::OPT_ccc_arcmt_migrate)) {
4808 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4809 (*I)->claim();
4810 const char *Exec =
4811 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4812 CmdArgs.push_back(Output.getFilename());
4813 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4814 return;
4815 }
4816
Daniel Dunbarc1964212009-03-26 16:23:12 +00004817 // I'm not sure why this particular decomposition exists in gcc, but
4818 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004819 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004820
Daniel Dunbarc1964212009-03-26 16:23:12 +00004821 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4822 Args.AddAllArgs(CmdArgs, options::OPT_s);
4823 Args.AddAllArgs(CmdArgs, options::OPT_t);
4824 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4825 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004826 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004827 Args.AddAllArgs(CmdArgs, options::OPT_r);
4828
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004829 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4830 // members of static archive libraries which implement Objective-C classes or
4831 // categories.
4832 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4833 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004834
Daniel Dunbarc1964212009-03-26 16:23:12 +00004835 CmdArgs.push_back("-o");
4836 CmdArgs.push_back(Output.getFilename());
4837
Chad Rosier06fd3c62012-05-16 23:45:12 +00004838 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004839 !Args.hasArg(options::OPT_nostartfiles)) {
4840 // Derived from startfile spec.
4841 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004842 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004843 if (getDarwinToolChain().isTargetIOSSimulator()) {
4844 // The simulator doesn't have a versioned crt1 file.
4845 CmdArgs.push_back("-ldylib1.o");
4846 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004847 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4848 CmdArgs.push_back("-ldylib1.o");
4849 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004850 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004851 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004852 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004853 CmdArgs.push_back("-ldylib1.10.5.o");
4854 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004855 } else {
4856 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004857 if (!Args.hasArg(options::OPT_static)) {
4858 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004859 if (getDarwinToolChain().isTargetIOSSimulator()) {
4860 // The simulator doesn't have a versioned crt1 file.
4861 CmdArgs.push_back("-lbundle1.o");
4862 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004863 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4864 CmdArgs.push_back("-lbundle1.o");
4865 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004866 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004867 CmdArgs.push_back("-lbundle1.o");
4868 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004869 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004870 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004871 if (Args.hasArg(options::OPT_pg) &&
4872 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004873 if (Args.hasArg(options::OPT_static) ||
4874 Args.hasArg(options::OPT_object) ||
4875 Args.hasArg(options::OPT_preload)) {
4876 CmdArgs.push_back("-lgcrt0.o");
4877 } else {
4878 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004879
Daniel Dunbarc1964212009-03-26 16:23:12 +00004880 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004881 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004882 // By default on OS X 10.8 and later, we don't link with a crt1.o
4883 // file and the linker knows to use _main as the entry point. But,
4884 // when compiling with -pg, we need to link with the gcrt1.o file,
4885 // so pass the -no_new_main option to tell the linker to use the
4886 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004887 if (getDarwinToolChain().isTargetMacOS() &&
4888 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4889 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004890 } else {
4891 if (Args.hasArg(options::OPT_static) ||
4892 Args.hasArg(options::OPT_object) ||
4893 Args.hasArg(options::OPT_preload)) {
4894 CmdArgs.push_back("-lcrt0.o");
4895 } else {
4896 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004897 if (getDarwinToolChain().isTargetIOSSimulator()) {
4898 // The simulator doesn't have a versioned crt1 file.
4899 CmdArgs.push_back("-lcrt1.o");
4900 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004901 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4902 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004903 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00004904 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004905 } else {
4906 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4907 CmdArgs.push_back("-lcrt1.o");
4908 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4909 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004910 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004911 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004912
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004913 // darwin_crt2 spec is empty.
4914 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004915 }
4916 }
4917 }
4918 }
4919
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004920 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4921 Args.hasArg(options::OPT_shared_libgcc) &&
4922 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004923 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004924 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004925 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004926 }
4927 }
4928
4929 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004930
Daniel Dunbarc1964212009-03-26 16:23:12 +00004931 if (Args.hasArg(options::OPT_fopenmp))
4932 // This is more complicated in gcc...
4933 CmdArgs.push_back("-lgomp");
4934
Douglas Gregor9295df02012-05-15 21:00:27 +00004935 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4936
Bob Wilson16d93952012-05-15 18:57:39 +00004937 if (isObjCRuntimeLinked(Args) &&
4938 !Args.hasArg(options::OPT_nostdlib) &&
4939 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004940 // Avoid linking compatibility stubs on i386 mac.
4941 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004942 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004943 // If we don't have ARC or subscripting runtime support, link in the
4944 // runtime stubs. We have to do this *before* adding any of the normal
4945 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004946 ObjCRuntime runtime =
4947 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004948 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004949 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004950 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004951 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004952 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004953 CmdArgs.push_back("-framework");
4954 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004955 // Link libobj.
4956 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004957 }
John McCall31168b02011-06-15 23:02:42 +00004958
Daniel Dunbarc1964212009-03-26 16:23:12 +00004959 if (LinkingOutput) {
4960 CmdArgs.push_back("-arch_multiple");
4961 CmdArgs.push_back("-final_output");
4962 CmdArgs.push_back(LinkingOutput);
4963 }
4964
Daniel Dunbarc1964212009-03-26 16:23:12 +00004965 if (Args.hasArg(options::OPT_fnested_functions))
4966 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004967
Daniel Dunbarc1964212009-03-26 16:23:12 +00004968 if (!Args.hasArg(options::OPT_nostdlib) &&
4969 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00004970 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004971 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004972
Daniel Dunbarc1964212009-03-26 16:23:12 +00004973 // link_ssp spec is empty.
4974
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004975 // Let the tool chain choose which runtime library to link.
4976 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004977 }
4978
Chad Rosier06fd3c62012-05-16 23:45:12 +00004979 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004980 !Args.hasArg(options::OPT_nostartfiles)) {
4981 // endfile_spec is empty.
4982 }
4983
4984 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4985 Args.AddAllArgs(CmdArgs, options::OPT_F);
4986
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004987 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004988 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004989 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004990}
4991
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004992void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004993 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004994 const InputInfoList &Inputs,
4995 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004996 const char *LinkingOutput) const {
4997 ArgStringList CmdArgs;
4998
4999 CmdArgs.push_back("-create");
5000 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005001
5002 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005003 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005004
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005005 for (InputInfoList::const_iterator
5006 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5007 const InputInfo &II = *it;
5008 assert(II.isFilename() && "Unexpected lipo input.");
5009 CmdArgs.push_back(II.getFilename());
5010 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005011 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005012 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005013 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005014}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005015
Daniel Dunbar88299622010-06-04 18:28:36 +00005016void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005017 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00005018 const InputInfoList &Inputs,
5019 const ArgList &Args,
5020 const char *LinkingOutput) const {
5021 ArgStringList CmdArgs;
5022
Daniel Dunbareb86b042011-05-09 17:23:16 +00005023 CmdArgs.push_back("-o");
5024 CmdArgs.push_back(Output.getFilename());
5025
Daniel Dunbar88299622010-06-04 18:28:36 +00005026 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5027 const InputInfo &Input = Inputs[0];
5028 assert(Input.isFilename() && "Unexpected dsymutil input.");
5029 CmdArgs.push_back(Input.getFilename());
5030
Daniel Dunbar88299622010-06-04 18:28:36 +00005031 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005032 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005033 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00005034}
5035
Eric Christopher551ef452011-08-23 17:56:55 +00005036void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00005037 const InputInfo &Output,
5038 const InputInfoList &Inputs,
5039 const ArgList &Args,
5040 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00005041 ArgStringList CmdArgs;
5042 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00005043 CmdArgs.push_back("--debug-info");
5044 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00005045 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00005046
5047 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5048 const InputInfo &Input = Inputs[0];
5049 assert(Input.isFilename() && "Unexpected verify input");
5050
5051 // Grabbing the output of the earlier dsymutil run.
5052 CmdArgs.push_back(Input.getFilename());
5053
5054 const char *Exec =
5055 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5056 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5057}
5058
David Chisnallf571cde2012-02-15 13:39:01 +00005059void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5060 const InputInfo &Output,
5061 const InputInfoList &Inputs,
5062 const ArgList &Args,
5063 const char *LinkingOutput) const {
5064 ArgStringList CmdArgs;
5065
5066 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5067 options::OPT_Xassembler);
5068
5069 CmdArgs.push_back("-o");
5070 CmdArgs.push_back(Output.getFilename());
5071
5072 for (InputInfoList::const_iterator
5073 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5074 const InputInfo &II = *it;
5075 CmdArgs.push_back(II.getFilename());
5076 }
5077
5078 const char *Exec =
5079 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5080 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5081}
5082
5083
5084void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5085 const InputInfo &Output,
5086 const InputInfoList &Inputs,
5087 const ArgList &Args,
5088 const char *LinkingOutput) const {
5089 // FIXME: Find a real GCC, don't hard-code versions here
5090 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5091 const llvm::Triple &T = getToolChain().getTriple();
5092 std::string LibPath = "/usr/lib/";
5093 llvm::Triple::ArchType Arch = T.getArch();
5094 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005095 case llvm::Triple::x86:
5096 GCCLibPath +=
5097 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5098 break;
5099 case llvm::Triple::x86_64:
5100 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5101 GCCLibPath += "/4.5.2/amd64/";
5102 LibPath += "amd64/";
5103 break;
5104 default:
5105 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00005106 }
5107
5108 ArgStringList CmdArgs;
5109
David Chisnall272a0712012-02-29 15:06:12 +00005110 // Demangle C++ names in errors
5111 CmdArgs.push_back("-C");
5112
David Chisnallf571cde2012-02-15 13:39:01 +00005113 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5114 (!Args.hasArg(options::OPT_shared))) {
5115 CmdArgs.push_back("-e");
5116 CmdArgs.push_back("_start");
5117 }
5118
5119 if (Args.hasArg(options::OPT_static)) {
5120 CmdArgs.push_back("-Bstatic");
5121 CmdArgs.push_back("-dn");
5122 } else {
5123 CmdArgs.push_back("-Bdynamic");
5124 if (Args.hasArg(options::OPT_shared)) {
5125 CmdArgs.push_back("-shared");
5126 } else {
5127 CmdArgs.push_back("--dynamic-linker");
5128 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5129 }
5130 }
5131
5132 if (Output.isFilename()) {
5133 CmdArgs.push_back("-o");
5134 CmdArgs.push_back(Output.getFilename());
5135 } else {
5136 assert(Output.isNothing() && "Invalid output.");
5137 }
5138
5139 if (!Args.hasArg(options::OPT_nostdlib) &&
5140 !Args.hasArg(options::OPT_nostartfiles)) {
5141 if (!Args.hasArg(options::OPT_shared)) {
5142 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5143 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005144 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005145 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5146 } else {
5147 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005148 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5149 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005150 }
Hans Wennborg70850d82013-07-18 20:29:38 +00005151 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00005152 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005153 }
5154
5155 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5156
5157 Args.AddAllArgs(CmdArgs, options::OPT_L);
5158 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5159 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00005160 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00005161
5162 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5163
5164 if (!Args.hasArg(options::OPT_nostdlib) &&
5165 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005166 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00005167 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00005168 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005169 if (!Args.hasArg(options::OPT_shared)) {
5170 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00005171 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00005172 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005173 }
David Chisnallf571cde2012-02-15 13:39:01 +00005174 }
5175
5176 if (!Args.hasArg(options::OPT_nostdlib) &&
5177 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00005178 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005179 }
David Chisnall96de9932012-02-16 16:00:47 +00005180 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005181
5182 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5183
5184 const char *Exec =
5185 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5186 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5187}
5188
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005189void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005190 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005191 const InputInfoList &Inputs,
5192 const ArgList &Args,
5193 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005194 ArgStringList CmdArgs;
5195
5196 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5197 options::OPT_Xassembler);
5198
5199 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005200 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005201
5202 for (InputInfoList::const_iterator
5203 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5204 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005205 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005206 }
5207
5208 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005209 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005210 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005211}
5212
5213void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005214 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005215 const InputInfoList &Inputs,
5216 const ArgList &Args,
5217 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005218 ArgStringList CmdArgs;
5219
5220 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005221 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005222 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005223 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005224 }
5225
5226 if (Args.hasArg(options::OPT_static)) {
5227 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005228 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005229 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005230// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005231 CmdArgs.push_back("-Bdynamic");
5232 if (Args.hasArg(options::OPT_shared)) {
5233 CmdArgs.push_back("-shared");
5234 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00005235 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005236 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5237 }
5238 }
5239
Daniel Dunbarb440f562010-08-02 02:38:21 +00005240 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005241 CmdArgs.push_back("-o");
5242 CmdArgs.push_back(Output.getFilename());
5243 } else {
5244 assert(Output.isNothing() && "Invalid output.");
5245 }
5246
5247 if (!Args.hasArg(options::OPT_nostdlib) &&
5248 !Args.hasArg(options::OPT_nostartfiles)) {
5249 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005250 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005251 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005252 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005253 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005254 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005255 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005256 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005257 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005258 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005259 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005260 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005261 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005262 }
5263
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005264 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5265 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005266 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005267
5268 Args.AddAllArgs(CmdArgs, options::OPT_L);
5269 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5270 Args.AddAllArgs(CmdArgs, options::OPT_e);
5271
Daniel Dunbar54423b22010-09-17 00:24:54 +00005272 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005273
5274 if (!Args.hasArg(options::OPT_nostdlib) &&
5275 !Args.hasArg(options::OPT_nodefaultlibs)) {
5276 // FIXME: For some reason GCC passes -lgcc before adding
5277 // the default system libraries. Just mimic this for now.
5278 CmdArgs.push_back("-lgcc");
5279
5280 if (Args.hasArg(options::OPT_pthread))
5281 CmdArgs.push_back("-pthread");
5282 if (!Args.hasArg(options::OPT_shared))
5283 CmdArgs.push_back("-lc");
5284 CmdArgs.push_back("-lgcc");
5285 }
5286
5287 if (!Args.hasArg(options::OPT_nostdlib) &&
5288 !Args.hasArg(options::OPT_nostartfiles)) {
5289 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005290 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005291 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005292 }
5293
Bill Wendling08760582011-06-27 19:15:03 +00005294 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005295
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005296 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005297 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005298 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005299}
5300
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005301void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005302 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005303 const InputInfoList &Inputs,
5304 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005305 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005306 ArgStringList CmdArgs;
5307
5308 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5309 options::OPT_Xassembler);
5310
5311 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005312 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005313
5314 for (InputInfoList::const_iterator
5315 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5316 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005317 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005318 }
5319
5320 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005321 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005322 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005323}
5324
5325void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005326 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005327 const InputInfoList &Inputs,
5328 const ArgList &Args,
5329 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005330 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005331 ArgStringList CmdArgs;
5332
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005333 // Silence warning for "clang -g foo.o -o foo"
5334 Args.ClaimAllArgs(options::OPT_g_Group);
5335 // and "clang -emit-llvm foo.o -o foo"
5336 Args.ClaimAllArgs(options::OPT_emit_llvm);
5337 // and for "clang -w foo.o -o foo". Other warning options are already
5338 // handled somewhere else.
5339 Args.ClaimAllArgs(options::OPT_w);
5340
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005341 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005342 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005343 CmdArgs.push_back("-e");
5344 CmdArgs.push_back("__start");
5345 }
5346
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005347 if (Args.hasArg(options::OPT_static)) {
5348 CmdArgs.push_back("-Bstatic");
5349 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005350 if (Args.hasArg(options::OPT_rdynamic))
5351 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005352 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005353 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005354 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005355 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005356 } else {
5357 CmdArgs.push_back("-dynamic-linker");
5358 CmdArgs.push_back("/usr/libexec/ld.so");
5359 }
5360 }
5361
Rafael Espindola044f7832013-06-05 04:28:55 +00005362 if (Args.hasArg(options::OPT_nopie))
5363 CmdArgs.push_back("-nopie");
5364
Daniel Dunbarb440f562010-08-02 02:38:21 +00005365 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005366 CmdArgs.push_back("-o");
5367 CmdArgs.push_back(Output.getFilename());
5368 } else {
5369 assert(Output.isNothing() && "Invalid output.");
5370 }
5371
5372 if (!Args.hasArg(options::OPT_nostdlib) &&
5373 !Args.hasArg(options::OPT_nostartfiles)) {
5374 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00005375 if (Args.hasArg(options::OPT_pg))
5376 CmdArgs.push_back(Args.MakeArgString(
5377 getToolChain().GetFilePath("gcrt0.o")));
5378 else
5379 CmdArgs.push_back(Args.MakeArgString(
5380 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005381 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005382 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005383 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005384 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005385 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005386 }
5387 }
5388
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005389 std::string Triple = getToolChain().getTripleString();
5390 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005391 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005392 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005393 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005394
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005395 Args.AddAllArgs(CmdArgs, options::OPT_L);
5396 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5397 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005398 Args.AddAllArgs(CmdArgs, options::OPT_s);
5399 Args.AddAllArgs(CmdArgs, options::OPT_t);
5400 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5401 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005402
Daniel Dunbar54423b22010-09-17 00:24:54 +00005403 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005404
5405 if (!Args.hasArg(options::OPT_nostdlib) &&
5406 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005407 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005408 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005409 if (Args.hasArg(options::OPT_pg))
5410 CmdArgs.push_back("-lm_p");
5411 else
5412 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005413 }
5414
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005415 // FIXME: For some reason GCC passes -lgcc before adding
5416 // the default system libraries. Just mimic this for now.
5417 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005418
Eric Christopher17674ec2012-09-13 06:32:34 +00005419 if (Args.hasArg(options::OPT_pthread)) {
5420 if (!Args.hasArg(options::OPT_shared) &&
5421 Args.hasArg(options::OPT_pg))
5422 CmdArgs.push_back("-lpthread_p");
5423 else
5424 CmdArgs.push_back("-lpthread");
5425 }
5426
Chandler Carruth45661652011-12-17 22:32:42 +00005427 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005428 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005429 CmdArgs.push_back("-lc_p");
5430 else
5431 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005432 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005433
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005434 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005435 }
5436
5437 if (!Args.hasArg(options::OPT_nostdlib) &&
5438 !Args.hasArg(options::OPT_nostartfiles)) {
5439 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005440 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005441 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005442 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005443 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005444 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005445 }
5446
5447 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005448 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005449 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005450}
Ed Schoutene33194b2009-04-02 19:13:12 +00005451
Eli Friedman9fa28852012-08-08 23:57:20 +00005452void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5453 const InputInfo &Output,
5454 const InputInfoList &Inputs,
5455 const ArgList &Args,
5456 const char *LinkingOutput) const {
5457 ArgStringList CmdArgs;
5458
5459 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5460 options::OPT_Xassembler);
5461
5462 CmdArgs.push_back("-o");
5463 CmdArgs.push_back(Output.getFilename());
5464
5465 for (InputInfoList::const_iterator
5466 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5467 const InputInfo &II = *it;
5468 CmdArgs.push_back(II.getFilename());
5469 }
5470
5471 const char *Exec =
5472 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5473 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5474}
5475
5476void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5477 const InputInfo &Output,
5478 const InputInfoList &Inputs,
5479 const ArgList &Args,
5480 const char *LinkingOutput) const {
5481 const Driver &D = getToolChain().getDriver();
5482 ArgStringList CmdArgs;
5483
5484 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5485 (!Args.hasArg(options::OPT_shared))) {
5486 CmdArgs.push_back("-e");
5487 CmdArgs.push_back("__start");
5488 }
5489
5490 if (Args.hasArg(options::OPT_static)) {
5491 CmdArgs.push_back("-Bstatic");
5492 } else {
5493 if (Args.hasArg(options::OPT_rdynamic))
5494 CmdArgs.push_back("-export-dynamic");
5495 CmdArgs.push_back("--eh-frame-hdr");
5496 CmdArgs.push_back("-Bdynamic");
5497 if (Args.hasArg(options::OPT_shared)) {
5498 CmdArgs.push_back("-shared");
5499 } else {
5500 CmdArgs.push_back("-dynamic-linker");
5501 CmdArgs.push_back("/usr/libexec/ld.so");
5502 }
5503 }
5504
5505 if (Output.isFilename()) {
5506 CmdArgs.push_back("-o");
5507 CmdArgs.push_back(Output.getFilename());
5508 } else {
5509 assert(Output.isNothing() && "Invalid output.");
5510 }
5511
5512 if (!Args.hasArg(options::OPT_nostdlib) &&
5513 !Args.hasArg(options::OPT_nostartfiles)) {
5514 if (!Args.hasArg(options::OPT_shared)) {
5515 if (Args.hasArg(options::OPT_pg))
5516 CmdArgs.push_back(Args.MakeArgString(
5517 getToolChain().GetFilePath("gcrt0.o")));
5518 else
5519 CmdArgs.push_back(Args.MakeArgString(
5520 getToolChain().GetFilePath("crt0.o")));
5521 CmdArgs.push_back(Args.MakeArgString(
5522 getToolChain().GetFilePath("crtbegin.o")));
5523 } else {
5524 CmdArgs.push_back(Args.MakeArgString(
5525 getToolChain().GetFilePath("crtbeginS.o")));
5526 }
5527 }
5528
5529 Args.AddAllArgs(CmdArgs, options::OPT_L);
5530 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5531 Args.AddAllArgs(CmdArgs, options::OPT_e);
5532
5533 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5534
5535 if (!Args.hasArg(options::OPT_nostdlib) &&
5536 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005537 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00005538 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5539 if (Args.hasArg(options::OPT_pg))
5540 CmdArgs.push_back("-lm_p");
5541 else
5542 CmdArgs.push_back("-lm");
5543 }
5544
Rafael Espindola1ad26f02012-10-23 17:07:31 +00005545 if (Args.hasArg(options::OPT_pthread)) {
5546 if (!Args.hasArg(options::OPT_shared) &&
5547 Args.hasArg(options::OPT_pg))
5548 CmdArgs.push_back("-lpthread_p");
5549 else
5550 CmdArgs.push_back("-lpthread");
5551 }
5552
Eli Friedman9fa28852012-08-08 23:57:20 +00005553 if (!Args.hasArg(options::OPT_shared)) {
5554 if (Args.hasArg(options::OPT_pg))
5555 CmdArgs.push_back("-lc_p");
5556 else
5557 CmdArgs.push_back("-lc");
5558 }
5559
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005560 StringRef MyArch;
5561 switch (getToolChain().getTriple().getArch()) {
5562 case llvm::Triple::arm:
5563 MyArch = "arm";
5564 break;
5565 case llvm::Triple::x86:
5566 MyArch = "i386";
5567 break;
5568 case llvm::Triple::x86_64:
5569 MyArch = "amd64";
5570 break;
5571 default:
5572 llvm_unreachable("Unsupported architecture");
5573 }
5574 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00005575 }
5576
5577 if (!Args.hasArg(options::OPT_nostdlib) &&
5578 !Args.hasArg(options::OPT_nostartfiles)) {
5579 if (!Args.hasArg(options::OPT_shared))
5580 CmdArgs.push_back(Args.MakeArgString(
5581 getToolChain().GetFilePath("crtend.o")));
5582 else
5583 CmdArgs.push_back(Args.MakeArgString(
5584 getToolChain().GetFilePath("crtendS.o")));
5585 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005586
5587 const char *Exec =
5588 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5589 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005590}
5591
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005592void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005593 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005594 const InputInfoList &Inputs,
5595 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005596 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005597 ArgStringList CmdArgs;
5598
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005599 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5600 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005601 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005602 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005603 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005604 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005605 else if (getToolChain().getArch() == llvm::Triple::mips ||
5606 getToolChain().getArch() == llvm::Triple::mipsel ||
5607 getToolChain().getArch() == llvm::Triple::mips64 ||
5608 getToolChain().getArch() == llvm::Triple::mips64el) {
5609 StringRef CPUName;
5610 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005611 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005612
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005613 CmdArgs.push_back("-march");
5614 CmdArgs.push_back(CPUName.data());
5615
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005616 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005617 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005618
5619 if (getToolChain().getArch() == llvm::Triple::mips ||
5620 getToolChain().getArch() == llvm::Triple::mips64)
5621 CmdArgs.push_back("-EB");
5622 else
5623 CmdArgs.push_back("-EL");
5624
5625 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5626 options::OPT_fpic, options::OPT_fno_pic,
5627 options::OPT_fPIE, options::OPT_fno_PIE,
5628 options::OPT_fpie, options::OPT_fno_pie);
5629 if (LastPICArg &&
5630 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5631 LastPICArg->getOption().matches(options::OPT_fpic) ||
5632 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5633 LastPICArg->getOption().matches(options::OPT_fpie))) {
5634 CmdArgs.push_back("-KPIC");
5635 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005636 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5637 getToolChain().getArch() == llvm::Triple::thumb) {
5638 CmdArgs.push_back("-mfpu=softvfp");
5639 switch(getToolChain().getTriple().getEnvironment()) {
5640 case llvm::Triple::GNUEABI:
5641 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00005642 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005643 break;
5644
5645 default:
5646 CmdArgs.push_back("-matpcs");
5647 }
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005648 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005649
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005650 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5651 options::OPT_Xassembler);
5652
5653 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005654 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005655
5656 for (InputInfoList::const_iterator
5657 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5658 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005659 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005660 }
5661
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005662 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005663 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005664 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005665}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005666
5667void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005668 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005669 const InputInfoList &Inputs,
5670 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005671 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005672 const toolchains::FreeBSD& ToolChain =
5673 static_cast<const toolchains::FreeBSD&>(getToolChain());
5674 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005675 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005676
5677 // Silence warning for "clang -g foo.o -o foo"
5678 Args.ClaimAllArgs(options::OPT_g_Group);
5679 // and "clang -emit-llvm foo.o -o foo"
5680 Args.ClaimAllArgs(options::OPT_emit_llvm);
5681 // and for "clang -w foo.o -o foo". Other warning options are already
5682 // handled somewhere else.
5683 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005684
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005685 if (!D.SysRoot.empty())
5686 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5687
Roman Divackyafe2f232012-08-28 15:09:03 +00005688 if (Args.hasArg(options::OPT_pie))
5689 CmdArgs.push_back("-pie");
5690
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005691 if (Args.hasArg(options::OPT_static)) {
5692 CmdArgs.push_back("-Bstatic");
5693 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005694 if (Args.hasArg(options::OPT_rdynamic))
5695 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005696 CmdArgs.push_back("--eh-frame-hdr");
5697 if (Args.hasArg(options::OPT_shared)) {
5698 CmdArgs.push_back("-Bshareable");
5699 } else {
5700 CmdArgs.push_back("-dynamic-linker");
5701 CmdArgs.push_back("/libexec/ld-elf.so.1");
5702 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005703 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5704 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005705 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5706 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5707 CmdArgs.push_back("--hash-style=both");
5708 }
5709 }
5710 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005711 }
5712
5713 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5714 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005715 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005716 CmdArgs.push_back("-m");
5717 CmdArgs.push_back("elf_i386_fbsd");
5718 }
5719
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005720 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005721 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005722 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005723 }
5724
Daniel Dunbarb440f562010-08-02 02:38:21 +00005725 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005726 CmdArgs.push_back("-o");
5727 CmdArgs.push_back(Output.getFilename());
5728 } else {
5729 assert(Output.isNothing() && "Invalid output.");
5730 }
5731
5732 if (!Args.hasArg(options::OPT_nostdlib) &&
5733 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005734 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005735 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005736 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005737 crt1 = "gcrt1.o";
5738 else if (Args.hasArg(options::OPT_pie))
5739 crt1 = "Scrt1.o";
5740 else
5741 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005742 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005743 if (crt1)
5744 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5745
5746 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5747
5748 const char *crtbegin = NULL;
5749 if (Args.hasArg(options::OPT_static))
5750 crtbegin = "crtbeginT.o";
5751 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5752 crtbegin = "crtbeginS.o";
5753 else
5754 crtbegin = "crtbegin.o";
5755
5756 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005757 }
5758
5759 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005760 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005761 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5762 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005763 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005764 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5765 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005766 Args.AddAllArgs(CmdArgs, options::OPT_s);
5767 Args.AddAllArgs(CmdArgs, options::OPT_t);
5768 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5769 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005770
Roman Divackyafe2f232012-08-28 15:09:03 +00005771 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005772
5773 if (!Args.hasArg(options::OPT_nostdlib) &&
5774 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005775 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005776 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005777 if (Args.hasArg(options::OPT_pg))
5778 CmdArgs.push_back("-lm_p");
5779 else
5780 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005781 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005782 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5783 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005784 if (Args.hasArg(options::OPT_pg))
5785 CmdArgs.push_back("-lgcc_p");
5786 else
5787 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005788 if (Args.hasArg(options::OPT_static)) {
5789 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005790 } else if (Args.hasArg(options::OPT_pg)) {
5791 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005792 } else {
5793 CmdArgs.push_back("--as-needed");
5794 CmdArgs.push_back("-lgcc_s");
5795 CmdArgs.push_back("--no-as-needed");
5796 }
5797
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005798 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005799 if (Args.hasArg(options::OPT_pg))
5800 CmdArgs.push_back("-lpthread_p");
5801 else
5802 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005803 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005804
Roman Divacky66f22762011-02-10 16:59:40 +00005805 if (Args.hasArg(options::OPT_pg)) {
5806 if (Args.hasArg(options::OPT_shared))
5807 CmdArgs.push_back("-lc");
5808 else
5809 CmdArgs.push_back("-lc_p");
5810 CmdArgs.push_back("-lgcc_p");
5811 } else {
5812 CmdArgs.push_back("-lc");
5813 CmdArgs.push_back("-lgcc");
5814 }
5815
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005816 if (Args.hasArg(options::OPT_static)) {
5817 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005818 } else if (Args.hasArg(options::OPT_pg)) {
5819 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005820 } else {
5821 CmdArgs.push_back("--as-needed");
5822 CmdArgs.push_back("-lgcc_s");
5823 CmdArgs.push_back("--no-as-needed");
5824 }
5825 }
5826
5827 if (!Args.hasArg(options::OPT_nostdlib) &&
5828 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005829 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005830 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005831 else
5832 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005833 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005834 }
5835
Roman Divackyafe2f232012-08-28 15:09:03 +00005836 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005837
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005838 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005839 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005840 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005841}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005842
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005843void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5844 const InputInfo &Output,
5845 const InputInfoList &Inputs,
5846 const ArgList &Args,
5847 const char *LinkingOutput) const {
5848 ArgStringList CmdArgs;
5849
5850 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5851 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005852 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005853 CmdArgs.push_back("--32");
5854
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005855 // Set byte order explicitly
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005856 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005857 CmdArgs.push_back("-EB");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005858 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005859 CmdArgs.push_back("-EL");
5860
5861 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5862 options::OPT_Xassembler);
5863
5864 CmdArgs.push_back("-o");
5865 CmdArgs.push_back(Output.getFilename());
5866
5867 for (InputInfoList::const_iterator
5868 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5869 const InputInfo &II = *it;
5870 CmdArgs.push_back(II.getFilename());
5871 }
5872
David Chisnallddbd68f2011-09-27 22:03:18 +00005873 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005874 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5875}
5876
5877void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5878 const InputInfo &Output,
5879 const InputInfoList &Inputs,
5880 const ArgList &Args,
5881 const char *LinkingOutput) const {
5882 const Driver &D = getToolChain().getDriver();
5883 ArgStringList CmdArgs;
5884
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005885 if (!D.SysRoot.empty())
5886 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5887
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005888 if (Args.hasArg(options::OPT_static)) {
5889 CmdArgs.push_back("-Bstatic");
5890 } else {
5891 if (Args.hasArg(options::OPT_rdynamic))
5892 CmdArgs.push_back("-export-dynamic");
5893 CmdArgs.push_back("--eh-frame-hdr");
5894 if (Args.hasArg(options::OPT_shared)) {
5895 CmdArgs.push_back("-Bshareable");
5896 } else {
5897 CmdArgs.push_back("-dynamic-linker");
5898 CmdArgs.push_back("/libexec/ld.elf_so");
5899 }
5900 }
5901
5902 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5903 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005904 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005905 CmdArgs.push_back("-m");
5906 CmdArgs.push_back("elf_i386");
5907 }
5908
5909 if (Output.isFilename()) {
5910 CmdArgs.push_back("-o");
5911 CmdArgs.push_back(Output.getFilename());
5912 } else {
5913 assert(Output.isNothing() && "Invalid output.");
5914 }
5915
5916 if (!Args.hasArg(options::OPT_nostdlib) &&
5917 !Args.hasArg(options::OPT_nostartfiles)) {
5918 if (!Args.hasArg(options::OPT_shared)) {
5919 CmdArgs.push_back(Args.MakeArgString(
5920 getToolChain().GetFilePath("crt0.o")));
5921 CmdArgs.push_back(Args.MakeArgString(
5922 getToolChain().GetFilePath("crti.o")));
5923 CmdArgs.push_back(Args.MakeArgString(
5924 getToolChain().GetFilePath("crtbegin.o")));
5925 } else {
5926 CmdArgs.push_back(Args.MakeArgString(
5927 getToolChain().GetFilePath("crti.o")));
5928 CmdArgs.push_back(Args.MakeArgString(
5929 getToolChain().GetFilePath("crtbeginS.o")));
5930 }
5931 }
5932
5933 Args.AddAllArgs(CmdArgs, options::OPT_L);
5934 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5935 Args.AddAllArgs(CmdArgs, options::OPT_e);
5936 Args.AddAllArgs(CmdArgs, options::OPT_s);
5937 Args.AddAllArgs(CmdArgs, options::OPT_t);
5938 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5939 Args.AddAllArgs(CmdArgs, options::OPT_r);
5940
5941 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5942
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00005943 unsigned Major, Minor, Micro;
5944 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
5945 bool useLibgcc = true;
5946 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) {
5947 if (getToolChain().getArch() == llvm::Triple::x86 ||
5948 getToolChain().getArch() == llvm::Triple::x86_64)
5949 useLibgcc = false;
5950 }
5951
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005952 if (!Args.hasArg(options::OPT_nostdlib) &&
5953 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005954 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005955 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5956 CmdArgs.push_back("-lm");
5957 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005958 if (Args.hasArg(options::OPT_pthread))
5959 CmdArgs.push_back("-lpthread");
5960 CmdArgs.push_back("-lc");
5961
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00005962 if (useLibgcc) {
5963 if (Args.hasArg(options::OPT_static)) {
5964 // libgcc_eh depends on libc, so resolve as much as possible,
5965 // pull in any new requirements from libc and then get the rest
5966 // of libgcc.
5967 CmdArgs.push_back("-lgcc_eh");
5968 CmdArgs.push_back("-lc");
5969 CmdArgs.push_back("-lgcc");
5970 } else {
5971 CmdArgs.push_back("-lgcc");
5972 CmdArgs.push_back("--as-needed");
5973 CmdArgs.push_back("-lgcc_s");
5974 CmdArgs.push_back("--no-as-needed");
5975 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005976 }
5977 }
5978
5979 if (!Args.hasArg(options::OPT_nostdlib) &&
5980 !Args.hasArg(options::OPT_nostartfiles)) {
5981 if (!Args.hasArg(options::OPT_shared))
5982 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5983 "crtend.o")));
5984 else
5985 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5986 "crtendS.o")));
5987 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5988 "crtn.o")));
5989 }
5990
Bill Wendling08760582011-06-27 19:15:03 +00005991 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005992
David Chisnallddbd68f2011-09-27 22:03:18 +00005993 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005994 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5995}
5996
Thomas Schwinge4e555262013-03-28 19:04:25 +00005997void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5998 const InputInfo &Output,
5999 const InputInfoList &Inputs,
6000 const ArgList &Args,
6001 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00006002 ArgStringList CmdArgs;
6003
6004 // Add --32/--64 to make sure we get the format we want.
6005 // This is incomplete
6006 if (getToolChain().getArch() == llvm::Triple::x86) {
6007 CmdArgs.push_back("--32");
6008 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
6009 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00006010 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
6011 CmdArgs.push_back("-a32");
6012 CmdArgs.push_back("-mppc");
6013 CmdArgs.push_back("-many");
6014 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
6015 CmdArgs.push_back("-a64");
6016 CmdArgs.push_back("-mppc64");
6017 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00006018 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
6019 CmdArgs.push_back("-a64");
6020 CmdArgs.push_back("-mppc64le");
6021 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00006022 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006023 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00006024 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
6025 CmdArgs.push_back("-mfpu=neon");
Bernard Ogdena58ef052013-10-24 18:32:41 +00006026 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a")
6027 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006028
6029 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
6030 getToolChain().getTriple());
6031 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006032
6033 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
6034 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
6035 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006036 } else if (getToolChain().getArch() == llvm::Triple::mips ||
6037 getToolChain().getArch() == llvm::Triple::mipsel ||
6038 getToolChain().getArch() == llvm::Triple::mips64 ||
6039 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006040 StringRef CPUName;
6041 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006042 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006043
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006044 CmdArgs.push_back("-march");
6045 CmdArgs.push_back(CPUName.data());
6046
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006047 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006048 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00006049
6050 if (getToolChain().getArch() == llvm::Triple::mips ||
6051 getToolChain().getArch() == llvm::Triple::mips64)
6052 CmdArgs.push_back("-EB");
6053 else
6054 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006055
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006056 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6057 if (StringRef(A->getValue()) == "2008")
6058 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6059 }
6060
Simon Atanasyan036d16d2013-04-30 07:47:13 +00006061 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6062 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6063 options::OPT_mno_micromips);
6064 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6065 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6066
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006067 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6068 options::OPT_fpic, options::OPT_fno_pic,
6069 options::OPT_fPIE, options::OPT_fno_PIE,
6070 options::OPT_fpie, options::OPT_fno_pie);
6071 if (LastPICArg &&
6072 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6073 LastPICArg->getOption().matches(options::OPT_fpic) ||
6074 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6075 LastPICArg->getOption().matches(options::OPT_fpie))) {
6076 CmdArgs.push_back("-KPIC");
6077 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006078 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
Richard Sandiford4652d892013-07-19 16:51:51 +00006079 // Always pass an -march option, since our default of z10 is later
6080 // than the GNU assembler's default.
6081 StringRef CPUName = getSystemZTargetCPU(Args);
6082 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Rafael Espindola92b00932010-08-10 00:25:48 +00006083 }
6084
6085 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6086 options::OPT_Xassembler);
6087
6088 CmdArgs.push_back("-o");
6089 CmdArgs.push_back(Output.getFilename());
6090
6091 for (InputInfoList::const_iterator
6092 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6093 const InputInfo &II = *it;
6094 CmdArgs.push_back(II.getFilename());
6095 }
6096
6097 const char *Exec =
6098 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6099 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00006100
6101 // Handle the debug info splitting at object creation time if we're
6102 // creating an object.
6103 // TODO: Currently only works on linux with newer objcopy.
6104 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006105 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00006106 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6107 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00006108}
6109
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006110static void AddLibgcc(llvm::Triple Triple, const Driver &D,
6111 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00006112 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00006113 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6114 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00006115 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006116 CmdArgs.push_back("-lgcc");
6117
Logan Chien3d3373c2012-11-19 12:04:11 +00006118 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006119 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006120 CmdArgs.push_back("-lgcc");
6121 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00006122 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006123 CmdArgs.push_back("--as-needed");
6124 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00006125 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006126 CmdArgs.push_back("--no-as-needed");
6127 }
6128
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006129 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00006130 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00006131 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006132 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00006133
6134 // According to Android ABI, we have to link with libdl if we are
6135 // linking with non-static libgcc.
6136 //
6137 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6138 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6139 if (isAndroid && !StaticLibgcc)
6140 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00006141}
6142
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006143static bool hasMipsN32ABIArg(const ArgList &Args) {
6144 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smithbd55daf2012-11-01 04:30:05 +00006145 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006146}
6147
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006148static StringRef getLinuxDynamicLinker(const ArgList &Args,
6149 const toolchains::Linux &ToolChain) {
6150 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android)
6151 return "/system/bin/linker";
6152 else if (ToolChain.getArch() == llvm::Triple::x86)
6153 return "/lib/ld-linux.so.2";
6154 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6155 return "/lib/ld-linux-aarch64.so.1";
6156 else if (ToolChain.getArch() == llvm::Triple::arm ||
6157 ToolChain.getArch() == llvm::Triple::thumb) {
6158 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6159 return "/lib/ld-linux-armhf.so.3";
6160 else
6161 return "/lib/ld-linux.so.3";
6162 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6163 ToolChain.getArch() == llvm::Triple::mipsel)
6164 return "/lib/ld.so.1";
6165 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6166 ToolChain.getArch() == llvm::Triple::mips64el) {
6167 if (hasMipsN32ABIArg(Args))
6168 return "/lib32/ld.so.1";
6169 else
6170 return "/lib64/ld.so.1";
6171 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6172 return "/lib/ld.so.1";
6173 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
Bill Schmidt778d3872013-07-26 01:36:11 +00006174 ToolChain.getArch() == llvm::Triple::ppc64le ||
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006175 ToolChain.getArch() == llvm::Triple::systemz)
6176 return "/lib64/ld64.so.1";
6177 else
6178 return "/lib64/ld-linux-x86-64.so.2";
6179}
6180
Thomas Schwinge4e555262013-03-28 19:04:25 +00006181void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6182 const InputInfo &Output,
6183 const InputInfoList &Inputs,
6184 const ArgList &Args,
6185 const char *LinkingOutput) const {
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006186 const toolchains::Linux& ToolChain =
6187 static_cast<const toolchains::Linux&>(getToolChain());
6188 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00006189 const bool isAndroid =
6190 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne32701642013-11-01 18:16:25 +00006191 const SanitizerArgs &Sanitize = ToolChain.getSanitizerArgs();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006192 const bool IsPIE =
6193 !Args.hasArg(options::OPT_shared) &&
Peter Collingbourne32701642013-11-01 18:16:25 +00006194 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006195
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006196 ArgStringList CmdArgs;
6197
Rafael Espindolad1002f62010-11-15 18:28:16 +00006198 // Silence warning for "clang -g foo.o -o foo"
6199 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006200 // and "clang -emit-llvm foo.o -o foo"
6201 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00006202 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00006203 // handled somewhere else.
6204 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00006205
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006206 if (!D.SysRoot.empty())
6207 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006208
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006209 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00006210 CmdArgs.push_back("-pie");
6211
Rafael Espindola1c76c592010-11-07 22:57:16 +00006212 if (Args.hasArg(options::OPT_rdynamic))
6213 CmdArgs.push_back("-export-dynamic");
6214
Rafael Espindola34d77dc2010-11-11 19:34:42 +00006215 if (Args.hasArg(options::OPT_s))
6216 CmdArgs.push_back("-s");
6217
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006218 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6219 e = ToolChain.ExtraOpts.end();
6220 i != e; ++i)
6221 CmdArgs.push_back(i->c_str());
6222
6223 if (!Args.hasArg(options::OPT_static)) {
6224 CmdArgs.push_back("--eh-frame-hdr");
6225 }
6226
6227 CmdArgs.push_back("-m");
6228 if (ToolChain.getArch() == llvm::Triple::x86)
6229 CmdArgs.push_back("elf_i386");
Tim Northover9bb857a2013-01-31 12:13:10 +00006230 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6231 CmdArgs.push_back("aarch64linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00006232 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00006233 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006234 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00006235 else if (ToolChain.getArch() == llvm::Triple::ppc)
6236 CmdArgs.push_back("elf32ppclinux");
6237 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6238 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00006239 else if (ToolChain.getArch() == llvm::Triple::mips)
6240 CmdArgs.push_back("elf32btsmip");
6241 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6242 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006243 else if (ToolChain.getArch() == llvm::Triple::mips64) {
6244 if (hasMipsN32ABIArg(Args))
6245 CmdArgs.push_back("elf32btsmipn32");
6246 else
6247 CmdArgs.push_back("elf64btsmip");
6248 }
6249 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
6250 if (hasMipsN32ABIArg(Args))
6251 CmdArgs.push_back("elf32ltsmipn32");
6252 else
6253 CmdArgs.push_back("elf64ltsmip");
6254 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006255 else if (ToolChain.getArch() == llvm::Triple::systemz)
6256 CmdArgs.push_back("elf64_s390");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006257 else
6258 CmdArgs.push_back("elf_x86_64");
6259
6260 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00006261 if (ToolChain.getArch() == llvm::Triple::arm
6262 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006263 CmdArgs.push_back("-Bstatic");
6264 else
6265 CmdArgs.push_back("-static");
6266 } else if (Args.hasArg(options::OPT_shared)) {
6267 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00006268 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006269 CmdArgs.push_back("-Bsymbolic");
6270 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006271 }
6272
6273 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00006274 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006275 (!Args.hasArg(options::OPT_static) &&
6276 !Args.hasArg(options::OPT_shared))) {
6277 CmdArgs.push_back("-dynamic-linker");
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006278 CmdArgs.push_back(Args.MakeArgString(
6279 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006280 }
6281
6282 CmdArgs.push_back("-o");
6283 CmdArgs.push_back(Output.getFilename());
6284
Rafael Espindola81937ec2010-12-01 01:52:43 +00006285 if (!Args.hasArg(options::OPT_nostdlib) &&
6286 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006287 if (!isAndroid) {
6288 const char *crt1 = NULL;
6289 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00006290 if (Args.hasArg(options::OPT_pg))
6291 crt1 = "gcrt1.o";
6292 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006293 crt1 = "Scrt1.o";
6294 else
6295 crt1 = "crt1.o";
6296 }
6297 if (crt1)
6298 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006299
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006300 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6301 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006302
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006303 const char *crtbegin;
6304 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006305 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006306 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006307 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006308 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006309 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006310 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006311 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006312 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00006313
6314 // Add crtfastmath.o if available and fast math is enabled.
6315 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006316 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006317
6318 Args.AddAllArgs(CmdArgs, options::OPT_L);
6319
6320 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6321
Roman Divackyee8188a2011-03-01 17:53:14 +00006322 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6323 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006324 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006325
Rafael Espindola9446d762012-04-09 23:53:34 +00006326 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
6327 // as gold requires -plugin to come before any -plugin-opt that -Wl might
6328 // forward.
Rafael Espindolab0092d72013-09-04 19:37:35 +00006329 if (D.IsUsingLTO(Args)) {
Rafael Espindola9446d762012-04-09 23:53:34 +00006330 CmdArgs.push_back("-plugin");
6331 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
6332 CmdArgs.push_back(Args.MakeArgString(Plugin));
Chandler Carruth953fb082013-01-13 11:46:33 +00006333
6334 // Try to pass driver level flags relevant to LTO code generation down to
6335 // the plugin.
6336
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006337 // Handle flags for selecting CPU variants.
6338 std::string CPU = getCPUName(Args, ToolChain.getTriple());
6339 if (!CPU.empty()) {
Chandler Carruth953fb082013-01-13 11:46:33 +00006340 CmdArgs.push_back(
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006341 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6342 CPU));
6343 }
Rafael Espindola9446d762012-04-09 23:53:34 +00006344 }
6345
Chandler Carruth953fb082013-01-13 11:46:33 +00006346
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00006347 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6348 CmdArgs.push_back("--no-demangle");
6349
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006350 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6351
Eric Christopher04997782012-11-29 18:51:05 +00006352 // Call these before we add the C++ ABI library.
Richard Smith52be6192012-11-05 22:04:41 +00006353 if (Sanitize.needsUbsanRt())
Hans Wennborg70850d82013-07-18 20:29:38 +00006354 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX(),
Richard Smithcff3cde2013-03-20 23:49:07 +00006355 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006356 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
Eric Christopher04997782012-11-29 18:51:05 +00006357 if (Sanitize.needsAsanRt())
6358 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6359 if (Sanitize.needsTsanRt())
6360 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00006361 if (Sanitize.needsMsanRt())
6362 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006363 if (Sanitize.needsLsanRt())
6364 addLsanRTLinux(getToolChain(), Args, CmdArgs);
Peter Collingbournec3772752013-08-07 22:47:34 +00006365 if (Sanitize.needsDfsanRt())
6366 addDfsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith4d3110a2012-10-25 02:14:12 +00006367
Chandler Carruthe4458b32013-06-24 09:38:45 +00006368 // The profile runtime also needs access to system libraries.
6369 addProfileRTLinux(getToolChain(), Args, CmdArgs);
6370
Hans Wennborg70850d82013-07-18 20:29:38 +00006371 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00006372 !Args.hasArg(options::OPT_nostdlib) &&
6373 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00006374 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6375 !Args.hasArg(options::OPT_static);
6376 if (OnlyLibstdcxxStatic)
6377 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006378 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00006379 if (OnlyLibstdcxxStatic)
6380 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006381 CmdArgs.push_back("-lm");
6382 }
6383
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006384 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00006385 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6386 if (Args.hasArg(options::OPT_static))
6387 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00006388
Chandler Carruth01538002013-01-17 13:19:29 +00006389 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6390 if (OpenMP) {
6391 CmdArgs.push_back("-lgomp");
6392
6393 // FIXME: Exclude this for platforms whith libgomp that doesn't require
6394 // librt. Most modern Linux platfroms require it, but some may not.
6395 CmdArgs.push_back("-lrt");
6396 }
6397
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006398 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006399
Chandler Carruth94a32012012-05-14 18:31:18 +00006400 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruth01538002013-01-17 13:19:29 +00006401 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth94a32012012-05-14 18:31:18 +00006402 CmdArgs.push_back("-lpthread");
6403
6404 CmdArgs.push_back("-lc");
6405
6406 if (Args.hasArg(options::OPT_static))
6407 CmdArgs.push_back("--end-group");
6408 else
6409 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6410 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00006411
Rafael Espindola81937ec2010-12-01 01:52:43 +00006412 if (!Args.hasArg(options::OPT_nostartfiles)) {
6413 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006414 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006415 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006416 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006417 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00006418 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006419 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006420
Rafael Espindola81937ec2010-12-01 01:52:43 +00006421 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006422 if (!isAndroid)
6423 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00006424 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006425 }
6426
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006427 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6428}
Rafael Espindola92b00932010-08-10 00:25:48 +00006429
Chris Lattner3e2ee142010-07-07 16:01:42 +00006430void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006431 const InputInfo &Output,
6432 const InputInfoList &Inputs,
6433 const ArgList &Args,
6434 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006435 ArgStringList CmdArgs;
6436
6437 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6438 options::OPT_Xassembler);
6439
6440 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006441 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006442
6443 for (InputInfoList::const_iterator
6444 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6445 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006446 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006447 }
6448
6449 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00006450 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006451 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006452}
6453
6454void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006455 const InputInfo &Output,
6456 const InputInfoList &Inputs,
6457 const ArgList &Args,
6458 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006459 const Driver &D = getToolChain().getDriver();
6460 ArgStringList CmdArgs;
6461
Daniel Dunbarb440f562010-08-02 02:38:21 +00006462 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006463 CmdArgs.push_back("-o");
6464 CmdArgs.push_back(Output.getFilename());
6465 } else {
6466 assert(Output.isNothing() && "Invalid output.");
6467 }
6468
6469 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00006470 !Args.hasArg(options::OPT_nostartfiles)) {
6471 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6472 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6473 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6474 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6475 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006476
6477 Args.AddAllArgs(CmdArgs, options::OPT_L);
6478 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6479 Args.AddAllArgs(CmdArgs, options::OPT_e);
6480
Daniel Dunbar54423b22010-09-17 00:24:54 +00006481 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006482
Eli Friedman83de5132011-12-08 23:54:21 +00006483 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6484
Chris Lattner3e2ee142010-07-07 16:01:42 +00006485 if (!Args.hasArg(options::OPT_nostdlib) &&
6486 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006487 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006488 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006489 CmdArgs.push_back("-lm");
6490 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006491 }
6492
6493 if (!Args.hasArg(options::OPT_nostdlib) &&
6494 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00006495 if (Args.hasArg(options::OPT_pthread))
6496 CmdArgs.push_back("-lpthread");
6497 CmdArgs.push_back("-lc");
6498 CmdArgs.push_back("-lCompilerRT-Generic");
6499 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6500 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00006501 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006502 }
6503
Eli Friedman83de5132011-12-08 23:54:21 +00006504 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006505 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006506}
6507
Daniel Dunbarcc912342009-05-02 18:28:39 +00006508/// DragonFly Tools
6509
6510// For now, DragonFly Assemble does just about the same as for
6511// FreeBSD, but this may change soon.
6512void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006513 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006514 const InputInfoList &Inputs,
6515 const ArgList &Args,
6516 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006517 ArgStringList CmdArgs;
6518
6519 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6520 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006521 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00006522 CmdArgs.push_back("--32");
6523
6524 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6525 options::OPT_Xassembler);
6526
6527 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006528 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006529
6530 for (InputInfoList::const_iterator
6531 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6532 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006533 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006534 }
6535
6536 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006537 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006538 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006539}
6540
6541void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006542 const InputInfo &Output,
6543 const InputInfoList &Inputs,
6544 const ArgList &Args,
6545 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00006546 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00006547 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00006548 ArgStringList CmdArgs;
6549
John McCall65b8da02013-04-11 22:55:55 +00006550 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6551 UseGCC47 = false;
6552
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006553 if (!D.SysRoot.empty())
6554 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6555
John McCall65b8da02013-04-11 22:55:55 +00006556 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006557 if (Args.hasArg(options::OPT_static)) {
6558 CmdArgs.push_back("-Bstatic");
6559 } else {
John McCall65b8da02013-04-11 22:55:55 +00006560 if (Args.hasArg(options::OPT_rdynamic))
6561 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006562 if (Args.hasArg(options::OPT_shared))
6563 CmdArgs.push_back("-Bshareable");
6564 else {
6565 CmdArgs.push_back("-dynamic-linker");
6566 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6567 }
John McCall65b8da02013-04-11 22:55:55 +00006568 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006569 }
6570
6571 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6572 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006573 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006574 CmdArgs.push_back("-m");
6575 CmdArgs.push_back("elf_i386");
6576 }
6577
Daniel Dunbarb440f562010-08-02 02:38:21 +00006578 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006579 CmdArgs.push_back("-o");
6580 CmdArgs.push_back(Output.getFilename());
6581 } else {
6582 assert(Output.isNothing() && "Invalid output.");
6583 }
6584
6585 if (!Args.hasArg(options::OPT_nostdlib) &&
6586 !Args.hasArg(options::OPT_nostartfiles)) {
6587 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00006588 if (Args.hasArg(options::OPT_pg))
6589 CmdArgs.push_back(Args.MakeArgString(
6590 getToolChain().GetFilePath("gcrt1.o")));
6591 else {
6592 if (Args.hasArg(options::OPT_pie))
6593 CmdArgs.push_back(Args.MakeArgString(
6594 getToolChain().GetFilePath("Scrt1.o")));
6595 else
6596 CmdArgs.push_back(Args.MakeArgString(
6597 getToolChain().GetFilePath("crt1.o")));
6598 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006599 }
John McCall65b8da02013-04-11 22:55:55 +00006600 CmdArgs.push_back(Args.MakeArgString(
6601 getToolChain().GetFilePath("crti.o")));
6602 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6603 CmdArgs.push_back(Args.MakeArgString(
6604 getToolChain().GetFilePath("crtbeginS.o")));
6605 else
6606 CmdArgs.push_back(Args.MakeArgString(
6607 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006608 }
6609
6610 Args.AddAllArgs(CmdArgs, options::OPT_L);
6611 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6612 Args.AddAllArgs(CmdArgs, options::OPT_e);
6613
Daniel Dunbar54423b22010-09-17 00:24:54 +00006614 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006615
6616 if (!Args.hasArg(options::OPT_nostdlib) &&
6617 !Args.hasArg(options::OPT_nodefaultlibs)) {
6618 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6619 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00006620 if (UseGCC47)
6621 CmdArgs.push_back("-L/usr/lib/gcc47");
6622 else
6623 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006624
6625 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00006626 if (UseGCC47) {
6627 CmdArgs.push_back("-rpath");
6628 CmdArgs.push_back("/usr/lib/gcc47");
6629 } else {
6630 CmdArgs.push_back("-rpath");
6631 CmdArgs.push_back("/usr/lib/gcc44");
6632 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006633 }
6634
Hans Wennborg70850d82013-07-18 20:29:38 +00006635 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006636 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006637 CmdArgs.push_back("-lm");
6638 }
6639
Daniel Dunbarcc912342009-05-02 18:28:39 +00006640 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006641 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006642
6643 if (!Args.hasArg(options::OPT_nolibc)) {
6644 CmdArgs.push_back("-lc");
6645 }
6646
John McCall65b8da02013-04-11 22:55:55 +00006647 if (UseGCC47) {
6648 if (Args.hasArg(options::OPT_static) ||
6649 Args.hasArg(options::OPT_static_libgcc)) {
6650 CmdArgs.push_back("-lgcc");
6651 CmdArgs.push_back("-lgcc_eh");
6652 } else {
6653 if (Args.hasArg(options::OPT_shared_libgcc)) {
6654 CmdArgs.push_back("-lgcc_pic");
6655 if (!Args.hasArg(options::OPT_shared))
6656 CmdArgs.push_back("-lgcc");
6657 } else {
6658 CmdArgs.push_back("-lgcc");
6659 CmdArgs.push_back("--as-needed");
6660 CmdArgs.push_back("-lgcc_pic");
6661 CmdArgs.push_back("--no-as-needed");
6662 }
6663 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006664 } else {
John McCall65b8da02013-04-11 22:55:55 +00006665 if (Args.hasArg(options::OPT_shared)) {
6666 CmdArgs.push_back("-lgcc_pic");
6667 } else {
6668 CmdArgs.push_back("-lgcc");
6669 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006670 }
6671 }
6672
6673 if (!Args.hasArg(options::OPT_nostdlib) &&
6674 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00006675 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006676 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006677 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00006678 else
6679 CmdArgs.push_back(Args.MakeArgString(
6680 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006681 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00006682 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006683 }
6684
Bill Wendling08760582011-06-27 19:15:03 +00006685 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006686
Daniel Dunbarcc912342009-05-02 18:28:39 +00006687 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006688 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006689 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006690}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006691
6692void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6693 const InputInfo &Output,
6694 const InputInfoList &Inputs,
6695 const ArgList &Args,
6696 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006697 ArgStringList CmdArgs;
6698
6699 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006700 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6701 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006702 } else {
6703 assert(Output.isNothing() && "Invalid output.");
6704 }
6705
6706 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg32e3b722013-08-09 17:38:42 +00006707 !Args.hasArg(options::OPT_nostartfiles) &&
6708 !C.getDriver().IsCLMode()) {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006709 CmdArgs.push_back("-defaultlib:libcmt");
6710 }
6711
6712 CmdArgs.push_back("-nologo");
6713
Hans Wennborgf1a74252013-09-10 20:18:04 +00006714 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
6715
6716 if (DLL) {
6717 CmdArgs.push_back(Args.MakeArgString("-dll"));
6718
6719 SmallString<128> ImplibName(Output.getFilename());
6720 llvm::sys::path::replace_extension(ImplibName, "lib");
6721 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
6722 ImplibName.str()));
6723 }
6724
Peter Collingbourne32701642013-11-01 18:16:25 +00006725 if (getToolChain().getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00006726 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00006727 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborg65f17522013-08-27 18:10:21 +00006728 SmallString<128> LibSanitizer(getToolChain().getDriver().ResourceDir);
Hans Wennborgf1a74252013-09-10 20:18:04 +00006729 llvm::sys::path::append(LibSanitizer, "lib", "windows");
6730 if (DLL) {
Timur Iskhodzhanov3b6adcb62013-09-11 11:45:31 +00006731 llvm::sys::path::append(LibSanitizer, "clang_rt.asan_dll_thunk-i386.lib");
Hans Wennborgf1a74252013-09-10 20:18:04 +00006732 } else {
6733 llvm::sys::path::append(LibSanitizer, "clang_rt.asan-i386.lib");
6734 }
6735 // FIXME: Handle 64-bit.
Hans Wennborg65f17522013-08-27 18:10:21 +00006736 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
6737 }
6738
Michael J. Spencere2f49362012-06-18 16:56:04 +00006739 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg2e274592013-08-13 23:38:57 +00006740 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00006741
6742 // Add filenames immediately.
6743 for (InputInfoList::const_iterator
6744 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6745 if (it->isFilename())
6746 CmdArgs.push_back(it->getFilename());
Hans Wennborgbe4a6762013-08-14 01:24:35 +00006747 else
6748 it->getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencere2f49362012-06-18 16:56:04 +00006749 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006750
6751 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006752 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006753 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6754}
Hans Wennborg87cfa712013-09-19 20:32:16 +00006755
6756void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
6757 const InputInfo &Output,
6758 const InputInfoList &Inputs,
6759 const ArgList &Args,
6760 const char *LinkingOutput) const {
6761 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
6762}
6763
Hans Wennborg188382e2013-09-20 18:16:35 +00006764// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
6765// If one cannot be found, return FallbackName.
6766// We do this special search to prevent clang-cl from falling back onto itself
6767// if it's available as cl.exe on the path.
6768static std::string FindFallback(const char *FallbackName,
6769 const char *ClangProgramPath) {
6770 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
6771 if (!OptPath.hasValue())
6772 return FallbackName;
6773
6774#ifdef LLVM_ON_WIN32
6775 const StringRef PathSeparators = ";";
6776#else
6777 const StringRef PathSeparators = ":";
6778#endif
6779
6780 SmallVector<StringRef, 8> PathSegments;
6781 llvm::SplitString(OptPath.getValue(), PathSegments, PathSeparators);
6782
6783 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
6784 const StringRef &PathSegment = PathSegments[i];
6785 if (PathSegment.empty())
6786 continue;
6787
6788 SmallString<128> FilePath(PathSegment);
6789 llvm::sys::path::append(FilePath, FallbackName);
6790 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
6791 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
6792 return FilePath.str();
6793 }
6794
6795 return FallbackName;
6796}
6797
Hans Wennborg87cfa712013-09-19 20:32:16 +00006798Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
6799 const InputInfo &Output,
6800 const InputInfoList &Inputs,
6801 const ArgList &Args,
6802 const char *LinkingOutput) const {
6803 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00006804 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00006805 CmdArgs.push_back("/c"); // Compile only.
6806 CmdArgs.push_back("/W0"); // No warnings.
6807
6808 // The goal is to be able to invoke this tool correctly based on
6809 // any flag accepted by clang-cl.
6810
6811 // These are spelled the same way in clang and cl.exe,.
6812 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
6813 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00006814
6815 // Optimization level.
6816 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
6817 if (A->getOption().getID() == options::OPT_O0) {
6818 CmdArgs.push_back("/Od");
6819 } else {
6820 StringRef OptLevel = A->getValue();
6821 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
6822 A->render(Args, CmdArgs);
6823 else if (OptLevel == "3")
6824 CmdArgs.push_back("/Ox");
6825 }
6826 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00006827
6828 // Flags for which clang-cl have an alias.
6829 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
6830
6831 if (Arg *A = Args.getLastArg(options::OPT_frtti, options::OPT_fno_rtti))
6832 CmdArgs.push_back(A->getOption().getID() == options::OPT_frtti ? "/GR"
6833 : "/GR-");
6834 if (Args.hasArg(options::OPT_fsyntax_only))
6835 CmdArgs.push_back("/Zs");
6836
Hans Wennborg260ff402013-09-27 17:54:18 +00006837 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
6838 for (size_t I = 0, E = Includes.size(); I != E; ++I)
6839 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Includes[I]));
6840
Hans Wennborg87cfa712013-09-19 20:32:16 +00006841 // Flags that can simply be passed through.
6842 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
6843 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
6844
6845 // The order of these flags is relevant, so pick the last one.
6846 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
6847 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
6848 A->render(Args, CmdArgs);
6849
6850
6851 // Input filename.
6852 assert(Inputs.size() == 1);
6853 const InputInfo &II = Inputs[0];
6854 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
6855 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
6856 if (II.isFilename())
6857 CmdArgs.push_back(II.getFilename());
6858 else
6859 II.getInputArg().renderAsInput(Args, CmdArgs);
6860
6861 // Output filename.
6862 assert(Output.getType() == types::TY_Object);
6863 const char *Fo = Args.MakeArgString(std::string("/Fo") +
6864 Output.getFilename());
6865 CmdArgs.push_back(Fo);
6866
Hans Wennborg188382e2013-09-20 18:16:35 +00006867 const Driver &D = getToolChain().getDriver();
6868 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborg87cfa712013-09-19 20:32:16 +00006869
Hans Wennborg188382e2013-09-20 18:16:35 +00006870 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00006871}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00006872
6873
6874/// XCore Tools
6875// We pass assemble and link construction to the xcc tool.
6876
6877void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6878 const InputInfo &Output,
6879 const InputInfoList &Inputs,
6880 const ArgList &Args,
6881 const char *LinkingOutput) const {
6882 ArgStringList CmdArgs;
6883
6884 CmdArgs.push_back("-o");
6885 CmdArgs.push_back(Output.getFilename());
6886
6887 CmdArgs.push_back("-c");
6888
6889 if (Args.hasArg(options::OPT_g_Group)) {
6890 CmdArgs.push_back("-g");
6891 }
6892
6893 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6894 options::OPT_Xassembler);
6895
6896 for (InputInfoList::const_iterator
6897 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6898 const InputInfo &II = *it;
6899 CmdArgs.push_back(II.getFilename());
6900 }
6901
6902 const char *Exec =
6903 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
6904 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6905}
6906
6907void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
6908 const InputInfo &Output,
6909 const InputInfoList &Inputs,
6910 const ArgList &Args,
6911 const char *LinkingOutput) const {
6912 ArgStringList CmdArgs;
6913
6914 if (Output.isFilename()) {
6915 CmdArgs.push_back("-o");
6916 CmdArgs.push_back(Output.getFilename());
6917 } else {
6918 assert(Output.isNothing() && "Invalid output.");
6919 }
6920
6921 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6922
6923 const char *Exec =
6924 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
6925 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6926}