blob: bb64a035e967e1b595bc62ea665d9df0701dd57f [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
13#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000014#include "clang/Basic/Version.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000015#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000016#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000017#include "clang/Driver/Driver.h"
18#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000019#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000020#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000021#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000022#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000023#include "clang/Driver/Util.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000024#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000025#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000026#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000027#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000028#include "llvm/Option/Arg.h"
29#include "llvm/Option/ArgList.h"
30#include "llvm/Option/Option.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000031#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000032#include "llvm/Support/FileSystem.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000033#include "llvm/Support/Format.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000034#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000035#include "llvm/Support/Path.h"
Rafael Espindola04b3fc42013-06-25 14:29:51 +000036#include "llvm/Support/Program.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000037#include "llvm/Support/Process.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000038#include "llvm/Support/raw_ostream.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000039#include <sys/stat.h>
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000040
Daniel Dunbar1a093d22009-03-18 06:00:36 +000041using namespace clang::driver;
42using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000043using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000044using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000045
Daniel Dunbar64198ef2009-09-10 01:21:05 +000046/// CheckPreprocessingOptions - Perform some validation of preprocessing
47/// arguments that is shared with gcc.
48static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
49 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
Hans Wennborg70850d82013-07-18 20:29:38 +000050 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP())
Chris Lattner0e62c1c2011-07-23 10:55:15 +000051 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar64198ef2009-09-10 01:21:05 +000052 << A->getAsString(Args) << "-E";
53}
54
Daniel Dunbar4eadb602009-09-10 01:21:12 +000055/// CheckCodeGenerationOptions - Perform some validation of code generation
56/// arguments that is shared with gcc.
57static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
58 // In gcc, only ARM checks this, but it seems reasonable to check universally.
59 if (Args.hasArg(options::OPT_static))
60 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
61 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000062 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000063 << A->getAsString(Args) << "-static";
64}
65
Chris Lattnerbf2803f2010-03-29 17:55:58 +000066// Quote target names for inclusion in GNU Make dependency files.
67// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000068static void QuoteTarget(StringRef Target,
69 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +000070 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
71 switch (Target[i]) {
72 case ' ':
73 case '\t':
74 // Escape the preceding backslashes
75 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
76 Res.push_back('\\');
77
78 // Escape the space/tab
79 Res.push_back('\\');
80 break;
81 case '$':
82 Res.push_back('$');
83 break;
84 case '#':
85 Res.push_back('\\');
86 break;
87 default:
88 break;
89 }
90
91 Res.push_back(Target[i]);
92 }
93}
94
Bill Wendlingc0938f32012-03-12 22:10:06 +000095static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +000096 ArgStringList &CmdArgs,
97 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +000098 const char *EnvVar) {
99 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000100 bool CombinedArg = false;
101
Bill Wendling281ca292012-03-12 21:22:35 +0000102 if (!DirList)
103 return; // Nothing to do.
104
Chad Rosier616e8a52012-10-30 21:42:09 +0000105 StringRef Name(ArgName);
106 if (Name.equals("-I") || Name.equals("-L"))
107 CombinedArg = true;
108
Bill Wendling281ca292012-03-12 21:22:35 +0000109 StringRef Dirs(DirList);
110 if (Dirs.empty()) // Empty string should not add '.'.
111 return;
112
113 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000114 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000115 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000116 if (CombinedArg) {
117 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
118 } else {
119 CmdArgs.push_back(ArgName);
120 CmdArgs.push_back(".");
121 }
Bill Wendling281ca292012-03-12 21:22:35 +0000122 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000123 if (CombinedArg) {
124 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
125 } else {
126 CmdArgs.push_back(ArgName);
127 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
128 }
Bill Wendling281ca292012-03-12 21:22:35 +0000129 }
Nico Weber89355782012-03-19 15:00:03 +0000130 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000131 }
132
133 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000134 if (CombinedArg) {
135 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
136 } else {
137 CmdArgs.push_back(ArgName);
138 CmdArgs.push_back(".");
139 }
Bill Wendling281ca292012-03-12 21:22:35 +0000140 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000141 if (CombinedArg) {
142 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
143 } else {
144 CmdArgs.push_back(ArgName);
145 CmdArgs.push_back(Args.MakeArgString(Dirs));
146 }
Bill Wendling281ca292012-03-12 21:22:35 +0000147 }
148}
149
Daniel Dunbar54423b22010-09-17 00:24:54 +0000150static void AddLinkerInputs(const ToolChain &TC,
151 const InputInfoList &Inputs, const ArgList &Args,
152 ArgStringList &CmdArgs) {
153 const Driver &D = TC.getDriver();
154
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000155 // Add extra linker input arguments which are not treated as inputs
156 // (constructed via -Xarch_).
157 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
158
Daniel Dunbar54423b22010-09-17 00:24:54 +0000159 for (InputInfoList::const_iterator
160 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
161 const InputInfo &II = *it;
162
163 if (!TC.HasNativeLLVMSupport()) {
164 // Don't try to pass LLVM inputs unless we have native support.
165 if (II.getType() == types::TY_LLVM_IR ||
166 II.getType() == types::TY_LTO_IR ||
167 II.getType() == types::TY_LLVM_BC ||
168 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000169 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000170 << TC.getTripleString();
171 }
172
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000173 // Add filenames immediately.
174 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000175 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000176 continue;
177 }
178
179 // Otherwise, this is a linker input argument.
180 const Arg &A = II.getInputArg();
181
182 // Handle reserved library options.
183 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000184 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Senafeb03b2010-09-17 18:39:08 +0000185 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
186 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000187 } else
188 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar54423b22010-09-17 00:24:54 +0000189 }
Bill Wendling281ca292012-03-12 21:22:35 +0000190
191 // LIBRARY_PATH - included following the user specified library paths.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000192 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000193}
194
John McCall31168b02011-06-15 23:02:42 +0000195/// \brief Determine whether Objective-C automated reference counting is
196/// enabled.
197static bool isObjCAutoRefCount(const ArgList &Args) {
198 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
199}
200
Ted Kremeneke65b0862012-03-06 20:05:56 +0000201/// \brief Determine whether we are linking the ObjC runtime.
202static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000203 if (isObjCAutoRefCount(Args)) {
204 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000205 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000206 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000207 return Args.hasArg(options::OPT_fobjc_link_runtime);
208}
209
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000210static void addProfileRT(const ToolChain &TC, const ArgList &Args,
Bill Wendling08760582011-06-27 19:15:03 +0000211 ArgStringList &CmdArgs,
212 llvm::Triple Triple) {
213 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
214 Args.hasArg(options::OPT_fprofile_generate) ||
215 Args.hasArg(options::OPT_fcreate_profile) ||
216 Args.hasArg(options::OPT_coverage)))
217 return;
218
219 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
220 // the link line. We cannot do the same thing because unlike gcov there is a
221 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
222 // not supported by old linkers.
Benjamin Kramerf5fbe432011-11-07 16:02:25 +0000223 std::string ProfileRT =
224 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
Bill Wendling08760582011-06-27 19:15:03 +0000225
Bill Wendling08760582011-06-27 19:15:03 +0000226 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000227}
228
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000229static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000230 // Don't forward inputs from the original command line. They are added from
231 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000232 return O.getKind() != Option::InputClass &&
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000233 !O.hasFlag(options::DriverOption) &&
234 !O.hasFlag(options::LinkerInput);
235}
236
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000237void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000238 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000239 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000240 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000241 ArgStringList &CmdArgs,
242 const InputInfo &Output,
243 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000244 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000245
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000246 CheckPreprocessingOptions(D, Args);
247
248 Args.AddLastArg(CmdArgs, options::OPT_C);
249 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000250
251 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000252 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000253 (A = Args.getLastArg(options::OPT_MD)) ||
254 (A = Args.getLastArg(options::OPT_MMD))) {
255 // Determine the output location.
256 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000257 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000258 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000259 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000260 } else if (Output.getType() == types::TY_Dependencies) {
261 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000262 } else if (A->getOption().matches(options::OPT_M) ||
263 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000264 DepFile = "-";
265 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000266 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000267 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000268 }
269 CmdArgs.push_back("-dependency-file");
270 CmdArgs.push_back(DepFile);
271
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000272 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000273 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
274 const char *DepTarget;
275
276 // If user provided -o, that is the dependency target, except
277 // when we are only generating a dependency file.
278 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
279 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000280 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000281 } else {
282 // Otherwise derive from the base input.
283 //
284 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000285 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000286 llvm::sys::path::replace_extension(P, "o");
287 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000288 }
289
290 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000291 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000292 QuoteTarget(DepTarget, Quoted);
293 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000294 }
295
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000296 if (A->getOption().matches(options::OPT_M) ||
297 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000298 CmdArgs.push_back("-sys-header-deps");
299 }
300
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000301 if (Args.hasArg(options::OPT_MG)) {
302 if (!A || A->getOption().matches(options::OPT_MD) ||
303 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000304 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000305 CmdArgs.push_back("-MG");
306 }
307
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000308 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000309
310 // Convert all -MQ <target> args to -MT <quoted target>
311 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
312 options::OPT_MQ),
313 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000314 const Arg *A = *it;
315 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000316
Daniel Dunbara442fd52010-06-11 22:00:13 +0000317 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000318 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000319 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000320 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000321 CmdArgs.push_back(Args.MakeArgString(Quoted));
322
323 // -MT flag - no change
324 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000325 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000326 }
327 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000328
Douglas Gregor111af7d2009-04-18 00:34:01 +0000329 // Add -i* options, and automatically translate to
330 // -include-pch/-include-pth for transparent PCH support. It's
331 // wonky, but we include looking for .gch so we can support seamless
332 // replacement into a build system already set up to be generating
333 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000334 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000335 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
336 ie = Args.filtered_end(); it != ie; ++it) {
337 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000338
339 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000340 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
341 RenderedImplicitInclude = true;
342
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000343 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000344 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000345
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000346 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000347 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000348 SmallString<128> P(A->getValue());
349 // We want the files to have a name like foo.h.pch. Add a dummy extension
350 // so that replace_extension does the right thing.
351 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000352 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000353 llvm::sys::path::replace_extension(P, "pch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000354 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000355 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000356 }
357
Douglas Gregor111af7d2009-04-18 00:34:01 +0000358 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000359 llvm::sys::path::replace_extension(P, "pth");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000360 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000361 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000362 }
363
Douglas Gregor111af7d2009-04-18 00:34:01 +0000364 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000365 llvm::sys::path::replace_extension(P, "gch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000366 if (llvm::sys::fs::exists(P.str())) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000367 FoundPCH = UsePCH;
368 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000369 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000370 }
371
372 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000373 if (IsFirstImplicitInclude) {
374 A->claim();
375 if (UsePCH)
376 CmdArgs.push_back("-include-pch");
377 else
378 CmdArgs.push_back("-include-pth");
379 CmdArgs.push_back(Args.MakeArgString(P.str()));
380 continue;
381 } else {
382 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000383 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000384 << P.str() << A->getAsString(Args);
385 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000386 }
387 }
388
389 // Not translated, render as usual.
390 A->claim();
391 A->render(Args, CmdArgs);
392 }
393
394 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000395 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
396 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000397
398 // Add -Wp, and -Xassembler if using the preprocessor.
399
400 // FIXME: There is a very unfortunate problem here, some troubled
401 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
402 // really support that we would have to parse and then translate
403 // those options. :(
404 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
405 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000406
407 // -I- is a deprecated GCC feature, reject it.
408 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000409 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000410
411 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
412 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000413 StringRef sysroot = C.getSysRoot();
414 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000415 if (!Args.hasArg(options::OPT_isysroot)) {
416 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000417 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000418 }
419 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000420
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000421 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000422 // FIXME: We should probably sink the logic for handling these from the
423 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000424 // CPATH - included following the user specified includes (but prior to
425 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000426 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000427 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000428 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000429 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000430 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000431 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000432 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000433 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000434 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000435
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000436 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000437 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000438 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000439
440 // Add system include arguments.
441 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000442}
443
Daniel Dunbarf492c922009-09-10 22:59:51 +0000444/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000445/// CPU.
446//
447// FIXME: This is redundant with -mcpu, why does LLVM use this.
448// FIXME: tblgen this, or kill it!
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000449static const char *getLLVMArchSuffixForARM(StringRef CPU) {
Chad Rosier9ac84512011-10-07 17:48:56 +0000450 return llvm::StringSwitch<const char *>(CPU)
Tim Northover92509c12013-06-13 15:02:46 +0000451 .Case("strongarm", "v4")
Chad Rosier9ac84512011-10-07 17:48:56 +0000452 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
453 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
454 .Cases("arm920", "arm920t", "arm922t", "v4t")
455 .Cases("arm940t", "ep9312","v4t")
456 .Cases("arm10tdmi", "arm1020t", "v5")
457 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
458 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
459 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
460 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
461 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
462 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Bob Wilsonf643afc2013-03-04 22:37:46 +0000463 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
Renato Golin1a04f222013-09-13 17:02:54 +0000464 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "v7")
465 .Cases("cortex-r4", "cortex-r5", "v7r")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000466 .Case("cortex-m0", "v6m")
Bob Wilson743bf672013-03-04 22:37:49 +0000467 .Case("cortex-m3", "v7m")
468 .Case("cortex-m4", "v7em")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000469 .Case("cortex-a9-mp", "v7f")
470 .Case("swift", "v7s")
Bernard Ogden021d7da2013-10-24 18:32:36 +0000471 .Cases("cortex-a53", "cortex-a57", "v8")
Chad Rosier9ac84512011-10-07 17:48:56 +0000472 .Default("");
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000473}
474
Benjamin Kramer09811c72012-06-26 22:20:06 +0000475/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
476//
477// FIXME: tblgen this.
478static std::string getARMTargetCPU(const ArgList &Args,
479 const llvm::Triple &Triple) {
480 // FIXME: Warn on inconsistent use of -mcpu and -march.
481
482 // If we have -mcpu=, use that.
483 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000484 StringRef MCPU = A->getValue();
Benjamin Kramer09811c72012-06-26 22:20:06 +0000485 // Handle -mcpu=native.
486 if (MCPU == "native")
487 return llvm::sys::getHostCPUName();
488 else
489 return MCPU;
490 }
491
492 StringRef MArch;
493 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
494 // Otherwise, if we have -march= choose the base CPU for that arch.
Richard Smithbd55daf2012-11-01 04:30:05 +0000495 MArch = A->getValue();
Benjamin Kramer09811c72012-06-26 22:20:06 +0000496 } else {
497 // Otherwise, use the Arch from the triple.
498 MArch = Triple.getArchName();
499 }
500
501 // Handle -march=native.
502 std::string NativeMArch;
503 if (MArch == "native") {
504 std::string CPU = llvm::sys::getHostCPUName();
505 if (CPU != "generic") {
506 // Translate the native cpu into the architecture. The switch below will
507 // then chose the minimum cpu for that arch.
508 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
509 MArch = NativeMArch;
510 }
511 }
512
513 return llvm::StringSwitch<const char *>(MArch)
514 .Cases("armv2", "armv2a","arm2")
515 .Case("armv3", "arm6")
516 .Case("armv3m", "arm7m")
Tim Northover92509c12013-06-13 15:02:46 +0000517 .Case("armv4", "strongarm")
518 .Case("armv4t", "arm7tdmi")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000519 .Cases("armv5", "armv5t", "arm10tdmi")
520 .Cases("armv5e", "armv5te", "arm1022e")
521 .Case("armv5tej", "arm926ej-s")
522 .Cases("armv6", "armv6k", "arm1136jf-s")
523 .Case("armv6j", "arm1136j-s")
524 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
525 .Case("armv6t2", "arm1156t2-s")
Bob Wilson743bf672013-03-04 22:37:49 +0000526 .Cases("armv6m", "armv6-m", "cortex-m0")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000527 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Bob Wilson743bf672013-03-04 22:37:49 +0000528 .Cases("armv7em", "armv7e-m", "cortex-m4")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000529 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
530 .Cases("armv7s", "armv7-s", "swift")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000531 .Cases("armv7r", "armv7-r", "cortex-r4")
532 .Cases("armv7m", "armv7-m", "cortex-m3")
Joey Goulyd077bc62013-06-26 17:19:48 +0000533 .Cases("armv8", "armv8a", "armv8-a", "cortex-a53")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000534 .Case("ep9312", "ep9312")
535 .Case("iwmmxt", "iwmmxt")
536 .Case("xscale", "xscale")
Tim Northover92509c12013-06-13 15:02:46 +0000537 // If all else failed, return the most base CPU with thumb interworking
538 // supported by LLVM.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000539 .Default("arm7tdmi");
540}
541
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000542// FIXME: Move to target hook.
543static bool isSignedCharDefault(const llvm::Triple &Triple) {
544 switch (Triple.getArch()) {
545 default:
546 return true;
547
Tim Northover9bb857a2013-01-31 12:13:10 +0000548 case llvm::Triple::aarch64:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000549 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000550 case llvm::Triple::ppc:
551 case llvm::Triple::ppc64:
Bob Wilson6524dd32011-10-14 05:03:44 +0000552 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000553 return true;
554 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000555
Bill Schmidt778d3872013-07-26 01:36:11 +0000556 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000557 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000558 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000559 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000560 }
561}
562
Robert Lytton0e076492013-08-13 09:43:10 +0000563static bool isNoCommonDefault(const llvm::Triple &Triple) {
564 switch (Triple.getArch()) {
565 default:
566 return false;
567
568 case llvm::Triple::xcore:
569 return true;
570 }
571}
572
Chad Rosiercfbfc582012-04-04 20:51:35 +0000573// Handle -mfpu=.
574//
575// FIXME: Centralize feature selection, defaulting shouldn't be also in the
576// frontend target.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000577static void getAArch64FPUFeatures(const Driver &D, const Arg *A,
578 const ArgList &Args,
579 std::vector<const char *> &Features) {
580 StringRef FPU = A->getValue();
581 if (FPU == "fp-armv8") {
582 Features.push_back("+fp-armv8");
583 } else if (FPU == "neon-fp-armv8") {
584 Features.push_back("+fp-armv8");
585 Features.push_back("+neon");
586 } else if (FPU == "crypto-neon-fp-armv8") {
587 Features.push_back("+fp-armv8");
588 Features.push_back("+neon");
589 Features.push_back("+crypto");
590 } else if (FPU == "neon") {
591 Features.push_back("+neon");
592 } else if (FPU == "none") {
593 Features.push_back("-fp-armv8");
594 Features.push_back("-crypto");
595 Features.push_back("-neon");
596 } else
597 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
598}
599
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000600// Handle -mhwdiv=.
601static void getARMHWDivFeatures(const Driver &D, const Arg *A,
602 const ArgList &Args,
603 std::vector<const char *> &Features) {
604 StringRef HWDiv = A->getValue();
605 if (HWDiv == "arm") {
606 Features.push_back("+hwdiv-arm");
607 Features.push_back("-hwdiv");
608 } else if (HWDiv == "thumb") {
609 Features.push_back("-hwdiv-arm");
610 Features.push_back("+hwdiv");
611 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
612 Features.push_back("+hwdiv-arm");
613 Features.push_back("+hwdiv");
614 } else if (HWDiv == "none") {
615 Features.push_back("-hwdiv-arm");
616 Features.push_back("-hwdiv");
617 } else
618 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
619}
620
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000621// Handle -mfpu=.
622//
623// FIXME: Centralize feature selection, defaulting shouldn't be also in the
624// frontend target.
625static void getARMFPUFeatures(const Driver &D, const Arg *A,
626 const ArgList &Args,
627 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000628 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000629
630 // Set the target features based on the FPU.
631 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
632 // Disable any default FPU support.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000633 Features.push_back("-vfp2");
634 Features.push_back("-vfp3");
635 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000636 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000637 Features.push_back("+vfp3");
638 Features.push_back("+d16");
639 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000640 } else if (FPU == "vfp") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000641 Features.push_back("+vfp2");
642 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000643 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000644 Features.push_back("+vfp3");
645 Features.push_back("-neon");
Joey Gouly7db275b2013-06-27 13:19:54 +0000646 } else if (FPU == "fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000647 Features.push_back("+fp-armv8");
Joey Gouly7db275b2013-06-27 13:19:54 +0000648 } else if (FPU == "neon-fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000649 Features.push_back("+fp-armv8");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000650 Features.push_back("+neon");
Amara Emersonfc362c62013-09-19 13:54:03 +0000651 } else if (FPU == "crypto-neon-fp-armv8") {
652 Features.push_back("+crypto");
653 Features.push_back("+fp-armv8");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000654 } else if (FPU == "neon") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000655 Features.push_back("+neon");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000656 } else if (FPU == "none") {
657 Features.push_back("-vfp2");
658 Features.push_back("-vfp3");
659 Features.push_back("-vfp4");
660 Features.push_back("-fp-armv8");
661 Features.push_back("-crypto");
662 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000663 } else
664 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
665}
666
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000667// Select the float ABI as determined by -msoft-float, -mhard-float, and
668// -mfloat-abi=.
669static StringRef getARMFloatABI(const Driver &D,
670 const ArgList &Args,
671 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000672 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000673 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
674 options::OPT_mhard_float,
675 options::OPT_mfloat_abi_EQ)) {
676 if (A->getOption().matches(options::OPT_msoft_float))
677 FloatABI = "soft";
678 else if (A->getOption().matches(options::OPT_mhard_float))
679 FloatABI = "hard";
680 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000681 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000682 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000683 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000684 << A->getAsString(Args);
685 FloatABI = "soft";
686 }
687 }
688 }
689
690 // If unspecified, choose the default based on the platform.
691 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000692 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000693 case llvm::Triple::Darwin:
694 case llvm::Triple::MacOSX:
695 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000696 // Darwin defaults to "softfp" for v6 and v7.
697 //
698 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000699 std::string ArchName =
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000700 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000701 if (StringRef(ArchName).startswith("v6") ||
702 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000703 FloatABI = "softfp";
704 else
705 FloatABI = "soft";
706 break;
707 }
708
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000709 case llvm::Triple::FreeBSD:
710 // FreeBSD defaults to soft float
711 FloatABI = "soft";
712 break;
713
Daniel Dunbar78485922009-09-10 23:00:09 +0000714 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000715 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000716 case llvm::Triple::GNUEABIHF:
717 FloatABI = "hard";
718 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000719 case llvm::Triple::GNUEABI:
720 FloatABI = "softfp";
721 break;
722 case llvm::Triple::EABI:
723 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
724 FloatABI = "softfp";
725 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000726 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000727 std::string ArchName =
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000728 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000729 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000730 FloatABI = "softfp";
731 else
732 FloatABI = "soft";
733 break;
734 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000735 default:
736 // Assume "soft", but warn the user we are guessing.
737 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000738 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000739 break;
740 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000741 }
742 }
743
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000744 return FloatABI;
745}
746
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000747static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
748 const ArgList &Args,
749 std::vector<const char *> &Features) {
750 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
751 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
752 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
753 // stripped out by the ARM target.
754 // Use software floating point operations?
755 if (FloatABI == "soft")
756 Features.push_back("+soft-float");
757
758 // Use software floating point argument passing?
759 if (FloatABI != "hard")
760 Features.push_back("+soft-float-abi");
761
762 // Honor -mfpu=.
763 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000764 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000765 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
766 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000767
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000768 // Setting -msoft-float effectively disables NEON because of the GCC
769 // implementation, although the same isn't true of VFP or VFP3.
770 if (FloatABI == "soft")
771 Features.push_back("-neon");
772}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000773
774void Clang::AddARMTargetArgs(const ArgList &Args,
775 ArgStringList &CmdArgs,
776 bool KernelOrKext) const {
777 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000778 // Get the effective triple, which takes into account the deployment target.
779 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
780 llvm::Triple Triple(TripleStr);
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000781 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000782
783 // Select the ABI to use.
784 //
785 // FIXME: Support -meabi.
786 const char *ABIName = 0;
787 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000788 ABIName = A->getValue();
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000789 } else if (Triple.isOSDarwin()) {
790 // The backend is hardwired to assume AAPCS for M-class processors, ensure
791 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000792 if (Triple.getEnvironment() == llvm::Triple::EABI ||
793 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000794 ABIName = "aapcs";
795 } else {
796 ABIName = "apcs-gnu";
797 }
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000798 } else {
799 // Select the default based on the platform.
800 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000801 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000802 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000803 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000804 ABIName = "aapcs-linux";
805 break;
806 case llvm::Triple::EABI:
807 ABIName = "aapcs";
808 break;
809 default:
810 ABIName = "apcs-gnu";
811 }
812 }
813 CmdArgs.push_back("-target-abi");
814 CmdArgs.push_back(ABIName);
815
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000816 // Determine floating point ABI from the options & target defaults.
817 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000818 if (FloatABI == "soft") {
819 // Floating point operations and argument passing are soft.
820 //
821 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000822 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000823 CmdArgs.push_back("-mfloat-abi");
824 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000825 } else if (FloatABI == "softfp") {
826 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000827 CmdArgs.push_back("-mfloat-abi");
828 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000829 } else {
830 // Floating point operations and argument passing are hard.
831 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000832 CmdArgs.push_back("-mfloat-abi");
833 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000834 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000835
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000836 // Kernel code has more strict alignment requirements.
837 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000838 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000839 CmdArgs.push_back("-backend-option");
840 CmdArgs.push_back("-arm-long-calls");
841 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000842
Daniel Dunbar12100e22011-03-22 16:48:17 +0000843 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000844 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000845
846 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000847 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000848 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000849 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000850
851 // Setting -mno-global-merge disables the codegen global merge pass. Setting
852 // -mglobal-merge has no effect as the pass is enabled by default.
853 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
854 options::OPT_mno_global_merge)) {
855 if (A->getOption().matches(options::OPT_mno_global_merge))
856 CmdArgs.push_back("-mno-global-merge");
857 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000858
Bob Wilson9c8af452013-04-11 18:53:25 +0000859 if (!Args.hasFlag(options::OPT_mimplicit_float,
860 options::OPT_mno_implicit_float,
861 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000862 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000863
864 // llvm does not support reserving registers in general. There is support
865 // for reserving r9 on ARM though (defined as a platform-specific register
866 // in ARM EABI).
867 if (Args.hasArg(options::OPT_ffixed_r9)) {
868 CmdArgs.push_back("-backend-option");
869 CmdArgs.push_back("-arm-reserve-r9");
870 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000871}
872
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000873// Get CPU and ABI names. They are not independent
874// so we have to calculate them together.
875static void getMipsCPUAndABI(const ArgList &Args,
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000876 const llvm::Triple &Triple,
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000877 StringRef &CPUName,
878 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000879 const char *DefMips32CPU = "mips32";
880 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000881
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000882 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000883 options::OPT_mcpu_EQ))
884 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000885
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000886 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000887 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000888 // Convert a GNU style Mips ABI name to the name
889 // accepted by LLVM Mips backend.
890 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
891 .Case("32", "o32")
892 .Case("64", "n64")
893 .Default(ABIName);
894 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000895
896 // Setup default CPU and ABI names.
897 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000898 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000899 default:
900 llvm_unreachable("Unexpected triple arch name");
901 case llvm::Triple::mips:
902 case llvm::Triple::mipsel:
903 CPUName = DefMips32CPU;
904 break;
905 case llvm::Triple::mips64:
906 case llvm::Triple::mips64el:
907 CPUName = DefMips64CPU;
908 break;
909 }
910 }
911
912 if (!ABIName.empty()) {
913 // Deduce CPU name from ABI name.
914 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000915 .Cases("32", "o32", "eabi", DefMips32CPU)
916 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000917 .Default("");
918 }
919 else if (!CPUName.empty()) {
920 // Deduce ABI name from CPU name.
921 ABIName = llvm::StringSwitch<const char *>(CPUName)
922 .Cases("mips32", "mips32r2", "o32")
923 .Cases("mips64", "mips64r2", "n64")
924 .Default("");
925 }
926
927 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000928}
929
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000930// Convert ABI name to the GNU tools acceptable variant.
931static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
932 return llvm::StringSwitch<llvm::StringRef>(ABI)
933 .Case("o32", "32")
934 .Case("n64", "64")
935 .Default(ABI);
936}
937
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000938// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
939// and -mfloat-abi=.
940static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000941 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000942 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000943 options::OPT_mhard_float,
944 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000945 if (A->getOption().matches(options::OPT_msoft_float))
946 FloatABI = "soft";
947 else if (A->getOption().matches(options::OPT_mhard_float))
948 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000949 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000950 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +0000951 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000952 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000953 FloatABI = "hard";
954 }
955 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000956 }
957
958 // If unspecified, choose the default based on the platform.
959 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000960 // Assume "hard", because it's a default value used by gcc.
961 // When we start to recognize specific target MIPS processors,
962 // we will be able to select the default more correctly.
963 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000964 }
965
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000966 return FloatABI;
967}
968
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000969static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000970 std::vector<const char *> &Features,
971 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000972 StringRef FeatureName) {
973 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000974 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000975 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000976 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000977 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000978 }
979}
980
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000981static void getMIPSTargetFeatures(const Driver &D, const ArgList &Args,
982 std::vector<const char *> &Features) {
983 StringRef FloatABI = getMipsFloatABI(D, Args);
984 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
985 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
986 // FIXME: Note, this is a hack. We need to pass the selected float
987 // mode to the MipsTargetInfoBase to define appropriate macros there.
988 // Now it is the only method.
989 Features.push_back("+soft-float");
990 }
991
Simon Atanasyan22127ce2013-09-24 09:09:16 +0000992 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
993 if (StringRef(A->getValue()) == "2008")
994 Features.push_back("+nan2008");
995 }
996
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000997 AddTargetFeature(Args, Features, options::OPT_msingle_float,
998 options::OPT_mdouble_float, "single-float");
999 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1000 "mips16");
1001 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1002 options::OPT_mno_micromips, "micromips");
1003 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1004 "dsp");
1005 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1006 "dspr2");
1007 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1008 "msa");
Daniel Sanders94694172013-10-17 14:55:58 +00001009 AddTargetFeature(Args, Features, options::OPT_mfp64, options::OPT_mfp32,
1010 "fp64");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001011}
1012
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001013void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001014 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001015 const Driver &D = getToolChain().getDriver();
1016 StringRef CPUName;
1017 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001018 const llvm::Triple &Triple = getToolChain().getTriple();
1019 getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001020
1021 CmdArgs.push_back("-target-abi");
1022 CmdArgs.push_back(ABIName.data());
1023
1024 StringRef FloatABI = getMipsFloatABI(D, Args);
1025
Simon Atanasyan81c423c2013-01-10 12:36:19 +00001026 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
1027
1028 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001029 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001030 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001031 CmdArgs.push_back("-mfloat-abi");
1032 CmdArgs.push_back("soft");
1033
Simon Atanasyan81c423c2013-01-10 12:36:19 +00001034 if (FloatABI == "hard" && IsMips16) {
1035 CmdArgs.push_back("-mllvm");
1036 CmdArgs.push_back("-mips16-hard-float");
1037 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001038 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001039 else {
1040 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001041 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001042 CmdArgs.push_back("-mfloat-abi");
1043 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001044 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001045
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001046 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1047 if (A->getOption().matches(options::OPT_mxgot)) {
1048 CmdArgs.push_back("-mllvm");
1049 CmdArgs.push_back("-mxgot");
1050 }
1051 }
1052
Simon Atanasyanc580b322013-05-11 06:33:44 +00001053 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1054 options::OPT_mno_ldc1_sdc1)) {
1055 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1056 CmdArgs.push_back("-mllvm");
1057 CmdArgs.push_back("-mno-ldc1-sdc1");
1058 }
1059 }
1060
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001061 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1062 options::OPT_mno_check_zero_division)) {
1063 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1064 CmdArgs.push_back("-mllvm");
1065 CmdArgs.push_back("-mno-check-zero-division");
1066 }
1067 }
1068
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001069 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001070 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001071 CmdArgs.push_back("-mllvm");
1072 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1073 A->claim();
1074 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001075}
1076
Hal Finkel8eb59282012-06-11 22:35:19 +00001077/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1078static std::string getPPCTargetCPU(const ArgList &Args) {
1079 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001080 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001081
1082 if (CPUName == "native") {
1083 std::string CPU = llvm::sys::getHostCPUName();
1084 if (!CPU.empty() && CPU != "generic")
1085 return CPU;
1086 else
1087 return "";
1088 }
1089
1090 return llvm::StringSwitch<const char *>(CPUName)
1091 .Case("common", "generic")
1092 .Case("440", "440")
1093 .Case("440fp", "440")
1094 .Case("450", "450")
1095 .Case("601", "601")
1096 .Case("602", "602")
1097 .Case("603", "603")
1098 .Case("603e", "603e")
1099 .Case("603ev", "603ev")
1100 .Case("604", "604")
1101 .Case("604e", "604e")
1102 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001103 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001104 .Case("G3", "g3")
1105 .Case("7400", "7400")
1106 .Case("G4", "g4")
1107 .Case("7450", "7450")
1108 .Case("G4+", "g4+")
1109 .Case("750", "750")
1110 .Case("970", "970")
1111 .Case("G5", "g5")
1112 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001113 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001114 .Case("e500mc", "e500mc")
1115 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001116 .Case("power3", "pwr3")
1117 .Case("power4", "pwr4")
1118 .Case("power5", "pwr5")
1119 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001120 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001121 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001122 .Case("power7", "pwr7")
Bill Schmidt38378a02013-02-01 20:23:10 +00001123 .Case("pwr3", "pwr3")
1124 .Case("pwr4", "pwr4")
1125 .Case("pwr5", "pwr5")
1126 .Case("pwr5x", "pwr5x")
1127 .Case("pwr6", "pwr6")
1128 .Case("pwr6x", "pwr6x")
1129 .Case("pwr7", "pwr7")
Hal Finkel8eb59282012-06-11 22:35:19 +00001130 .Case("powerpc", "ppc")
1131 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001132 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001133 .Default("");
1134 }
1135
1136 return "";
1137}
1138
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001139static void getPPCTargetFeatures(const ArgList &Args,
1140 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001141 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1142 ie = Args.filtered_end();
1143 it != ie; ++it) {
1144 StringRef Name = (*it)->getOption().getName();
1145 (*it)->claim();
1146
1147 // Skip over "-m".
1148 assert(Name.startswith("m") && "Invalid feature name.");
1149 Name = Name.substr(1);
1150
1151 bool IsNegative = Name.startswith("no-");
1152 if (IsNegative)
1153 Name = Name.substr(3);
1154
1155 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1156 // pass the correct option to the backend while calling the frontend
1157 // option the same.
1158 // TODO: Change the LLVM backend option maybe?
1159 if (Name == "mfcrf")
1160 Name = "mfocrf";
1161
1162 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1163 }
1164
1165 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001166 AddTargetFeature(Args, Features, options::OPT_faltivec,
1167 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001168}
1169
Tom Stellard6674c702013-04-01 20:56:53 +00001170/// Get the (LLVM) name of the R600 gpu we are targeting.
1171static std::string getR600TargetGPU(const ArgList &Args) {
1172 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001173 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001174 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001175 .Cases("rv630", "rv635", "r600")
1176 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001177 .Case("rv740", "rv770")
1178 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001179 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001180 .Case("hemlock", "cypress")
1181 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001182 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001183 }
1184 return "";
1185}
1186
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001187static void getSparcTargetFeatures(const ArgList &Args,
1188 std::vector<const char *> Features) {
1189 bool SoftFloatABI = true;
1190 if (Arg *A =
1191 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1192 if (A->getOption().matches(options::OPT_mhard_float))
1193 SoftFloatABI = false;
1194 }
1195 if (SoftFloatABI)
1196 Features.push_back("+soft-float");
1197}
1198
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001199void Clang::AddSparcTargetArgs(const ArgList &Args,
1200 ArgStringList &CmdArgs) const {
1201 const Driver &D = getToolChain().getDriver();
1202
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001203 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001204 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001205 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1206 options::OPT_mhard_float)) {
1207 if (A->getOption().matches(options::OPT_msoft_float))
1208 FloatABI = "soft";
1209 else if (A->getOption().matches(options::OPT_mhard_float))
1210 FloatABI = "hard";
1211 }
1212
1213 // If unspecified, choose the default based on the platform.
1214 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001215 // Assume "soft", but warn the user we are guessing.
1216 FloatABI = "soft";
1217 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001218 }
1219
1220 if (FloatABI == "soft") {
1221 // Floating point operations and argument passing are soft.
1222 //
1223 // FIXME: This changes CPP defines, we need -target-soft-float.
1224 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001225 } else {
1226 assert(FloatABI == "hard" && "Invalid float abi!");
1227 CmdArgs.push_back("-mhard-float");
1228 }
1229}
1230
Richard Sandiford4652d892013-07-19 16:51:51 +00001231static const char *getSystemZTargetCPU(const ArgList &Args) {
1232 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1233 return A->getValue();
1234 return "z10";
1235}
1236
Chandler Carruth953fb082013-01-13 11:46:33 +00001237static const char *getX86TargetCPU(const ArgList &Args,
1238 const llvm::Triple &Triple) {
1239 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1240 if (StringRef(A->getValue()) != "native")
1241 return A->getValue();
1242
1243 // FIXME: Reject attempts to use -march=native unless the target matches
1244 // the host.
1245 //
1246 // FIXME: We should also incorporate the detected target features for use
1247 // with -native.
1248 std::string CPU = llvm::sys::getHostCPUName();
1249 if (!CPU.empty() && CPU != "generic")
1250 return Args.MakeArgString(CPU);
1251 }
1252
1253 // Select the default CPU if none was given (or detection failed).
1254
1255 if (Triple.getArch() != llvm::Triple::x86_64 &&
1256 Triple.getArch() != llvm::Triple::x86)
1257 return 0; // This routine is only handling x86 targets.
1258
1259 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1260
1261 // FIXME: Need target hooks.
1262 if (Triple.isOSDarwin())
1263 return Is64Bit ? "core2" : "yonah";
1264
Chandler Carruth953fb082013-01-13 11:46:33 +00001265 // All x86 devices running Android have core2 as their common
1266 // denominator. This makes a better choice than pentium4.
1267 if (Triple.getEnvironment() == llvm::Triple::Android)
1268 return "core2";
1269
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001270 // Everything else goes to x86-64 in 64-bit mode.
1271 if (Is64Bit)
1272 return "x86-64";
1273
1274 switch (Triple.getOS()) {
1275 case llvm::Triple::FreeBSD:
1276 case llvm::Triple::NetBSD:
1277 case llvm::Triple::OpenBSD:
1278 return "i486";
1279 case llvm::Triple::Haiku:
1280 return "i586";
1281 case llvm::Triple::Bitrig:
1282 return "i686";
1283 default:
1284 // Fallback to p4.
1285 return "pentium4";
1286 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001287}
1288
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001289static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1290 switch(T.getArch()) {
1291 default:
1292 return "";
1293
1294 case llvm::Triple::arm:
1295 case llvm::Triple::thumb:
1296 return getARMTargetCPU(Args, T);
1297
1298 case llvm::Triple::mips:
1299 case llvm::Triple::mipsel:
1300 case llvm::Triple::mips64:
1301 case llvm::Triple::mips64el: {
1302 StringRef CPUName;
1303 StringRef ABIName;
1304 getMipsCPUAndABI(Args, T, CPUName, ABIName);
1305 return CPUName;
1306 }
1307
1308 case llvm::Triple::ppc:
1309 case llvm::Triple::ppc64:
1310 case llvm::Triple::ppc64le: {
1311 std::string TargetCPUName = getPPCTargetCPU(Args);
1312 // LLVM may default to generating code for the native CPU,
1313 // but, like gcc, we default to a more generic option for
1314 // each architecture. (except on Darwin)
1315 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1316 if (T.getArch() == llvm::Triple::ppc64)
1317 TargetCPUName = "ppc64";
1318 else if (T.getArch() == llvm::Triple::ppc64le)
1319 TargetCPUName = "ppc64le";
1320 else
1321 TargetCPUName = "ppc";
1322 }
1323 return TargetCPUName;
1324 }
1325
1326 case llvm::Triple::sparc:
1327 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1328 return A->getValue();
1329 return "";
1330
1331 case llvm::Triple::x86:
1332 case llvm::Triple::x86_64:
1333 return getX86TargetCPU(Args, T);
1334
1335 case llvm::Triple::hexagon:
1336 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1337
1338 case llvm::Triple::systemz:
1339 return getSystemZTargetCPU(Args);
1340
1341 case llvm::Triple::r600:
1342 return getR600TargetGPU(Args);
1343 }
1344}
1345
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001346static void getX86TargetFeatures(const ArgList &Args,
1347 std::vector<const char *> &Features) {
1348 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1349 ie = Args.filtered_end();
1350 it != ie; ++it) {
1351 StringRef Name = (*it)->getOption().getName();
1352 (*it)->claim();
1353
1354 // Skip over "-m".
1355 assert(Name.startswith("m") && "Invalid feature name.");
1356 Name = Name.substr(1);
1357
1358 bool IsNegative = Name.startswith("no-");
1359 if (IsNegative)
1360 Name = Name.substr(3);
1361
1362 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1363 }
1364}
1365
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001366void Clang::AddX86TargetArgs(const ArgList &Args,
1367 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001368 if (!Args.hasFlag(options::OPT_mred_zone,
1369 options::OPT_mno_red_zone,
1370 true) ||
1371 Args.hasArg(options::OPT_mkernel) ||
1372 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001373 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001374
Bob Wilson2616e2e2013-02-10 16:01:41 +00001375 // Default to avoid implicit floating-point for kernel/kext code, but allow
1376 // that to be overridden with -mno-soft-float.
1377 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1378 Args.hasArg(options::OPT_fapple_kext));
1379 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1380 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001381 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001382 options::OPT_mno_implicit_float)) {
1383 const Option &O = A->getOption();
1384 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1385 O.matches(options::OPT_msoft_float));
1386 }
1387 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001388 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001389}
1390
Matthew Curtise8f80a12012-12-06 17:49:03 +00001391static inline bool HasPICArg(const ArgList &Args) {
1392 return Args.hasArg(options::OPT_fPIC)
1393 || Args.hasArg(options::OPT_fpic);
1394}
1395
1396static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1397 return Args.getLastArg(options::OPT_G,
1398 options::OPT_G_EQ,
1399 options::OPT_msmall_data_threshold_EQ);
1400}
1401
1402static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1403 std::string value;
1404 if (HasPICArg(Args))
1405 value = "0";
1406 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1407 value = A->getValue();
1408 A->claim();
1409 }
1410 return value;
1411}
1412
Tony Linthicum76329bf2011-12-12 21:14:55 +00001413void Clang::AddHexagonTargetArgs(const ArgList &Args,
1414 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001415 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001416 CmdArgs.push_back("-mqdsp6-compat");
1417 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001418
Matthew Curtise8f80a12012-12-06 17:49:03 +00001419 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1420 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001421 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001422 CmdArgs.push_back(Args.MakeArgString(
1423 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001424 }
1425
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001426 if (!Args.hasArg(options::OPT_fno_short_enums))
1427 CmdArgs.push_back("-fshort-enums");
1428 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1429 CmdArgs.push_back ("-mllvm");
1430 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1431 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001432 CmdArgs.push_back ("-mllvm");
1433 CmdArgs.push_back ("-machine-sink-split=0");
1434}
1435
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001436static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1437 std::vector<const char *> &Features) {
Tim Northover2fe823a2013-08-01 09:23:19 +00001438 // Honor -mfpu=.
1439 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +00001440 getAArch64FPUFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001441}
1442
1443static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1444 const ArgList &Args, ArgStringList &CmdArgs) {
1445 std::vector<const char *> Features;
1446 switch (Triple.getArch()) {
1447 default:
1448 break;
1449 case llvm::Triple::mips:
1450 case llvm::Triple::mipsel:
1451 case llvm::Triple::mips64:
1452 case llvm::Triple::mips64el:
1453 getMIPSTargetFeatures(D, Args, Features);
1454 break;
1455
1456 case llvm::Triple::arm:
1457 case llvm::Triple::thumb:
1458 getARMTargetFeatures(D, Triple, Args, Features);
1459 break;
1460
1461 case llvm::Triple::ppc:
1462 case llvm::Triple::ppc64:
1463 case llvm::Triple::ppc64le:
1464 getPPCTargetFeatures(Args, Features);
1465 break;
1466 case llvm::Triple::sparc:
1467 getSparcTargetFeatures(Args, Features);
1468 break;
1469 case llvm::Triple::aarch64:
1470 getAArch64TargetFeatures(D, Args, Features);
1471 break;
1472 case llvm::Triple::x86:
1473 case llvm::Triple::x86_64:
1474 getX86TargetFeatures(Args, Features);
1475 break;
1476 }
Rafael Espindola43964802013-08-21 17:34:32 +00001477
1478 // Find the last of each feature.
1479 llvm::StringMap<unsigned> LastOpt;
1480 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1481 const char *Name = Features[I];
1482 assert(Name[0] == '-' || Name[0] == '+');
1483 LastOpt[Name + 1] = I;
1484 }
1485
1486 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1487 // If this feature was overridden, ignore it.
1488 const char *Name = Features[I];
1489 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1490 assert(LastI != LastOpt.end());
1491 unsigned Last = LastI->second;
1492 if (Last != I)
1493 continue;
1494
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001495 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001496 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001497 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001498}
1499
Eric Christopher84fbdb42011-08-19 00:30:14 +00001500static bool
John McCall5fb5df92012-06-20 06:18:46 +00001501shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001502 const llvm::Triple &Triple) {
1503 // We use the zero-cost exception tables for Objective-C if the non-fragile
1504 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1505 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001506 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001507 return true;
1508
Bob Wilson6524dd32011-10-14 05:03:44 +00001509 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001510 return false;
1511
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001512 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001513 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001514 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001515}
1516
Anders Carlssone96ab552011-02-28 02:27:16 +00001517/// addExceptionArgs - Adds exception related arguments to the driver command
1518/// arguments. There's a master flag, -fexceptions and also language specific
1519/// flags to enable/disable C++ and Objective-C exceptions.
1520/// This makes it possible to for example disable C++ exceptions but enable
1521/// Objective-C exceptions.
1522static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1523 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001524 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001525 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001526 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001527 if (KernelOrKext) {
1528 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1529 // arguments now to avoid warnings about unused arguments.
1530 Args.ClaimAllArgs(options::OPT_fexceptions);
1531 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1532 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1533 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1534 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1535 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001536 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001537 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001538
1539 // Exceptions are enabled by default.
1540 bool ExceptionsEnabled = true;
1541
1542 // This keeps track of whether exceptions were explicitly turned on or off.
1543 bool DidHaveExplicitExceptionFlag = false;
1544
Rafael Espindola00a66572009-10-01 13:33:33 +00001545 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1546 options::OPT_fno_exceptions)) {
1547 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001548 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001549 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001550 ExceptionsEnabled = false;
1551
1552 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001553 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001554
Anders Carlssone96ab552011-02-28 02:27:16 +00001555 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001556
Anders Carlssone96ab552011-02-28 02:27:16 +00001557 // Exception tables and cleanups can be enabled with -fexceptions even if the
1558 // language itself doesn't support exceptions.
1559 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1560 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001561
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001562 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1563 // is not necessarily sensible, but follows GCC.
1564 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001565 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001566 options::OPT_fno_objc_exceptions,
1567 true)) {
1568 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001569
Eric Christopher84fbdb42011-08-19 00:30:14 +00001570 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001571 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001572 }
1573
1574 if (types::isCXX(InputType)) {
1575 bool CXXExceptionsEnabled = ExceptionsEnabled;
1576
Eric Christopher84fbdb42011-08-19 00:30:14 +00001577 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1578 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001579 options::OPT_fexceptions,
1580 options::OPT_fno_exceptions)) {
1581 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1582 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001583 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001584 CXXExceptionsEnabled = false;
1585 }
1586
1587 if (CXXExceptionsEnabled) {
1588 CmdArgs.push_back("-fcxx-exceptions");
1589
1590 ShouldUseExceptionTables = true;
1591 }
1592 }
1593
1594 if (ShouldUseExceptionTables)
1595 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001596}
1597
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001598static bool ShouldDisableAutolink(const ArgList &Args,
1599 const ToolChain &TC) {
1600 bool Default = true;
1601 if (TC.getTriple().isOSDarwin()) {
1602 // The native darwin assembler doesn't support the linker_option directives,
1603 // so we disable them if we think the .s file will be passed to it.
1604 Default = TC.useIntegratedAs();
1605 }
1606 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1607 Default);
1608}
1609
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001610static bool ShouldDisableCFI(const ArgList &Args,
1611 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001612 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001613 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001614 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001615 // we disable them if we think the .s file will be passed to it.
Rafael Espindola84b588b2013-03-18 18:10:27 +00001616 Default = TC.useIntegratedAs();
Rafael Espindolaf934f982011-05-17 16:26:17 +00001617 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001618 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher45f2e712012-12-18 00:31:10 +00001619 options::OPT_fno_dwarf2_cfi_asm,
1620 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001621}
1622
Ted Kremenek62093662013-03-12 17:02:12 +00001623static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1624 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001625 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1626 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001627 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001628 return !UseDwarfDirectory;
1629}
1630
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001631/// \brief Check whether the given input tree contains any compilation actions.
1632static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001633 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001634 return true;
1635
1636 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1637 if (ContainsCompileAction(*it))
1638 return true;
1639
1640 return false;
1641}
1642
1643/// \brief Check if -relax-all should be passed to the internal assembler.
1644/// This is done by default when compiling non-assembler source with -O0.
1645static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1646 bool RelaxDefault = true;
1647
1648 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1649 RelaxDefault = A->getOption().matches(options::OPT_O0);
1650
1651 if (RelaxDefault) {
1652 RelaxDefault = false;
1653 for (ActionList::const_iterator it = C.getActions().begin(),
1654 ie = C.getActions().end(); it != ie; ++it) {
1655 if (ContainsCompileAction(*it)) {
1656 RelaxDefault = true;
1657 break;
1658 }
1659 }
1660 }
1661
1662 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1663 RelaxDefault);
1664}
1665
David Blaikie9260ed62013-07-25 21:19:01 +00001666static void CollectArgsForIntegratedAssembler(Compilation &C,
1667 const ArgList &Args,
1668 ArgStringList &CmdArgs,
1669 const Driver &D) {
1670 if (UseRelaxAll(C, Args))
1671 CmdArgs.push_back("-mrelax-all");
1672
1673 // When using an integrated assembler, translate -Wa, and -Xassembler
1674 // options.
1675 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1676 options::OPT_Xassembler),
1677 ie = Args.filtered_end(); it != ie; ++it) {
1678 const Arg *A = *it;
1679 A->claim();
1680
1681 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1682 StringRef Value = A->getValue(i);
1683
1684 if (Value == "-force_cpusubtype_ALL") {
1685 // Do nothing, this is the default and we don't support anything else.
1686 } else if (Value == "-L") {
1687 CmdArgs.push_back("-msave-temp-labels");
1688 } else if (Value == "--fatal-warnings") {
1689 CmdArgs.push_back("-mllvm");
1690 CmdArgs.push_back("-fatal-assembler-warnings");
1691 } else if (Value == "--noexecstack") {
1692 CmdArgs.push_back("-mnoexecstack");
1693 } else {
1694 D.Diag(diag::err_drv_unsupported_option_argument)
1695 << A->getOption().getName() << Value;
1696 }
1697 }
1698 }
1699}
1700
Chandler Carruth36381702013-06-23 11:28:48 +00001701static void addProfileRTLinux(
1702 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1703 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1704 Args.hasArg(options::OPT_fprofile_generate) ||
1705 Args.hasArg(options::OPT_fcreate_profile) ||
1706 Args.hasArg(options::OPT_coverage)))
1707 return;
1708
1709 // The profile runtime is located in the Linux library directory and has name
1710 // "libclang_rt.profile-<ArchName>.a".
1711 SmallString<128> LibProfile(TC.getDriver().ResourceDir);
1712 llvm::sys::path::append(
1713 LibProfile, "lib", "linux",
1714 Twine("libclang_rt.profile-") + TC.getArchName() + ".a");
1715
1716 CmdArgs.push_back(Args.MakeArgString(LibProfile));
1717}
1718
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001719static void addSanitizerRTLinkFlagsLinux(
1720 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smithf3e624c2013-03-23 00:30:08 +00001721 const StringRef Sanitizer, bool BeforeLibStdCXX,
1722 bool ExportSymbols = true) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001723 // Sanitizer runtime is located in the Linux library directory and
1724 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1725 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1726 llvm::sys::path::append(
1727 LibSanitizer, "lib", "linux",
1728 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
Richard Smithcff3cde2013-03-20 23:49:07 +00001729
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001730 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1731 // etc.) so that the linker picks custom versions of the global 'operator
1732 // new' and 'operator delete' symbols. We take the extreme (but simple)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001733 // strategy of inserting it at the front of the link command. It also
1734 // needs to be forced to end up in the executable, so wrap it in
1735 // whole-archive.
Richard Smithcff3cde2013-03-20 23:49:07 +00001736 SmallVector<const char *, 3> LibSanitizerArgs;
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001737 LibSanitizerArgs.push_back("-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001738 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001739 LibSanitizerArgs.push_back("-no-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001740
1741 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1742 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1743
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001744 CmdArgs.push_back("-lpthread");
Evgeniy Stepanov758b5072013-05-24 14:28:03 +00001745 CmdArgs.push_back("-lrt");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001746 CmdArgs.push_back("-ldl");
Richard Smithf3e624c2013-03-23 00:30:08 +00001747
1748 // If possible, use a dynamic symbols file to export the symbols from the
1749 // runtime library. If we can't do so, use -export-dynamic instead to export
1750 // all symbols from the binary.
1751 if (ExportSymbols) {
1752 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1753 CmdArgs.push_back(
1754 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1755 else
1756 CmdArgs.push_back("-export-dynamic");
1757 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001758}
1759
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001760/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1761/// This needs to be called before we add the C run-time (malloc, etc).
1762static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001763 ArgStringList &CmdArgs) {
Nick Lewycky609dd662013-10-11 03:33:53 +00001764 if (TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001765 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1766 llvm::sys::path::append(LibAsan, "lib", "linux",
1767 (Twine("libclang_rt.asan-") +
1768 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay35439df2012-12-04 21:18:26 +00001769 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001770 } else {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001771 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001772 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001773 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001774}
1775
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001776/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1777/// This needs to be called before we add the C run-time (malloc, etc).
1778static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1779 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001780 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001781 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001782}
1783
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001784/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1785/// This needs to be called before we add the C run-time (malloc, etc).
1786static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1787 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001788 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001789 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001790}
1791
1792/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
1793/// This needs to be called before we add the C run-time (malloc, etc).
1794static void addLsanRTLinux(const ToolChain &TC, const ArgList &Args,
1795 ArgStringList &CmdArgs) {
1796 if (!Args.hasArg(options::OPT_shared))
1797 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001798}
1799
Richard Smithe30752c2012-10-09 19:52:38 +00001800/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1801/// (Linux).
1802static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
Richard Smithcff3cde2013-03-20 23:49:07 +00001803 ArgStringList &CmdArgs, bool IsCXX,
1804 bool HasOtherSanitizerRt) {
Nick Lewycky24921692013-10-19 00:27:23 +00001805 // Need a copy of sanitizer_common. This could come from another sanitizer
1806 // runtime; if we're not including one, include our own copy.
1807 if (!HasOtherSanitizerRt)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001808 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
1809
1810 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
1811
1812 // Only include the bits of the runtime which need a C++ ABI library if
1813 // we're linking in C++ mode.
1814 if (IsCXX)
1815 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smithe30752c2012-10-09 19:52:38 +00001816}
1817
Peter Collingbournec3772752013-08-07 22:47:34 +00001818static void addDfsanRTLinux(const ToolChain &TC, const ArgList &Args,
1819 ArgStringList &CmdArgs) {
1820 if (!Args.hasArg(options::OPT_shared))
1821 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "dfsan", true);
1822}
1823
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001824static bool shouldUseFramePointerForTarget(const ArgList &Args,
1825 const llvm::Triple &Triple) {
1826 switch (Triple.getArch()) {
1827 // Don't use a frame pointer on linux if optimizing for certain targets.
1828 case llvm::Triple::mips64:
1829 case llvm::Triple::mips64el:
1830 case llvm::Triple::mips:
1831 case llvm::Triple::mipsel:
1832 case llvm::Triple::systemz:
1833 case llvm::Triple::x86:
1834 case llvm::Triple::x86_64:
1835 if (Triple.isOSLinux())
1836 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1837 if (!A->getOption().matches(options::OPT_O0))
1838 return false;
1839 return true;
1840 case llvm::Triple::xcore:
1841 return false;
1842 default:
1843 return true;
1844 }
1845}
1846
Rafael Espindola224dd632011-12-14 21:02:23 +00001847static bool shouldUseFramePointer(const ArgList &Args,
1848 const llvm::Triple &Triple) {
1849 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1850 options::OPT_fomit_frame_pointer))
1851 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1852
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001853 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00001854}
1855
Eric Christopherb7d97e92013-04-03 01:58:53 +00001856static bool shouldUseLeafFramePointer(const ArgList &Args,
1857 const llvm::Triple &Triple) {
1858 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1859 options::OPT_momit_leaf_frame_pointer))
1860 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1861
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001862 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00001863}
1864
Rafael Espindolac7367ff2013-08-10 01:40:10 +00001865/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001866static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00001867 SmallString<128> cwd;
1868 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00001869 CmdArgs.push_back("-fdebug-compilation-dir");
1870 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001871 }
1872}
1873
Eric Christopherd3804002013-02-22 20:12:52 +00001874static const char *SplitDebugName(const ArgList &Args,
1875 const InputInfoList &Inputs) {
1876 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1877 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1878 SmallString<128> T(FinalOutput->getValue());
1879 llvm::sys::path::replace_extension(T, "dwo");
1880 return Args.MakeArgString(T);
1881 } else {
1882 // Use the compilation dir.
1883 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1884 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1885 llvm::sys::path::replace_extension(F, "dwo");
1886 T += F;
1887 return Args.MakeArgString(F);
1888 }
1889}
1890
1891static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1892 const Tool &T, const JobAction &JA,
1893 const ArgList &Args, const InputInfo &Output,
1894 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00001895 ArgStringList ExtractArgs;
1896 ExtractArgs.push_back("--extract-dwo");
1897
1898 ArgStringList StripArgs;
1899 StripArgs.push_back("--strip-dwo");
1900
1901 // Grabbing the output of the earlier compile step.
1902 StripArgs.push_back(Output.getFilename());
1903 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00001904 ExtractArgs.push_back(OutFile);
1905
1906 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00001907 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00001908
1909 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00001910 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001911
1912 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00001913 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001914}
1915
Chad Rosierb71f6aa2013-04-24 18:09:54 +00001916static bool isOptimizationLevelFast(const ArgList &Args) {
1917 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1918 if (A->getOption().matches(options::OPT_Ofast))
1919 return true;
1920 return false;
1921}
1922
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001923/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
1924static bool shouldEnableVectorizerAtOLevel(const ArgList &Args) {
1925 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00001926 if (A->getOption().matches(options::OPT_O4) ||
1927 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001928 return true;
1929
1930 if (A->getOption().matches(options::OPT_O0))
1931 return false;
1932
1933 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
1934
Rafael Espindola91780de2013-08-26 14:05:41 +00001935 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001936 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00001937 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001938 return true;
1939
1940 // Don't vectorize -Oz.
1941 if (S == "z")
1942 return false;
1943
1944 unsigned OptLevel = 0;
1945 if (S.getAsInteger(10, OptLevel))
1946 return false;
1947
1948 return OptLevel > 1;
1949 }
1950
1951 return false;
1952}
1953
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001954void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001955 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001956 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001957 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001958 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001959 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1960 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001961 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001962 ArgStringList CmdArgs;
1963
Daniel Dunbare521a892009-03-31 20:53:55 +00001964 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1965
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001966 // Invoke ourselves in -cc1 mode.
1967 //
1968 // FIXME: Implement custom jobs for internal actions.
1969 CmdArgs.push_back("-cc1");
1970
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001971 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001972 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001973 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001974 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001975
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001976 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001977 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001978
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001979 if (isa<AnalyzeJobAction>(JA)) {
1980 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1981 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001982 } else if (isa<MigrateJobAction>(JA)) {
1983 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001984 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001985 if (Output.getType() == types::TY_Dependencies)
1986 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00001987 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001988 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00001989 if (Args.hasArg(options::OPT_rewrite_objc) &&
1990 !Args.hasArg(options::OPT_g_Group))
1991 CmdArgs.push_back("-P");
1992 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00001993 } else if (isa<AssembleJobAction>(JA)) {
1994 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001995
David Blaikie9260ed62013-07-25 21:19:01 +00001996 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00001997
1998 // Also ignore explicit -force_cpusubtype_ALL option.
1999 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002000 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002001 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002002 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002003
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002004 if (JA.getType() == types::TY_Nothing)
2005 CmdArgs.push_back("-fsyntax-only");
2006 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002007 CmdArgs.push_back("-emit-pch");
2008 else
2009 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002010 } else {
2011 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002012
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002013 if (JA.getType() == types::TY_Nothing) {
2014 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002015 } else if (JA.getType() == types::TY_LLVM_IR ||
2016 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002017 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002018 } else if (JA.getType() == types::TY_LLVM_BC ||
2019 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002020 CmdArgs.push_back("-emit-llvm-bc");
2021 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002022 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002023 } else if (JA.getType() == types::TY_AST) {
2024 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002025 } else if (JA.getType() == types::TY_ModuleFile) {
2026 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002027 } else if (JA.getType() == types::TY_RewrittenObjC) {
2028 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002029 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002030 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2031 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002032 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002033 } else {
2034 assert(JA.getType() == types::TY_PP_Asm &&
2035 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002036 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002037 }
2038
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002039 // The make clang go fast button.
2040 CmdArgs.push_back("-disable-free");
2041
John McCallbb79b5f2010-02-13 03:50:24 +00002042 // Disable the verification pass in -asserts builds.
2043#ifdef NDEBUG
2044 CmdArgs.push_back("-disable-llvm-verifier");
2045#endif
2046
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002047 // Set the main file name, so that debug info works even with
2048 // -save-temps.
2049 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002050 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002051
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002052 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002053 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002054 if (Args.hasArg(options::OPT_static))
2055 CmdArgs.push_back("-static-define");
2056
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002057 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002058 // Enable region store model by default.
2059 CmdArgs.push_back("-analyzer-store=region");
2060
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002061 // Treat blocks as analysis entry points.
2062 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2063
Ted Kremenek49c79792011-03-24 00:28:47 +00002064 CmdArgs.push_back("-analyzer-eagerly-assume");
2065
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002066 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002067 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002068 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002069
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002070 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
2071 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002072
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002073 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002074 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002075
2076 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002077
Jordan Rose10ad0812013-04-05 17:55:07 +00002078 if (types::isCXX(Inputs[0].getType()))
2079 CmdArgs.push_back("-analyzer-checker=cplusplus");
2080
Ted Kremenek37e96522012-01-26 02:27:38 +00002081 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00002082 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2083 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2084 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2085 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2086 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2087 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002088 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002089
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002090 // Set the output format. The default is plist, for (lame) historical
2091 // reasons.
2092 CmdArgs.push_back("-analyzer-output");
2093 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002094 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002095 else
2096 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002097
Ted Kremenekfe449a22010-03-22 22:32:05 +00002098 // Disable the presentation of standard compiler warnings when
2099 // using --analyze. We only want to show static analyzer diagnostics
2100 // or frontend errors.
2101 CmdArgs.push_back("-w");
2102
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002103 // Add -Xanalyzer arguments when running as analyzer.
2104 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002105 }
2106
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002107 CheckCodeGenerationOptions(D, Args);
2108
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002109 bool PIE = getToolChain().isPIEDefault();
2110 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002111 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002112
Alexey Samsonov090301e2013-04-09 12:28:19 +00002113 // For the PIC and PIE flag options, this logic is different from the
2114 // legacy logic in very old versions of GCC, as that logic was just
2115 // a bug no one had ever fixed. This logic is both more rational and
2116 // consistent with GCC's new logic now that the bugs are fixed. The last
2117 // argument relating to either PIC or PIE wins, and no other argument is
2118 // used. If the last argument is any flavor of the '-fno-...' arguments,
2119 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2120 // at the same level.
2121 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2122 options::OPT_fpic, options::OPT_fno_pic,
2123 options::OPT_fPIE, options::OPT_fno_PIE,
2124 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002125 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2126 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002127 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002128 if (LastPICArg) {
2129 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002130 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2131 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2132 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2133 PIC = PIE || O.matches(options::OPT_fPIC) ||
2134 O.matches(options::OPT_fpic);
2135 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2136 O.matches(options::OPT_fPIC);
2137 } else {
2138 PIE = PIC = false;
2139 }
2140 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002141 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002142
Nick Lewycky609dd662013-10-11 03:33:53 +00002143 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002144 // specified while enabling PIC enabled level 1 PIC, just force it back to
2145 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2146 // informal testing).
2147 if (PIC && getToolChain().getTriple().isOSDarwin())
2148 IsPICLevelTwo |= getToolChain().isPICDefault();
2149
Chandler Carruthc0c04552012-04-08 16:40:35 +00002150 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2151 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002152 llvm::Triple Triple(TripleStr);
Eric Christopher8d56caa2013-02-18 01:16:37 +00002153 if (KernelOrKext &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002154 (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002155 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002156 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002157 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002158
Chandler Carruth76a943b2012-11-19 03:52:03 +00002159 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2160 // This is a very special mode. It trumps the other modes, almost no one
2161 // uses it, and it isn't even valid on any OS but Darwin.
2162 if (!getToolChain().getTriple().isOSDarwin())
2163 D.Diag(diag::err_drv_unsupported_opt_for_target)
2164 << A->getSpelling() << getToolChain().getTriple().str();
2165
2166 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2167
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002168 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002169 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002170
Chandler Carruth76a943b2012-11-19 03:52:03 +00002171 // Only a forced PIC mode can cause the actual compile to have PIC defines
2172 // etc., no flags are sufficient. This behavior was selected to closely
2173 // match that of llvm-gcc and Apple GCC before that.
2174 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2175 CmdArgs.push_back("-pic-level");
2176 CmdArgs.push_back("2");
2177 }
2178 } else {
2179 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2180 // handled in Clang's IRGen by the -pie-level flag.
2181 CmdArgs.push_back("-mrelocation-model");
2182 CmdArgs.push_back(PIC ? "pic" : "static");
2183
2184 if (PIC) {
2185 CmdArgs.push_back("-pic-level");
2186 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2187 if (PIE) {
2188 CmdArgs.push_back("-pie-level");
2189 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2190 }
2191 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002192 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002193
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002194 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2195 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002196 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002197
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002198 // LLVM Code Generator Options.
2199
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002200 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2201 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002202 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002203 }
2204
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002205 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2206 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002207 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002208 D.Diag(diag::err_drv_unsupported_opt_for_target)
2209 << A->getSpelling() << getToolChain().getTriple().str();
2210 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2211 CmdArgs.push_back("-fpcc-struct-return");
2212 } else {
2213 assert(A->getOption().matches(options::OPT_freg_struct_return));
2214 CmdArgs.push_back("-freg-struct-return");
2215 }
2216 }
2217
Roman Divacky65b88cd2011-03-01 17:40:53 +00002218 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2219 CmdArgs.push_back("-mrtd");
2220
Rafael Espindola224dd632011-12-14 21:02:23 +00002221 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002222 CmdArgs.push_back("-mdisable-fp-elim");
2223 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2224 options::OPT_fno_zero_initialized_in_bss))
2225 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002226
2227 bool OFastEnabled = isOptimizationLevelFast(Args);
2228 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2229 // enabled. This alias option is being used to simplify the hasFlag logic.
2230 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2231 options::OPT_fstrict_aliasing;
2232 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00002233 options::OPT_fno_strict_aliasing,
2234 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00002235 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002236 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2237 options::OPT_fno_struct_path_tbaa))
2238 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002239 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2240 false))
2241 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002242 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2243 options::OPT_fno_optimize_sibling_calls))
2244 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002245
Eric Christopher006208c2013-04-04 06:29:47 +00002246 // Handle segmented stacks.
2247 if (Args.hasArg(options::OPT_fsplit_stack))
2248 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002249
2250 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2251 // This alias option is being used to simplify the getLastArg logic.
2252 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2253 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002254
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002255 // Handle various floating point optimization flags, mapping them to the
2256 // appropriate LLVM code generation flags. The pattern for all of these is to
2257 // default off the codegen optimizations, and if any flag enables them and no
2258 // flag disables them after the flag enabling them, enable the codegen
2259 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002260 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002261 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002262 options::OPT_ffinite_math_only,
2263 options::OPT_fno_finite_math_only,
2264 options::OPT_fhonor_infinities,
2265 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002266 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2267 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002268 A->getOption().getID() != options::OPT_fhonor_infinities)
2269 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002270 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002271 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002272 options::OPT_ffinite_math_only,
2273 options::OPT_fno_finite_math_only,
2274 options::OPT_fhonor_nans,
2275 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002276 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2277 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002278 A->getOption().getID() != options::OPT_fhonor_nans)
2279 CmdArgs.push_back("-menable-no-nans");
2280
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002281 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2282 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002283 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002284 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002285 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002286 options::OPT_fno_math_errno)) {
2287 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2288 // However, turning *off* -ffast_math merely restores the toolchain default
2289 // (which may be false).
2290 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2291 A->getOption().getID() == options::OPT_ffast_math ||
2292 A->getOption().getID() == options::OPT_Ofast)
2293 MathErrno = false;
2294 else if (A->getOption().getID() == options::OPT_fmath_errno)
2295 MathErrno = true;
2296 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002297 if (MathErrno)
2298 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002299
2300 // There are several flags which require disabling very specific
2301 // optimizations. Any of these being disabled forces us to turn off the
2302 // entire set of LLVM optimizations, so collect them through all the flag
2303 // madness.
2304 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002305 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002306 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002307 options::OPT_funsafe_math_optimizations,
2308 options::OPT_fno_unsafe_math_optimizations,
2309 options::OPT_fassociative_math,
2310 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002311 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2312 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002313 A->getOption().getID() != options::OPT_fno_associative_math)
2314 AssociativeMath = true;
2315 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002316 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002317 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002318 options::OPT_funsafe_math_optimizations,
2319 options::OPT_fno_unsafe_math_optimizations,
2320 options::OPT_freciprocal_math,
2321 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002322 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2323 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002324 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2325 ReciprocalMath = true;
2326 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002327 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002328 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002329 options::OPT_funsafe_math_optimizations,
2330 options::OPT_fno_unsafe_math_optimizations,
2331 options::OPT_fsigned_zeros,
2332 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002333 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2334 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002335 A->getOption().getID() != options::OPT_fsigned_zeros)
2336 SignedZeros = false;
2337 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002338 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002339 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002340 options::OPT_funsafe_math_optimizations,
2341 options::OPT_fno_unsafe_math_optimizations,
2342 options::OPT_ftrapping_math,
2343 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002344 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2345 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002346 A->getOption().getID() != options::OPT_ftrapping_math)
2347 TrappingMath = false;
2348 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2349 !TrappingMath)
2350 CmdArgs.push_back("-menable-unsafe-fp-math");
2351
Lang Hamesaa53b932012-07-06 00:59:19 +00002352
2353 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002354 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002355 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002356 options::OPT_ffp_contract)) {
2357 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002358 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002359 if (Val == "fast" || Val == "on" || Val == "off") {
2360 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2361 } else {
2362 D.Diag(diag::err_drv_unsupported_option_argument)
2363 << A->getOption().getName() << Val;
2364 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002365 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2366 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002367 // If fast-math is set then set the fp-contract mode to fast.
2368 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2369 }
2370 }
2371
Bob Wilson6a039162012-07-19 03:52:53 +00002372 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2373 // and if we find them, tell the frontend to provide the appropriate
2374 // preprocessor macros. This is distinct from enabling any optimizations as
2375 // these options induce language changes which must survive serialization
2376 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002377 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2378 options::OPT_fno_fast_math))
2379 if (!A->getOption().matches(options::OPT_fno_fast_math))
2380 CmdArgs.push_back("-ffast-math");
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002381 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2382 if (A->getOption().matches(options::OPT_ffinite_math_only))
2383 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002384
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002385 // Decide whether to use verbose asm. Verbose assembly is the default on
2386 // toolchains which have the integrated assembler on by default.
2387 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2388 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002389 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002390 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002391 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002392
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002393 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2394 CmdArgs.push_back("-mdebug-pass");
2395 CmdArgs.push_back("Structure");
2396 }
2397 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2398 CmdArgs.push_back("-mdebug-pass");
2399 CmdArgs.push_back("Arguments");
2400 }
2401
John McCall8517abc2010-02-19 02:45:38 +00002402 // Enable -mconstructor-aliases except on darwin, where we have to
2403 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002404 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002405 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002406
John McCall7ef5cb32011-03-18 02:56:14 +00002407 // Darwin's kernel doesn't support guard variables; just die if we
2408 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002409 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002410 CmdArgs.push_back("-fforbid-guard-variables");
2411
Douglas Gregordbe39272011-02-01 15:15:22 +00002412 if (Args.hasArg(options::OPT_mms_bitfields)) {
2413 CmdArgs.push_back("-mms-bitfields");
2414 }
John McCall8517abc2010-02-19 02:45:38 +00002415
Daniel Dunbar306945d2009-09-16 06:17:29 +00002416 // This is a coarse approximation of what llvm-gcc actually does, both
2417 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2418 // complicated ways.
2419 bool AsynchronousUnwindTables =
2420 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2421 options::OPT_fno_asynchronous_unwind_tables,
2422 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002423 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002424 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2425 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002426 CmdArgs.push_back("-munwind-tables");
2427
Chandler Carruth05fb5852012-11-21 23:40:23 +00002428 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002429
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002430 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2431 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002432 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002433 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002434
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002435 // FIXME: Handle -mtune=.
2436 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002437
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002438 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002439 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002440 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002441 }
2442
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002443 // Add the target cpu
2444 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2445 llvm::Triple ETriple(ETripleStr);
2446 std::string CPU = getCPUName(Args, ETriple);
2447 if (!CPU.empty()) {
2448 CmdArgs.push_back("-target-cpu");
2449 CmdArgs.push_back(Args.MakeArgString(CPU));
2450 }
2451
Rafael Espindolaeb265472013-08-21 21:59:03 +00002452 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2453 CmdArgs.push_back("-mfpmath");
2454 CmdArgs.push_back(A->getValue());
2455 }
2456
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002457 // Add the target features
2458 getTargetFeatures(D, ETriple, Args, CmdArgs);
2459
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002460 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002461 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002462 default:
2463 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002464
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002465 case llvm::Triple::arm:
2466 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002467 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002468 break;
2469
Eric Christopher0b26a612010-03-02 02:41:08 +00002470 case llvm::Triple::mips:
2471 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002472 case llvm::Triple::mips64:
2473 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002474 AddMIPSTargetArgs(Args, CmdArgs);
2475 break;
2476
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002477 case llvm::Triple::sparc:
2478 AddSparcTargetArgs(Args, CmdArgs);
2479 break;
2480
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002481 case llvm::Triple::x86:
2482 case llvm::Triple::x86_64:
2483 AddX86TargetArgs(Args, CmdArgs);
2484 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002485
2486 case llvm::Triple::hexagon:
2487 AddHexagonTargetArgs(Args, CmdArgs);
2488 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002489 }
2490
Hans Wennborg75958c42013-08-08 00:17:41 +00002491 // Add clang-cl arguments.
2492 if (getToolChain().getDriver().IsCLMode())
2493 AddClangCLArgs(Args, CmdArgs);
2494
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002495 // Pass the linker version in use.
2496 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2497 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002498 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002499 }
2500
Eric Christopherb7d97e92013-04-03 01:58:53 +00002501 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002502 CmdArgs.push_back("-momit-leaf-frame-pointer");
2503
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002504 // Explicitly error on some things we know we don't support and can't just
2505 // ignore.
2506 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002507 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2508 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002509 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002510 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002511 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002512 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2513 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002514 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002515 << Unsupported->getOption().getName();
2516 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002517 }
2518
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002519 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002520 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002521 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002522 CmdArgs.push_back("-header-include-file");
2523 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2524 D.CCPrintHeadersFilename : "-");
2525 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002526 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002527 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002528
Chad Rosierbe10f982011-08-02 17:58:04 +00002529 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002530 CmdArgs.push_back("-diagnostic-log-file");
2531 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2532 D.CCLogDiagnosticsFilename : "-");
2533 }
2534
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002535 // Use the last option from "-g" group. "-gline-tables-only"
2536 // is preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002537 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002538 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002539 if (A->getOption().matches(options::OPT_gline_tables_only))
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002540 CmdArgs.push_back("-gline-tables-only");
Manman Ren9691f7f2013-06-19 01:46:49 +00002541 else if (A->getOption().matches(options::OPT_gdwarf_2))
2542 CmdArgs.push_back("-gdwarf-2");
2543 else if (A->getOption().matches(options::OPT_gdwarf_3))
2544 CmdArgs.push_back("-gdwarf-3");
2545 else if (A->getOption().matches(options::OPT_gdwarf_4))
2546 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002547 else if (!A->getOption().matches(options::OPT_g0) &&
Manman Ren38db0922013-07-02 23:15:25 +00002548 !A->getOption().matches(options::OPT_ggdb0)) {
2549 // Default is dwarf-2 for darwin.
2550 if (getToolChain().getTriple().isOSDarwin())
2551 CmdArgs.push_back("-gdwarf-2");
2552 else
2553 CmdArgs.push_back("-g");
2554 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002555 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002556
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002557 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2558 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002559 if (Args.hasArg(options::OPT_gcolumn_info))
2560 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002561
Eric Christopher138c32b2013-09-13 22:37:55 +00002562 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002563 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2564 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00002565 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002566 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00002567 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002568 CmdArgs.push_back("-g");
2569 CmdArgs.push_back("-backend-option");
2570 CmdArgs.push_back("-split-dwarf=Enable");
2571 }
2572
Eric Christopher138c32b2013-09-13 22:37:55 +00002573 // -ggnu-pubnames turns on gnu style pubnames in the backend.
2574 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2575 CmdArgs.push_back("-backend-option");
2576 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2577 }
Eric Christophereec89c22013-06-18 00:03:50 +00002578
2579 Args.AddAllArgs(CmdArgs, options::OPT_fdebug_types_section);
2580
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002581 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2582 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2583
Chris Lattner3c77a352010-06-22 00:03:40 +00002584 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2585
Nick Lewycky207bce32011-04-21 23:44:07 +00002586 if (Args.hasArg(options::OPT_ftest_coverage) ||
2587 Args.hasArg(options::OPT_coverage))
2588 CmdArgs.push_back("-femit-coverage-notes");
2589 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2590 Args.hasArg(options::OPT_coverage))
2591 CmdArgs.push_back("-femit-coverage-data");
2592
Nick Lewycky480cb992011-05-04 20:46:58 +00002593 if (C.getArgs().hasArg(options::OPT_c) ||
2594 C.getArgs().hasArg(options::OPT_S)) {
2595 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002596 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00002597 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00002598 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002599 SmallString<128> Pwd;
2600 if (!llvm::sys::fs::current_path(Pwd)) {
2601 llvm::sys::path::append(Pwd, CoverageFilename.str());
2602 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00002603 }
2604 }
Eric Christophere30f61c2013-02-22 00:24:40 +00002605 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002606 }
2607 }
2608
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002609 // Pass options for controlling the default header search paths.
2610 if (Args.hasArg(options::OPT_nostdinc)) {
2611 CmdArgs.push_back("-nostdsysteminc");
2612 CmdArgs.push_back("-nobuiltininc");
2613 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002614 if (Args.hasArg(options::OPT_nostdlibinc))
2615 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002616 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2617 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2618 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002619
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002620 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002621 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002622 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002623
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002624 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2625
Ted Kremenekf7639e12012-03-06 20:06:33 +00002626 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00002627 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002628 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002629 options::OPT_ccc_arcmt_modify,
2630 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002631 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002632 switch (A->getOption().getID()) {
2633 default:
2634 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002635 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002636 CmdArgs.push_back("-arcmt-check");
2637 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002638 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002639 CmdArgs.push_back("-arcmt-modify");
2640 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002641 case options::OPT_ccc_arcmt_migrate:
2642 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002643 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002644 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002645
2646 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2647 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002648 break;
John McCalld70fb982011-06-15 23:25:17 +00002649 }
2650 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00002651 } else {
2652 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2653 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2654 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00002655 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002656
Ted Kremenekf7639e12012-03-06 20:06:33 +00002657 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2658 if (ARCMTEnabled) {
2659 D.Diag(diag::err_drv_argument_not_allowed_with)
2660 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2661 }
2662 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002663 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002664
2665 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002666 options::OPT_objcmt_migrate_subscripting,
2667 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002668 // None specified, means enable them all.
2669 CmdArgs.push_back("-objcmt-migrate-literals");
2670 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002671 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002672 } else {
2673 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2674 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002675 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00002676 }
2677 }
2678
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002679 // Add preprocessing options like -I, -D, etc. if we are using the
2680 // preprocessor.
2681 //
2682 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002683 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00002684 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002685
Rafael Espindolaa7431922011-07-21 23:40:37 +00002686 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2687 // that "The compiler can only warn and ignore the option if not recognized".
2688 // When building with ccache, it will pass -D options to clang even on
2689 // preprocessed inputs and configure concludes that -fPIC is not supported.
2690 Args.ClaimAllArgs(options::OPT_D);
2691
Rafael Espindolaad70d962013-08-27 16:58:15 +00002692 // Manually translate -O4 to -O3; let clang reject others.
2693 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2694 if (A->getOption().matches(options::OPT_O4)) {
2695 CmdArgs.push_back("-O3");
2696 D.Diag(diag::warn_O4_is_O3);
2697 } else {
2698 A->render(Args, CmdArgs);
2699 }
2700 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002701
Chad Rosier86b82082012-12-12 20:06:31 +00002702 // Don't warn about unused -flto. This can happen when we're preprocessing or
2703 // precompiling.
2704 Args.ClaimAllArgs(options::OPT_flto);
2705
Daniel Dunbar945577c2009-10-29 02:24:45 +00002706 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002707 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2708 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002709 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002710 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002711
2712 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00002713 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002714 //
2715 // If a std is supplied, only add -trigraphs if it follows the
2716 // option.
2717 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2718 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002719 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002720 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002721 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002722 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002723 else
2724 Std->render(Args, CmdArgs);
2725
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002726 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2727 options::OPT_trigraphs))
2728 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002729 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002730 } else {
2731 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002732 //
2733 // FIXME: Clang doesn't correctly handle -std= when the input language
2734 // doesn't match. For the time being just ignore this for C++ inputs;
2735 // eventually we want to do all the standard defaulting here instead of
2736 // splitting it between the driver and clang -cc1.
2737 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002738 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2739 "-std=", /*Joined=*/true);
2740 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2741 CmdArgs.push_back("-std=c++11");
2742
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002743 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002744 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002745
Richard Smith282b4492013-09-04 22:50:31 +00002746 // GCC's behavior for -Wwrite-strings is a bit strange:
2747 // * In C, this "warning flag" changes the types of string literals from
2748 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
2749 // for the discarded qualifier.
2750 // * In C++, this is just a normal warning flag.
2751 //
2752 // Implementing this warning correctly in C is hard, so we follow GCC's
2753 // behavior for now. FIXME: Directly diagnose uses of a string literal as
2754 // a non-const char* in C, rather than using this crude hack.
2755 if (!types::isCXX(InputType)) {
2756 // FIXME: This should behave just like a warning flag, and thus should also
2757 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
2758 Arg *WriteStrings =
2759 Args.getLastArg(options::OPT_Wwrite_strings,
2760 options::OPT_Wno_write_strings, options::OPT_w);
2761 if (WriteStrings &&
2762 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
2763 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00002764 }
2765
Chandler Carruth61fbf622011-04-23 09:27:53 +00002766 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002767 // during C++ compilation, which it is by default. GCC keeps this define even
2768 // in the presence of '-w', match this behavior bug-for-bug.
2769 if (types::isCXX(InputType) &&
2770 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2771 true)) {
2772 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002773 }
2774
Chandler Carruthe0391482010-05-22 02:21:53 +00002775 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2776 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2777 if (Asm->getOption().matches(options::OPT_fasm))
2778 CmdArgs.push_back("-fgnu-keywords");
2779 else
2780 CmdArgs.push_back("-fno-gnu-keywords");
2781 }
2782
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002783 if (ShouldDisableCFI(Args, getToolChain()))
2784 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002785
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002786 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2787 CmdArgs.push_back("-fno-dwarf-directory-asm");
2788
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002789 if (ShouldDisableAutolink(Args, getToolChain()))
2790 CmdArgs.push_back("-fno-autolink");
2791
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002792 // Add in -fdebug-compilation-dir if necessary.
2793 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00002794
Richard Smith9a568822011-11-21 19:36:32 +00002795 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2796 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002797 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002798 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002799 }
2800
Richard Smith9a568822011-11-21 19:36:32 +00002801 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2802 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002803 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00002804 }
2805
Richard Smitha3d3bd22013-05-08 02:12:03 +00002806 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
2807 CmdArgs.push_back("-fconstexpr-steps");
2808 CmdArgs.push_back(A->getValue());
2809 }
2810
Richard Smithb3a14522013-02-22 01:59:51 +00002811 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2812 CmdArgs.push_back("-fbracket-depth");
2813 CmdArgs.push_back(A->getValue());
2814 }
2815
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002816 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2817 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002818 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002819 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002820 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2821 } else
2822 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002823 }
2824
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002825
Michael J. Spencer929fccd2012-10-22 22:13:48 +00002826 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002827 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002828
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002829 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2830 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00002831 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002832 }
David Chisnall5778fce2009-08-31 16:41:57 +00002833
Chris Lattnere23003d2010-01-09 21:54:33 +00002834 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2835 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00002836 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00002837 }
2838
Chris Lattnerb35583d2010-04-07 20:49:23 +00002839 CmdArgs.push_back("-ferror-limit");
2840 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00002841 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00002842 else
2843 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002844
Chandler Carrutha77a7272010-05-06 04:55:18 +00002845 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2846 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002847 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002848 }
2849
2850 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2851 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002852 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002853 }
2854
Richard Smithf6f003a2011-12-16 19:06:07 +00002855 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2856 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002857 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00002858 }
2859
Daniel Dunbar2c978472009-11-04 06:24:47 +00002860 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002861 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002862 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002863 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00002864 } else {
2865 // If -fmessage-length=N was not specified, determine whether this is a
2866 // terminal and, if so, implicitly define -fmessage-length appropriately.
2867 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002868 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002869 }
2870
John McCallb4a99d32013-02-19 01:57:35 +00002871 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2872 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2873 options::OPT_fvisibility_ms_compat)) {
2874 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2875 CmdArgs.push_back("-fvisibility");
2876 CmdArgs.push_back(A->getValue());
2877 } else {
2878 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2879 CmdArgs.push_back("-fvisibility");
2880 CmdArgs.push_back("hidden");
2881 CmdArgs.push_back("-ftype-visibility");
2882 CmdArgs.push_back("default");
2883 }
Daniel Dunbare357d562009-12-03 18:42:11 +00002884 }
2885
Douglas Gregor08329632010-06-15 17:05:35 +00002886 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002887
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002888 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2889
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002890 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002891 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2892 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002893 CmdArgs.push_back("-ffreestanding");
2894
Daniel Dunbare357d562009-12-03 18:42:11 +00002895 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002896 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002897 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002898 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002899 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002900 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00002901 // AltiVec language extensions aren't relevant for assembling.
2902 if (!isa<PreprocessJobAction>(JA) ||
2903 Output.getType() != types::TY_PP_Asm)
2904 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002905 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2906 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002907
Alexey Samsonov609213f92013-08-19 09:14:21 +00002908 const SanitizerArgs &Sanitize = D.getOrParseSanitizerArgs(Args);
Alexey Samsonove6203662013-08-09 07:42:13 +00002909 Sanitize.addArgs(getToolChain(), Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00002910
Will Dietz3676d562012-12-30 20:53:28 +00002911 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2912 options::OPT_fno_sanitize_recover,
2913 true))
2914 CmdArgs.push_back("-fno-sanitize-recover");
2915
Chad Rosierae229d52013-01-29 23:31:22 +00002916 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2917 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2918 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2919 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2920
Eric Christopher459d2712013-02-19 06:16:53 +00002921 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00002922 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002923 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00002924 getToolChain().getArch() == llvm::Triple::ppc64 ||
2925 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00002926 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00002927 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00002928
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002929 if (getToolChain().SupportsProfiling())
2930 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002931
2932 // -flax-vector-conversions is default.
2933 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2934 options::OPT_fno_lax_vector_conversions))
2935 CmdArgs.push_back("-fno-lax-vector-conversions");
2936
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002937 if (Args.getLastArg(options::OPT_fapple_kext))
2938 CmdArgs.push_back("-fapple-kext");
2939
David Blaikie690f21e2012-06-14 18:55:27 +00002940 if (Args.hasFlag(options::OPT_frewrite_includes,
2941 options::OPT_fno_rewrite_includes, false))
2942 CmdArgs.push_back("-frewrite-includes");
2943
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002944 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002945 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002946 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002947 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2948 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002949
2950 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2951 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00002952 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00002953 }
2954
Bob Wilson14adb362012-02-03 06:27:22 +00002955 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002956
Chandler Carruth6e501032011-03-27 00:04:55 +00002957 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2958 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2959 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2960 options::OPT_fno_wrapv)) {
2961 if (A->getOption().matches(options::OPT_fwrapv))
2962 CmdArgs.push_back("-fwrapv");
2963 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2964 options::OPT_fno_strict_overflow)) {
2965 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2966 CmdArgs.push_back("-fwrapv");
2967 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002968 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00002969 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
2970 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002971
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002972 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2973
Mahesha S6a682be42012-10-27 07:47:56 +00002974
Daniel Dunbar4930e332009-11-17 08:07:36 +00002975 // -stack-protector=0 is default.
2976 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002977 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2978 options::OPT_fstack_protector_all,
2979 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002980 if (A->getOption().matches(options::OPT_fstack_protector))
2981 StackProtectorLevel = 1;
2982 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2983 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002984 } else {
2985 StackProtectorLevel =
2986 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2987 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002988 if (StackProtectorLevel) {
2989 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002990 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002991 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002992
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002993 // --param ssp-buffer-size=
2994 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2995 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002996 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002997 if (Str.startswith("ssp-buffer-size=")) {
2998 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00002999 CmdArgs.push_back("-stack-protector-buffer-size");
3000 // FIXME: Verify the argument is a valid integer.
3001 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003002 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003003 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003004 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003005 }
3006
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003007 // Translate -mstackrealign
3008 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3009 false)) {
3010 CmdArgs.push_back("-backend-option");
3011 CmdArgs.push_back("-force-align-stack");
3012 }
3013 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3014 false)) {
3015 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3016 }
3017
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003018 if (Args.hasArg(options::OPT_mstack_alignment)) {
3019 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3020 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003021 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00003022 // -mkernel implies -mstrict-align; don't add the redundant option.
Renato Golina146a482013-08-24 14:44:41 +00003023 if (!KernelOrKext) {
Renato Golin8d5f3142013-08-28 23:56:07 +00003024 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3025 options::OPT_munaligned_access)) {
3026 if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3027 CmdArgs.push_back("-backend-option");
3028 CmdArgs.push_back("-arm-strict-align");
3029 } else {
3030 CmdArgs.push_back("-backend-option");
3031 CmdArgs.push_back("-arm-no-strict-align");
3032 }
Renato Golina146a482013-08-24 14:44:41 +00003033 }
Chad Rosier60027022012-11-09 17:29:19 +00003034 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003035
Daniel Dunbard18049a2009-04-07 21:16:11 +00003036 // Forward -f options with positive and negative forms; we translate
3037 // these by hand.
3038
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003039 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003040 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003041 CmdArgs.push_back("-fapple-kext");
3042 if (!Args.hasArg(options::OPT_fbuiltin))
3043 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003044 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003045 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003046 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003047 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003048 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003049
Nuno Lopes13c88c72009-12-16 16:59:22 +00003050 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3051 options::OPT_fno_assume_sane_operator_new))
3052 CmdArgs.push_back("-fno-assume-sane-operator-new");
3053
Daniel Dunbar4930e332009-11-17 08:07:36 +00003054 // -fblocks=0 is default.
3055 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003056 getToolChain().IsBlocksDefault()) ||
3057 (Args.hasArg(options::OPT_fgnu_runtime) &&
3058 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3059 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003060 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003061
3062 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3063 !getToolChain().hasBlocksRuntime())
3064 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003065 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003066
Douglas Gregor226173a2012-01-18 15:19:58 +00003067 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3068 // users must also pass -fcxx-modules. The latter flag will disappear once the
3069 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003070 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003071 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3072 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3073 options::OPT_fno_cxx_modules,
3074 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003075 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003076 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003077 HaveModules = true;
3078 }
3079 }
3080
Daniel Jasper07e6c402013-08-05 20:26:17 +00003081 // -fmodule-maps enables module map processing (off by default) for header
3082 // checking. It is implied by -fmodules.
3083 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3084 false)) {
3085 CmdArgs.push_back("-fmodule-maps");
3086 }
3087
Daniel Jasperac42b752013-10-21 06:34:34 +00003088 // -fmodules-decluse checks that modules used are declared so (off by
3089 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003090 if (Args.hasFlag(options::OPT_fmodules_decluse,
3091 options::OPT_fno_modules_decluse,
3092 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003093 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003094 }
3095
Daniel Jasperac42b752013-10-21 06:34:34 +00003096 // -fmodule-name specifies the module that is currently being built (or
3097 // used for header checking by -fmodule-maps).
3098 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name)) {
3099 A->claim();
3100 A->render(Args, CmdArgs);
3101 }
3102
3103 // -fmodule-map-file can be used to specify a file containing module
3104 // definitions.
3105 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file)) {
3106 A->claim();
3107 A->render(Args, CmdArgs);
3108 }
3109
Douglas Gregor35b04d62013-02-07 19:01:24 +00003110 // If a module path was provided, pass it along. Otherwise, use a temporary
3111 // directory.
3112 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3113 A->claim();
3114 if (HaveModules) {
3115 A->render(Args, CmdArgs);
3116 }
3117 } else if (HaveModules) {
3118 SmallString<128> DefaultModuleCache;
3119 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3120 DefaultModuleCache);
Douglas Gregor23c7d672013-03-21 21:48:48 +00003121 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3122 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor4bedb492013-02-07 22:59:12 +00003123 const char Arg[] = "-fmodules-cache-path=";
3124 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3125 Arg, Arg + strlen(Arg));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003126 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3127 }
3128
3129 // Pass through all -fmodules-ignore-macro arguments.
3130 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003131 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3132 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003133
John McCalldfea9982010-04-09 19:12:06 +00003134 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003135 if (Args.hasFlag(options::OPT_fno_access_control,
3136 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003137 false))
John McCall3155f572010-04-09 19:03:51 +00003138 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003139
Anders Carlssond470fef2010-11-21 00:09:52 +00003140 // -felide-constructors is the default.
3141 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3142 options::OPT_felide_constructors,
3143 false))
3144 CmdArgs.push_back("-fno-elide-constructors");
3145
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003146 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003147 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00003148 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00003149 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00003150
Richard Smith52be6192012-11-05 22:04:41 +00003151 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003152 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00003153 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00003154 Args.getLastArg(options::OPT_mkernel,
3155 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00003156 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00003157 D.Diag(diag::err_drv_argument_not_allowed_with)
3158 << "-fsanitize=vptr" << NoRttiArg;
3159 }
3160 }
3161
Tony Linthicum76329bf2011-12-12 21:14:55 +00003162 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003163 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003164 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003165 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00003166 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003167 CmdArgs.push_back("-fshort-enums");
3168
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003169 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003170 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003171 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00003172 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00003173
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003174 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003175 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003176 options::OPT_fno_threadsafe_statics))
3177 CmdArgs.push_back("-fno-threadsafe-statics");
3178
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003179 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003180 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3181 options::OPT_fno_use_cxa_atexit,
3182 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00003183 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003184 getToolChain().getArch() != llvm::Triple::hexagon) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00003185 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003186 CmdArgs.push_back("-fno-use-cxa-atexit");
3187
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003188 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003189 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003190 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3191 CmdArgs.push_back("-fms-extensions");
3192
Francois Pichet1b4f1632011-09-17 04:32:15 +00003193 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003194 if (Args.hasFlag(options::OPT_fms_compatibility,
3195 options::OPT_fno_ms_compatibility,
3196 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3197 Args.hasFlag(options::OPT_fms_extensions,
3198 options::OPT_fno_ms_extensions,
3199 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003200 CmdArgs.push_back("-fms-compatibility");
3201
Reid Klecknerc106fda2013-09-18 00:33:59 +00003202 // -fmsc-version=1700 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003203 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3204 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3205 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003206 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003207 if (msc_ver.empty())
Reid Klecknerc106fda2013-09-18 00:33:59 +00003208 CmdArgs.push_back("-fmsc-version=1700");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003209 else
3210 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3211 }
3212
3213
Eric Christopher5ecce122013-02-18 00:38:31 +00003214 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00003215 if (Args.hasFlag(options::OPT_fborland_extensions,
3216 options::OPT_fno_borland_extensions, false))
3217 CmdArgs.push_back("-fborland-extensions");
3218
Francois Pichet02744872011-09-01 16:38:08 +00003219 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3220 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003221 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3222 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00003223 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003224 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003225
Chandler Carruthe03aa552010-04-17 20:17:31 +00003226 // -fgnu-keywords default varies depending on language; only pass if
3227 // specified.
3228 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003229 options::OPT_fno_gnu_keywords))
3230 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00003231
Rafael Espindola922a6242011-06-02 17:30:53 +00003232 if (Args.hasFlag(options::OPT_fgnu89_inline,
3233 options::OPT_fno_gnu89_inline,
3234 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00003235 CmdArgs.push_back("-fgnu89-inline");
3236
Chad Rosier9c76d242012-03-15 22:31:42 +00003237 if (Args.hasArg(options::OPT_fno_inline))
3238 CmdArgs.push_back("-fno-inline");
3239
Chad Rosier64d6be92012-03-06 21:17:19 +00003240 if (Args.hasArg(options::OPT_fno_inline_functions))
3241 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00003242
John McCall5fb5df92012-06-20 06:18:46 +00003243 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00003244
John McCall5fb5df92012-06-20 06:18:46 +00003245 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahaniandaf48312013-10-15 17:16:30 +00003246 // legacy is the default. Next runtime is always legacy dispatch and
3247 // -fno-objc-legacy-dispatch gets ignored silently.
3248 if (objcRuntime.isNonFragile() && !objcRuntime.isNeXTFamily()) {
David Chisnall3154e682011-09-30 13:32:35 +00003249 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3250 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00003251 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003252 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00003253 if (getToolChain().UseObjCMixedDispatch())
3254 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3255 else
3256 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3257 }
3258 }
3259
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00003260 // -fencode-extended-block-signature=1 is default.
3261 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3262 CmdArgs.push_back("-fencode-extended-block-signature");
3263 }
3264
John McCall24fc0de2011-07-06 00:26:06 +00003265 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3266 // NOTE: This logic is duplicated in ToolChains.cpp.
3267 bool ARC = isObjCAutoRefCount(Args);
3268 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00003269 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00003270
John McCall24fc0de2011-07-06 00:26:06 +00003271 CmdArgs.push_back("-fobjc-arc");
3272
Chandler Carruth491db322011-11-04 07:34:47 +00003273 // FIXME: It seems like this entire block, and several around it should be
3274 // wrapped in isObjC, but for now we just use it here as this is where it
3275 // was being used previously.
3276 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3277 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3278 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3279 else
3280 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3281 }
3282
John McCall24fc0de2011-07-06 00:26:06 +00003283 // Allow the user to enable full exceptions code emission.
3284 // We define off for Objective-CC, on for Objective-C++.
3285 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3286 options::OPT_fno_objc_arc_exceptions,
3287 /*default*/ types::isCXX(InputType)))
3288 CmdArgs.push_back("-fobjc-arc-exceptions");
3289 }
3290
3291 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3292 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00003293 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00003294 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003295
John McCall24fc0de2011-07-06 00:26:06 +00003296 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3297 // takes precedence.
3298 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3299 if (!GCArg)
3300 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3301 if (GCArg) {
3302 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003303 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00003304 << GCArg->getAsString(Args);
3305 } else if (getToolChain().SupportsObjCGC()) {
3306 GCArg->render(Args, CmdArgs);
3307 } else {
3308 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003309 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00003310 << GCArg->getAsString(Args);
3311 }
3312 }
3313
John McCallb5f652e2011-06-22 00:53:57 +00003314 // Add exception args.
3315 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00003316 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00003317
3318 if (getToolChain().UseSjLjExceptions())
3319 CmdArgs.push_back("-fsjlj-exceptions");
3320
3321 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00003322 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3323 options::OPT_fno_assume_sane_operator_new))
3324 CmdArgs.push_back("-fno-assume-sane-operator-new");
3325
Daniel Dunbar34d7a992010-04-27 15:34:57 +00003326 // -fconstant-cfstrings is default, and may be subject to argument translation
3327 // on Darwin.
3328 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3329 options::OPT_fno_constant_cfstrings) ||
3330 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3331 options::OPT_mno_constant_cfstrings))
3332 CmdArgs.push_back("-fno-constant-cfstrings");
3333
John Thompsoned4e2952009-11-05 20:14:16 +00003334 // -fshort-wchar default varies depending on platform; only
3335 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00003336 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3337 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00003338
Hans Wennborg28c96312013-07-31 23:39:13 +00003339 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003340 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003341 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003342 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003343 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003344
Daniel Dunbar096ed292011-10-05 21:04:55 +00003345 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3346 // -fno-pack-struct doesn't apply to -fpack-struct=.
3347 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00003348 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00003349 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00003350 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00003351 } else if (Args.hasFlag(options::OPT_fpack_struct,
3352 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00003353 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00003354 }
3355
Robert Lytton0e076492013-08-13 09:43:10 +00003356 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003357 if (!Args.hasArg(options::OPT_fcommon))
3358 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00003359 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003360 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00003361
Daniel Dunbard18049a2009-04-07 21:16:11 +00003362 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003363 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003364 CmdArgs.push_back("-fno-common");
3365
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003366 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00003367 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00003368 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003369 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003370 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003371 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3372
Daniel Dunbar6358d682010-10-15 22:30:42 +00003373 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3374 if (!Args.hasFlag(options::OPT_ffor_scope,
3375 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003376 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00003377 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3378
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00003379 // -fcaret-diagnostics is default.
3380 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3381 options::OPT_fno_caret_diagnostics, true))
3382 CmdArgs.push_back("-fno-caret-diagnostics");
3383
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003384 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00003385 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003386 options::OPT_fno_diagnostics_fixit_info))
3387 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003388
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003389 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00003390 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003391 options::OPT_fno_diagnostics_show_option))
3392 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003393
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003394 if (const Arg *A =
3395 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3396 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00003397 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003398 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003399
Douglas Gregor643c9222011-05-21 17:07:29 +00003400 if (const Arg *A =
3401 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3402 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003403 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003404 }
3405
Chandler Carruthb6766f02011-03-27 01:50:55 +00003406 if (Arg *A = Args.getLastArg(
3407 options::OPT_fdiagnostics_show_note_include_stack,
3408 options::OPT_fno_diagnostics_show_note_include_stack)) {
3409 if (A->getOption().matches(
3410 options::OPT_fdiagnostics_show_note_include_stack))
3411 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3412 else
3413 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3414 }
3415
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003416 // Color diagnostics are the default, unless the terminal doesn't support
3417 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00003418 // Support both clang's -f[no-]color-diagnostics and gcc's
3419 // -f[no-]diagnostics-colors[=never|always|auto].
3420 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3421 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3422 it != ie; ++it) {
3423 const Option &O = (*it)->getOption();
3424 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3425 !O.matches(options::OPT_fdiagnostics_color) &&
3426 !O.matches(options::OPT_fno_color_diagnostics) &&
3427 !O.matches(options::OPT_fno_diagnostics_color) &&
3428 !O.matches(options::OPT_fdiagnostics_color_EQ))
3429 continue;
3430
3431 (*it)->claim();
3432 if (O.matches(options::OPT_fcolor_diagnostics) ||
3433 O.matches(options::OPT_fdiagnostics_color)) {
3434 ShowColors = Colors_On;
3435 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3436 O.matches(options::OPT_fno_diagnostics_color)) {
3437 ShowColors = Colors_Off;
3438 } else {
3439 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3440 StringRef value((*it)->getValue());
3441 if (value == "always")
3442 ShowColors = Colors_On;
3443 else if (value == "never")
3444 ShowColors = Colors_Off;
3445 else if (value == "auto")
3446 ShowColors = Colors_Auto;
3447 else
3448 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3449 << ("-fdiagnostics-color=" + value).str();
3450 }
3451 }
3452 if (ShowColors == Colors_On ||
3453 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003454 CmdArgs.push_back("-fcolor-diagnostics");
3455
Nico Rieck7857d462013-09-11 00:38:02 +00003456 if (Args.hasArg(options::OPT_fansi_escape_codes))
3457 CmdArgs.push_back("-fansi-escape-codes");
3458
Daniel Dunbardb097022009-06-08 21:13:54 +00003459 if (!Args.hasFlag(options::OPT_fshow_source_location,
3460 options::OPT_fno_show_source_location))
3461 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003462
Douglas Gregor643c9222011-05-21 17:07:29 +00003463 if (!Args.hasFlag(options::OPT_fshow_column,
3464 options::OPT_fno_show_column,
3465 true))
3466 CmdArgs.push_back("-fno-show-column");
3467
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00003468 if (!Args.hasFlag(options::OPT_fspell_checking,
3469 options::OPT_fno_spell_checking))
3470 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003471
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003472
Chad Rosierc8e56e82012-12-05 21:08:21 +00003473 // -fno-asm-blocks is default.
3474 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3475 false))
3476 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003477
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003478 // Enable vectorization per default according to the optimization level
3479 // selected. For optimization levels that want vectorization we use the alias
3480 // option to simplify the hasFlag logic.
3481 bool EnableVec = shouldEnableVectorizerAtOLevel(Args);
3482 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00003483 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00003484 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00003485 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003486 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003487
Rafael Espindolaf818ef42013-08-01 23:56:42 +00003488 // -fslp-vectorize is default.
3489 if (Args.hasFlag(options::OPT_fslp_vectorize,
3490 options::OPT_fno_slp_vectorize, true))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00003491 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00003492
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003493 // -fno-slp-vectorize-aggressive is default.
3494 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003495 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003496 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003497
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00003498 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3499 A->render(Args, CmdArgs);
3500
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003501 // -fdollars-in-identifiers default varies depending on platform and
3502 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00003503 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003504 options::OPT_fno_dollars_in_identifiers)) {
3505 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003506 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003507 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003508 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003509 }
3510
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003511 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3512 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00003513 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003514 options::OPT_fno_unit_at_a_time)) {
3515 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003516 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003517 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003518
Eli Friedman055c9702011-11-02 01:53:16 +00003519 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3520 options::OPT_fno_apple_pragma_pack, false))
3521 CmdArgs.push_back("-fapple-pragma-pack");
3522
Eli Benderskyc95cfe82013-07-24 18:20:14 +00003523 // le32-specific flags:
3524 // -fno-math-builtin: clang should not convert math builtins to intrinsics
3525 // by default.
3526 if (getToolChain().getArch() == llvm::Triple::le32) {
3527 CmdArgs.push_back("-fno-math-builtin");
3528 }
3529
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003530 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003531 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003532 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003533#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003534 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003535 (getToolChain().getArch() == llvm::Triple::arm ||
3536 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003537 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3538 CmdArgs.push_back("-fno-builtin-strcat");
3539 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3540 CmdArgs.push_back("-fno-builtin-strcpy");
3541 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003542#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003543
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003544 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003545 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003546 options::OPT_traditional_cpp)) {
3547 if (isa<PreprocessJobAction>(JA))
3548 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003549 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003550 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003551 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003552
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003553 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003554 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003555
3556 // Handle serialized diagnostics.
3557 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3558 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003559 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003560 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003561
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003562 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3563 CmdArgs.push_back("-fretain-comments-from-system-headers");
3564
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003565 // Forward -fcomment-block-commands to -cc1.
3566 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00003567 // Forward -fparse-all-comments to -cc1.
3568 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003569
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003570 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3571 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003572 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003573 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3574 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003575 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003576
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003577 // We translate this by hand to the -cc1 argument, since nightly test uses
3578 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003579 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003580 CmdArgs.push_back("-disable-llvm-optzns");
3581 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003582 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003583 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003584
Daniel Dunbard67a3222009-03-30 06:36:42 +00003585 if (Output.getType() == types::TY_Dependencies) {
3586 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003587 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003588 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003589 CmdArgs.push_back(Output.getFilename());
3590 } else {
3591 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003592 }
3593
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003594 for (InputInfoList::const_iterator
3595 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3596 const InputInfo &II = *it;
3597 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00003598 if (Args.hasArg(options::OPT_rewrite_objc))
3599 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3600 else
3601 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00003602 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003603 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003604 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003605 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003606 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003607
Chris Lattnere9d7d782009-11-03 19:50:27 +00003608 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3609
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003610 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003611
3612 // Optionally embed the -cc1 level arguments into the debug info, for build
3613 // analysis.
3614 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003615 ArgStringList OriginalArgs;
3616 for (ArgList::const_iterator it = Args.begin(),
3617 ie = Args.end(); it != ie; ++it)
3618 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003619
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003620 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003621 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003622 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003623 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003624 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003625 }
3626 CmdArgs.push_back("-dwarf-debug-flags");
3627 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3628 }
3629
Eric Christopherd3804002013-02-22 20:12:52 +00003630 // Add the split debug info name to the command lines here so we
3631 // can propagate it to the backend.
3632 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003633 getToolChain().getTriple().isOSLinux() &&
Eric Christopherf1545832013-02-22 23:50:16 +00003634 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00003635 const char *SplitDwarfOut;
3636 if (SplitDwarf) {
3637 CmdArgs.push_back("-split-dwarf-file");
3638 SplitDwarfOut = SplitDebugName(Args, Inputs);
3639 CmdArgs.push_back(SplitDwarfOut);
3640 }
3641
3642 // Finally add the compile command to the compilation.
Hans Wennborg87cfa712013-09-19 20:32:16 +00003643 if (Args.hasArg(options::OPT__SLASH_fallback)) {
3644 tools::visualstudio::Compile CL(getToolChain());
3645 Command *CLCommand = CL.GetCommand(C, JA, Output, Inputs, Args,
3646 LinkingOutput);
3647 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
3648 } else {
3649 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3650 }
3651
Daniel Dunbar17731772009-03-23 19:03:36 +00003652
Eric Christopherf1545832013-02-22 23:50:16 +00003653 // Handle the debug info splitting at object creation time if we're
3654 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00003655 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00003656 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00003657 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00003658
Roman Divacky178e01602011-02-10 16:52:03 +00003659 if (Arg *A = Args.getLastArg(options::OPT_pg))
3660 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003661 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00003662 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003663
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003664 // Claim some arguments which clang supports automatically.
3665
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00003666 // -fpch-preprocess is used with gcc to add a special marker in the output to
3667 // include the PCH file. Clang's PTH solution is completely transparent, so we
3668 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003669 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003670
Daniel Dunbar17731772009-03-23 19:03:36 +00003671 // Claim some arguments which clang doesn't support, but we don't
3672 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003673 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3674 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00003675
Rafael Espindolab0092d72013-09-04 19:37:35 +00003676 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00003677 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003678}
3679
John McCall5fb5df92012-06-20 06:18:46 +00003680/// Add options related to the Objective-C runtime/ABI.
3681///
3682/// Returns true if the runtime is non-fragile.
3683ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3684 ArgStringList &cmdArgs,
3685 RewriteKind rewriteKind) const {
3686 // Look for the controlling runtime option.
3687 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3688 options::OPT_fgnu_runtime,
3689 options::OPT_fobjc_runtime_EQ);
3690
3691 // Just forward -fobjc-runtime= to the frontend. This supercedes
3692 // options about fragility.
3693 if (runtimeArg &&
3694 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3695 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003696 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003697 if (runtime.tryParse(value)) {
3698 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3699 << value;
3700 }
3701
3702 runtimeArg->render(args, cmdArgs);
3703 return runtime;
3704 }
3705
3706 // Otherwise, we'll need the ABI "version". Version numbers are
3707 // slightly confusing for historical reasons:
3708 // 1 - Traditional "fragile" ABI
3709 // 2 - Non-fragile ABI, version 1
3710 // 3 - Non-fragile ABI, version 2
3711 unsigned objcABIVersion = 1;
3712 // If -fobjc-abi-version= is present, use that to set the version.
3713 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003714 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003715 if (value == "1")
3716 objcABIVersion = 1;
3717 else if (value == "2")
3718 objcABIVersion = 2;
3719 else if (value == "3")
3720 objcABIVersion = 3;
3721 else
3722 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3723 << value;
3724 } else {
3725 // Otherwise, determine if we are using the non-fragile ABI.
3726 bool nonFragileABIIsDefault =
3727 (rewriteKind == RK_NonFragile ||
3728 (rewriteKind == RK_None &&
3729 getToolChain().IsObjCNonFragileABIDefault()));
3730 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3731 options::OPT_fno_objc_nonfragile_abi,
3732 nonFragileABIIsDefault)) {
3733 // Determine the non-fragile ABI version to use.
3734#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3735 unsigned nonFragileABIVersion = 1;
3736#else
3737 unsigned nonFragileABIVersion = 2;
3738#endif
3739
3740 if (Arg *abiArg = args.getLastArg(
3741 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003742 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003743 if (value == "1")
3744 nonFragileABIVersion = 1;
3745 else if (value == "2")
3746 nonFragileABIVersion = 2;
3747 else
3748 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3749 << value;
3750 }
3751
3752 objcABIVersion = 1 + nonFragileABIVersion;
3753 } else {
3754 objcABIVersion = 1;
3755 }
3756 }
3757
3758 // We don't actually care about the ABI version other than whether
3759 // it's non-fragile.
3760 bool isNonFragile = objcABIVersion != 1;
3761
3762 // If we have no runtime argument, ask the toolchain for its default runtime.
3763 // However, the rewriter only really supports the Mac runtime, so assume that.
3764 ObjCRuntime runtime;
3765 if (!runtimeArg) {
3766 switch (rewriteKind) {
3767 case RK_None:
3768 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3769 break;
3770 case RK_Fragile:
3771 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3772 break;
3773 case RK_NonFragile:
3774 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3775 break;
3776 }
3777
3778 // -fnext-runtime
3779 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3780 // On Darwin, make this use the default behavior for the toolchain.
3781 if (getToolChain().getTriple().isOSDarwin()) {
3782 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3783
3784 // Otherwise, build for a generic macosx port.
3785 } else {
3786 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3787 }
3788
3789 // -fgnu-runtime
3790 } else {
3791 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003792 // Legacy behaviour is to target the gnustep runtime if we are i
3793 // non-fragile mode or the GCC runtime in fragile mode.
3794 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003795 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003796 else
3797 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003798 }
3799
3800 cmdArgs.push_back(args.MakeArgString(
3801 "-fobjc-runtime=" + runtime.getAsString()));
3802 return runtime;
3803}
3804
Hans Wennborg75958c42013-08-08 00:17:41 +00003805void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
3806 unsigned RTOptionID = options::OPT__SLASH_MT;
3807
Hans Wennborgf1a74252013-09-10 20:18:04 +00003808 if (Args.hasArg(options::OPT__SLASH_LDd))
3809 // The /LDd option implies /MTd. The dependent lib part can be overridden,
3810 // but defining _DEBUG is sticky.
3811 RTOptionID = options::OPT__SLASH_MTd;
3812
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00003813 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00003814 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00003815
Hans Wennborg75958c42013-08-08 00:17:41 +00003816 switch(RTOptionID) {
3817 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00003818 if (Args.hasArg(options::OPT__SLASH_LDd))
3819 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00003820 CmdArgs.push_back("-D_MT");
3821 CmdArgs.push_back("-D_DLL");
3822 CmdArgs.push_back("--dependent-lib=msvcrt");
3823 break;
3824 case options::OPT__SLASH_MDd:
3825 CmdArgs.push_back("-D_DEBUG");
3826 CmdArgs.push_back("-D_MT");
3827 CmdArgs.push_back("-D_DLL");
3828 CmdArgs.push_back("--dependent-lib=msvcrtd");
3829 break;
3830 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00003831 if (Args.hasArg(options::OPT__SLASH_LDd))
3832 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00003833 CmdArgs.push_back("-D_MT");
3834 CmdArgs.push_back("--dependent-lib=libcmt");
3835 break;
3836 case options::OPT__SLASH_MTd:
3837 CmdArgs.push_back("-D_DEBUG");
3838 CmdArgs.push_back("-D_MT");
3839 CmdArgs.push_back("--dependent-lib=libcmtd");
3840 break;
3841 default:
3842 llvm_unreachable("Unexpected option ID.");
3843 }
3844
Reid Kleckner6beca0e2013-08-08 19:33:10 +00003845 // This provides POSIX compatibility (maps 'open' to '_open'), which most
3846 // users want. The /Za flag to cl.exe turns this off, but it's not
3847 // implemented in clang.
3848 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00003849
3850 // FIXME: Make this default for the win32 triple.
3851 CmdArgs.push_back("-cxx-abi");
3852 CmdArgs.push_back("microsoft");
Hans Wennborg0fd62072013-08-09 00:32:23 +00003853
3854 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
3855 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00003856
3857 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
3858 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00003859 if (Args.hasArg(options::OPT__SLASH_fallback))
3860 CmdArgs.push_back("msvc-fallback");
3861 else
3862 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00003863 }
Hans Wennborg75958c42013-08-08 00:17:41 +00003864}
3865
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003866void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003867 const InputInfo &Output,
3868 const InputInfoList &Inputs,
3869 const ArgList &Args,
3870 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003871 ArgStringList CmdArgs;
3872
3873 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3874 const InputInfo &Input = Inputs[0];
3875
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003876 // Don't warn about "clang -w -c foo.s"
3877 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003878 // and "clang -emit-llvm -c foo.s"
3879 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003880
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003881 // Invoke ourselves in -cc1as mode.
3882 //
3883 // FIXME: Implement custom jobs for internal actions.
3884 CmdArgs.push_back("-cc1as");
3885
3886 // Add the "effective" target triple.
3887 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003888 std::string TripleStr =
3889 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003890 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3891
3892 // Set the output mode, we currently only expect to be used as a real
3893 // assembler.
3894 CmdArgs.push_back("-filetype");
3895 CmdArgs.push_back("obj");
3896
Eric Christopher45f2e712012-12-18 00:31:10 +00003897 // Set the main file name, so that debug info works even with
3898 // -save-temps or preprocessed assembly.
3899 CmdArgs.push_back("-main-file-name");
3900 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3901
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003902 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003903 const llvm::Triple &Triple = getToolChain().getTriple();
3904 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003905 if (!CPU.empty()) {
3906 CmdArgs.push_back("-target-cpu");
3907 CmdArgs.push_back(Args.MakeArgString(CPU));
3908 }
3909
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003910 // Add the target features
3911 const Driver &D = getToolChain().getDriver();
3912 getTargetFeatures(D, Triple, Args, CmdArgs);
Jim Grosbach576452b2012-02-10 20:37:10 +00003913
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003914 // Ignore explicit -force_cpusubtype_ALL option.
3915 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003916
Eric Christopherfc3ee562012-01-10 00:38:01 +00003917 // Determine the original source input.
3918 const Action *SourceAction = &JA;
3919 while (SourceAction->getKind() != Action::InputClass) {
3920 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3921 SourceAction = SourceAction->getInputs()[0];
3922 }
3923
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003924 // Forward -g and handle debug info related flags, assuming we are dealing
3925 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00003926 if (SourceAction->getType() == types::TY_Asm ||
3927 SourceAction->getType() == types::TY_PP_Asm) {
3928 Args.ClaimAllArgs(options::OPT_g_Group);
3929 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3930 if (!A->getOption().matches(options::OPT_g0))
3931 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003932
3933 // Add the -fdebug-compilation-dir flag if needed.
3934 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00003935
3936 // Set the AT_producer to the clang version when using the integrated
3937 // assembler on assembly source files.
3938 CmdArgs.push_back("-dwarf-debug-producer");
3939 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00003940 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003941
3942 // Optionally embed the -cc1as level arguments into the debug info, for build
3943 // analysis.
3944 if (getToolChain().UseDwarfDebugFlags()) {
3945 ArgStringList OriginalArgs;
3946 for (ArgList::const_iterator it = Args.begin(),
3947 ie = Args.end(); it != ie; ++it)
3948 (*it)->render(Args, OriginalArgs);
3949
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003950 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003951 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3952 Flags += Exec;
3953 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3954 Flags += " ";
3955 Flags += OriginalArgs[i];
3956 }
3957 CmdArgs.push_back("-dwarf-debug-flags");
3958 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3959 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003960
3961 // FIXME: Add -static support, once we have it.
3962
David Blaikie9260ed62013-07-25 21:19:01 +00003963 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
3964 getToolChain().getDriver());
3965
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003966 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003967
3968 assert(Output.isFilename() && "Unexpected lipo output.");
3969 CmdArgs.push_back("-o");
3970 CmdArgs.push_back(Output.getFilename());
3971
Daniel Dunbarb440f562010-08-02 02:38:21 +00003972 assert(Input.isFilename() && "Invalid input.");
3973 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003974
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003975 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003976 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00003977
3978 // Handle the debug info splitting at object creation time if we're
3979 // creating an object.
3980 // TODO: Currently only works on linux with newer objcopy.
3981 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003982 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00003983 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
3984 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003985}
3986
Daniel Dunbara3246a02009-03-18 08:07:30 +00003987void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003988 const InputInfo &Output,
3989 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003990 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003991 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003992 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003993 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003994
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003995 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003996 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003997 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00003998 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003999 // Don't forward any -g arguments to assembly steps.
4000 if (isa<AssembleJobAction>(JA) &&
4001 A->getOption().matches(options::OPT_g_Group))
4002 continue;
4003
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00004004 // Don't forward any -W arguments to assembly and link steps.
4005 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4006 A->getOption().matches(options::OPT_W_Group))
4007 continue;
4008
Daniel Dunbar2da02722009-03-19 07:55:12 +00004009 // It is unfortunate that we have to claim here, as this means
4010 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00004011 // platforms using a generic gcc, even if we are just using gcc
4012 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00004013 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004014 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00004015 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004016 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004017
Daniel Dunbar4e295052010-01-25 22:35:08 +00004018 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004019
4020 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004021 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00004022 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004023 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00004024
4025 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004026 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004027 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004028 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004029 CmdArgs.push_back("ppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00004030 else if (Arch == llvm::Triple::ppc64le)
4031 CmdArgs.push_back("ppc64le");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004032 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004033 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00004034 }
4035
Daniel Dunbar5716d872009-05-02 21:41:52 +00004036 // Try to force gcc to match the tool chain we want, if we recognize
4037 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004038 //
4039 // FIXME: The triple class should directly provide the information we want
4040 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004041 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004042 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00004043 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4044 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004045 CmdArgs.push_back("-m64");
4046
Daniel Dunbarb440f562010-08-02 02:38:21 +00004047 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004048 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004049 CmdArgs.push_back(Output.getFilename());
4050 } else {
4051 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004052 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004053 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004054
Tony Linthicum76329bf2011-12-12 21:14:55 +00004055 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4056 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004057
4058 // Only pass -x if gcc will understand it; otherwise hope gcc
4059 // understands the suffix correctly. The main use case this would go
4060 // wrong in is for linker inputs if they happened to have an odd
4061 // suffix; really the only way to get this to happen is a command
4062 // like '-x foobar a.c' which will treat a.c like a linker input.
4063 //
4064 // FIXME: For the linker case specifically, can we safely convert
4065 // inputs into '-Wl,' options?
4066 for (InputInfoList::const_iterator
4067 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4068 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004069
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004070 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004071 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4072 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004073 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004074 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004075 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004076 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004077 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004078 else if (II.getType() == types::TY_ModuleFile)
4079 D.Diag(diag::err_drv_no_module_support)
4080 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004081
Daniel Dunbara3246a02009-03-18 08:07:30 +00004082 if (types::canTypeBeUserSpecified(II.getType())) {
4083 CmdArgs.push_back("-x");
4084 CmdArgs.push_back(types::getTypeName(II.getType()));
4085 }
4086
Daniel Dunbarb440f562010-08-02 02:38:21 +00004087 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004088 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00004089 else {
4090 const Arg &A = II.getInputArg();
4091
4092 // Reverse translate some rewritten options.
4093 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4094 CmdArgs.push_back("-lstdc++");
4095 continue;
4096 }
4097
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004098 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00004099 A.render(Args, CmdArgs);
4100 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004101 }
4102
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004103 const std::string customGCCName = D.getCCCGenericGCCName();
4104 const char *GCCName;
4105 if (!customGCCName.empty())
4106 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00004107 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004108 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004109 } else
4110 GCCName = "gcc";
4111
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004112 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004113 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004114 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004115}
4116
Daniel Dunbar4e295052010-01-25 22:35:08 +00004117void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4118 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004119 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004120}
4121
Daniel Dunbar4e295052010-01-25 22:35:08 +00004122void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
4123 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004124 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004125}
4126
Daniel Dunbar4e295052010-01-25 22:35:08 +00004127void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4128 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004129 const Driver &D = getToolChain().getDriver();
4130
Daniel Dunbar4e295052010-01-25 22:35:08 +00004131 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004132 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4133 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00004134 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004135 else {
4136 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004137 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004138 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004139
Daniel Dunbar4e295052010-01-25 22:35:08 +00004140 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004141 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004142}
4143
Daniel Dunbar4e295052010-01-25 22:35:08 +00004144void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
4145 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004146 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004147}
Daniel Dunbara3246a02009-03-18 08:07:30 +00004148
Daniel Dunbar4e295052010-01-25 22:35:08 +00004149void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4150 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004151 // The types are (hopefully) good enough.
4152}
4153
Tony Linthicum76329bf2011-12-12 21:14:55 +00004154// Hexagon tools start.
4155void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4156 ArgStringList &CmdArgs) const {
4157
4158}
4159void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4160 const InputInfo &Output,
4161 const InputInfoList &Inputs,
4162 const ArgList &Args,
4163 const char *LinkingOutput) const {
4164
4165 const Driver &D = getToolChain().getDriver();
4166 ArgStringList CmdArgs;
4167
4168 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00004169 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00004170 CmdArgs.push_back(Args.MakeArgString(MarchString));
4171
4172 RenderExtraToolArgs(JA, CmdArgs);
4173
4174 if (Output.isFilename()) {
4175 CmdArgs.push_back("-o");
4176 CmdArgs.push_back(Output.getFilename());
4177 } else {
4178 assert(Output.isNothing() && "Unexpected output");
4179 CmdArgs.push_back("-fsyntax-only");
4180 }
4181
Matthew Curtise8f80a12012-12-06 17:49:03 +00004182 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4183 if (!SmallDataThreshold.empty())
4184 CmdArgs.push_back(
4185 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004186
Matthew Curtise5df3812012-12-07 17:23:04 +00004187 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4188 options::OPT_Xassembler);
4189
Tony Linthicum76329bf2011-12-12 21:14:55 +00004190 // Only pass -x if gcc will understand it; otherwise hope gcc
4191 // understands the suffix correctly. The main use case this would go
4192 // wrong in is for linker inputs if they happened to have an odd
4193 // suffix; really the only way to get this to happen is a command
4194 // like '-x foobar a.c' which will treat a.c like a linker input.
4195 //
4196 // FIXME: For the linker case specifically, can we safely convert
4197 // inputs into '-Wl,' options?
4198 for (InputInfoList::const_iterator
4199 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4200 const InputInfo &II = *it;
4201
4202 // Don't try to pass LLVM or AST inputs to a generic gcc.
4203 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4204 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4205 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4206 << getToolChain().getTripleString();
4207 else if (II.getType() == types::TY_AST)
4208 D.Diag(clang::diag::err_drv_no_ast_support)
4209 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004210 else if (II.getType() == types::TY_ModuleFile)
4211 D.Diag(diag::err_drv_no_module_support)
4212 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00004213
4214 if (II.isFilename())
4215 CmdArgs.push_back(II.getFilename());
4216 else
4217 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4218 II.getInputArg().render(Args, CmdArgs);
4219 }
4220
4221 const char *GCCName = "hexagon-as";
4222 const char *Exec =
4223 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4224 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4225
4226}
4227void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4228 ArgStringList &CmdArgs) const {
4229 // The types are (hopefully) good enough.
4230}
4231
4232void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4233 const InputInfo &Output,
4234 const InputInfoList &Inputs,
4235 const ArgList &Args,
4236 const char *LinkingOutput) const {
4237
Matthew Curtise689b052012-12-06 15:46:07 +00004238 const toolchains::Hexagon_TC& ToolChain =
4239 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4240 const Driver &D = ToolChain.getDriver();
4241
Tony Linthicum76329bf2011-12-12 21:14:55 +00004242 ArgStringList CmdArgs;
4243
Matthew Curtise689b052012-12-06 15:46:07 +00004244 //----------------------------------------------------------------------------
4245 //
4246 //----------------------------------------------------------------------------
4247 bool hasStaticArg = Args.hasArg(options::OPT_static);
4248 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00004249 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00004250 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4251 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4252 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4253 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004254
Matthew Curtise689b052012-12-06 15:46:07 +00004255 //----------------------------------------------------------------------------
4256 // Silence warnings for various options
4257 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00004258
Matthew Curtise689b052012-12-06 15:46:07 +00004259 Args.ClaimAllArgs(options::OPT_g_Group);
4260 Args.ClaimAllArgs(options::OPT_emit_llvm);
4261 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4262 // handled somewhere else.
4263 Args.ClaimAllArgs(options::OPT_static_libgcc);
4264
4265 //----------------------------------------------------------------------------
4266 //
4267 //----------------------------------------------------------------------------
4268 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4269 e = ToolChain.ExtraOpts.end();
4270 i != e; ++i)
4271 CmdArgs.push_back(i->c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004272
Matthew Curtisf10a5952012-12-06 14:16:43 +00004273 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4274 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00004275
Matthew Curtise689b052012-12-06 15:46:07 +00004276 if (buildingLib) {
4277 CmdArgs.push_back("-shared");
4278 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4279 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00004280 }
4281
Matthew Curtise689b052012-12-06 15:46:07 +00004282 if (hasStaticArg)
4283 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004284
Matthew Curtise8f80a12012-12-06 17:49:03 +00004285 if (buildPIE && !buildingLib)
4286 CmdArgs.push_back("-pie");
4287
4288 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4289 if (!SmallDataThreshold.empty()) {
4290 CmdArgs.push_back(
4291 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4292 }
4293
Matthew Curtise689b052012-12-06 15:46:07 +00004294 //----------------------------------------------------------------------------
4295 //
4296 //----------------------------------------------------------------------------
4297 CmdArgs.push_back("-o");
4298 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004299
Matthew Curtise689b052012-12-06 15:46:07 +00004300 const std::string MarchSuffix = "/" + MarchString;
4301 const std::string G0Suffix = "/G0";
4302 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4303 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4304 + "/";
4305 const std::string StartFilesDir = RootDir
4306 + "hexagon/lib"
4307 + (buildingLib
4308 ? MarchG0Suffix : MarchSuffix);
4309
4310 //----------------------------------------------------------------------------
4311 // moslib
4312 //----------------------------------------------------------------------------
4313 std::vector<std::string> oslibs;
4314 bool hasStandalone= false;
4315
4316 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4317 ie = Args.filtered_end(); it != ie; ++it) {
4318 (*it)->claim();
4319 oslibs.push_back((*it)->getValue());
4320 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004321 }
Matthew Curtise689b052012-12-06 15:46:07 +00004322 if (oslibs.empty()) {
4323 oslibs.push_back("standalone");
4324 hasStandalone = true;
4325 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004326
Matthew Curtise689b052012-12-06 15:46:07 +00004327 //----------------------------------------------------------------------------
4328 // Start Files
4329 //----------------------------------------------------------------------------
4330 if (incStdLib && incStartFiles) {
4331
4332 if (!buildingLib) {
4333 if (hasStandalone) {
4334 CmdArgs.push_back(
4335 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4336 }
4337 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4338 }
4339 std::string initObj = useShared ? "/initS.o" : "/init.o";
4340 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4341 }
4342
4343 //----------------------------------------------------------------------------
4344 // Library Search Paths
4345 //----------------------------------------------------------------------------
4346 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4347 for (ToolChain::path_list::const_iterator
4348 i = LibPaths.begin(),
4349 e = LibPaths.end();
4350 i != e;
4351 ++i)
4352 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4353
4354 //----------------------------------------------------------------------------
4355 //
4356 //----------------------------------------------------------------------------
4357 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4358 Args.AddAllArgs(CmdArgs, options::OPT_e);
4359 Args.AddAllArgs(CmdArgs, options::OPT_s);
4360 Args.AddAllArgs(CmdArgs, options::OPT_t);
4361 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4362
4363 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4364
4365 //----------------------------------------------------------------------------
4366 // Libraries
4367 //----------------------------------------------------------------------------
4368 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00004369 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00004370 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4371 CmdArgs.push_back("-lm");
4372 }
4373
4374 CmdArgs.push_back("--start-group");
4375
4376 if (!buildingLib) {
4377 for(std::vector<std::string>::iterator i = oslibs.begin(),
4378 e = oslibs.end(); i != e; ++i)
4379 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4380 CmdArgs.push_back("-lc");
4381 }
4382 CmdArgs.push_back("-lgcc");
4383
4384 CmdArgs.push_back("--end-group");
4385 }
4386
4387 //----------------------------------------------------------------------------
4388 // End files
4389 //----------------------------------------------------------------------------
4390 if (incStdLib && incStartFiles) {
4391 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4392 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4393 }
4394
4395 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00004396 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004397}
4398// Hexagon tools end.
4399
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004400llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4401 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4402 // archs which Darwin doesn't use.
4403
4404 // The matching this routine does is fairly pointless, since it is neither the
4405 // complete architecture list, nor a reasonable subset. The problem is that
4406 // historically the driver driver accepts this and also ties its -march=
4407 // handling to the architecture name, so we need to be careful before removing
4408 // support for it.
4409
4410 // This code must be kept in sync with Clang's Darwin specific argument
4411 // translation.
4412
4413 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4414 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4415 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4416 .Case("ppc64", llvm::Triple::ppc64)
4417 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4418 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4419 llvm::Triple::x86)
4420 .Case("x86_64", llvm::Triple::x86_64)
4421 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00004422 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4423 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4424 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004425 .Case("r600", llvm::Triple::r600)
4426 .Case("nvptx", llvm::Triple::nvptx)
4427 .Case("nvptx64", llvm::Triple::nvptx64)
4428 .Case("amdil", llvm::Triple::amdil)
4429 .Case("spir", llvm::Triple::spir)
4430 .Default(llvm::Triple::UnknownArch);
4431}
Tony Linthicum76329bf2011-12-12 21:14:55 +00004432
Bob Wilsondecc03e2012-11-23 06:14:39 +00004433const char *Clang::getBaseInputName(const ArgList &Args,
4434 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00004435 return Args.MakeArgString(
4436 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004437}
4438
Bob Wilsondecc03e2012-11-23 06:14:39 +00004439const char *Clang::getBaseInputStem(const ArgList &Args,
4440 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004441 const char *Str = getBaseInputName(Args, Inputs);
4442
Chris Lattner906bb902011-01-16 08:14:11 +00004443 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004444 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004445
4446 return Str;
4447}
4448
Bob Wilsondecc03e2012-11-23 06:14:39 +00004449const char *Clang::getDependencyFileName(const ArgList &Args,
4450 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004451 // FIXME: Think about this more.
4452 std::string Res;
4453
4454 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004455 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004456 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004457 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00004458 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004459 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004460 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004461}
4462
Daniel Dunbarbe220842009-03-20 16:06:39 +00004463void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004464 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004465 const InputInfoList &Inputs,
4466 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004467 const char *LinkingOutput) const {
4468 ArgStringList CmdArgs;
4469
4470 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4471 const InputInfo &Input = Inputs[0];
4472
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004473 // Determine the original source input.
4474 const Action *SourceAction = &JA;
4475 while (SourceAction->getKind() != Action::InputClass) {
4476 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4477 SourceAction = SourceAction->getInputs()[0];
4478 }
4479
4480 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004481 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004482 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004483 if (Args.hasArg(options::OPT_gstabs))
4484 CmdArgs.push_back("--gstabs");
4485 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004486 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004487 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004488
Daniel Dunbarbe220842009-03-20 16:06:39 +00004489 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004490 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004491
Daniel Dunbar6d484762010-07-22 01:47:22 +00004492 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004493 if (getToolChain().getArch() == llvm::Triple::x86 ||
4494 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004495 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4496 CmdArgs.push_back("-force_cpusubtype_ALL");
4497
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004498 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004499 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00004500 Args.hasArg(options::OPT_fapple_kext)) &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004501 (!getDarwinToolChain().isTargetIPhoneOS() ||
4502 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4503 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004504 CmdArgs.push_back("-static");
4505
Daniel Dunbarbe220842009-03-20 16:06:39 +00004506 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4507 options::OPT_Xassembler);
4508
4509 assert(Output.isFilename() && "Unexpected lipo output.");
4510 CmdArgs.push_back("-o");
4511 CmdArgs.push_back(Output.getFilename());
4512
Daniel Dunbarb440f562010-08-02 02:38:21 +00004513 assert(Input.isFilename() && "Invalid input.");
4514 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004515
4516 // asm_final spec is empty.
4517
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004518 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004519 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004520 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004521}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004522
David Blaikie68e081d2011-12-20 02:48:34 +00004523void darwin::DarwinTool::anchor() {}
4524
Daniel Dunbare9ded432009-09-09 18:36:20 +00004525void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4526 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004527 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004528
Daniel Dunbarc1964212009-03-26 16:23:12 +00004529 // Derived from darwin_arch spec.
4530 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004531 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004532
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004533 // FIXME: Is this needed anymore?
4534 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004535 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004536}
4537
Bill Wendling3b2000f2012-10-02 18:02:50 +00004538bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4539 // We only need to generate a temp path for LTO if we aren't compiling object
4540 // files. When compiling source files, we run 'dsymutil' after linking. We
4541 // don't run 'dsymutil' when compiling object files.
4542 for (InputInfoList::const_iterator
4543 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4544 if (it->getType() != types::TY_Object)
4545 return true;
4546
4547 return false;
4548}
4549
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004550void darwin::Link::AddLinkArgs(Compilation &C,
4551 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004552 ArgStringList &CmdArgs,
4553 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004554 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004555 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004556
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004557 unsigned Version[3] = { 0, 0, 0 };
4558 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4559 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00004560 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004561 Version[1], Version[2], HadExtra) ||
4562 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004563 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004564 << A->getAsString(Args);
4565 }
4566
4567 // Newer linkers support -demangle, pass it if supported and not disabled by
4568 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004569 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004570 // Don't pass -demangle to ld_classic.
4571 //
4572 // FIXME: This is a temporary workaround, ld should be handling this.
4573 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4574 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004575 if (getToolChain().getArch() == llvm::Triple::x86) {
4576 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4577 options::OPT_Wl_COMMA),
4578 ie = Args.filtered_end(); it != ie; ++it) {
4579 const Arg *A = *it;
4580 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smithbd55daf2012-11-01 04:30:05 +00004581 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004582 UsesLdClassic = true;
4583 }
4584 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004585 if (!UsesLdClassic)
4586 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004587 }
4588
Bob Wilson3d27dad2013-08-02 22:25:34 +00004589 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
4590 CmdArgs.push_back("-export_dynamic");
4591
Bill Wendling313b6bf2012-11-16 23:03:00 +00004592 // If we are using LTO, then automatically create a temporary file path for
4593 // the linker to use, so that it's lifetime will extend past a possible
4594 // dsymutil step.
4595 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4596 const char *TmpPath = C.getArgs().MakeArgString(
4597 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4598 C.addTempFile(TmpPath);
4599 CmdArgs.push_back("-object_path_lto");
4600 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00004601 }
4602
Daniel Dunbarc1964212009-03-26 16:23:12 +00004603 // Derived from the "link" spec.
4604 Args.AddAllArgs(CmdArgs, options::OPT_static);
4605 if (!Args.hasArg(options::OPT_static))
4606 CmdArgs.push_back("-dynamic");
4607 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4608 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4609 // here. How do we wish to handle such things?
4610 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004611
Daniel Dunbarc1964212009-03-26 16:23:12 +00004612 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004613 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004614 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004615 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004616
4617 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4618 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4619 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4620
4621 Arg *A;
4622 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4623 (A = Args.getLastArg(options::OPT_current__version)) ||
4624 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004625 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004626 << A->getAsString(Args) << "-dynamiclib";
4627
4628 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4629 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4630 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4631 } else {
4632 CmdArgs.push_back("-dylib");
4633
4634 Arg *A;
4635 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4636 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4637 (A = Args.getLastArg(options::OPT_client__name)) ||
4638 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4639 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4640 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004641 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004642 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004643
Daniel Dunbarc1964212009-03-26 16:23:12 +00004644 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4645 "-dylib_compatibility_version");
4646 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4647 "-dylib_current_version");
4648
Daniel Dunbara48823f2010-01-22 02:04:52 +00004649 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004650
4651 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4652 "-dylib_install_name");
4653 }
4654
4655 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4656 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4657 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004658 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004659 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004660 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4661 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4662 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4663 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4664 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4665 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004666 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004667 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4668 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4669 Args.AddAllArgs(CmdArgs, options::OPT_init);
4670
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004671 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004672 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004673
4674 // If we had an explicit -mios-simulator-version-min argument, honor that,
4675 // otherwise use the traditional deployment targets. We can't just check the
4676 // is-sim attribute because existing code follows this path, and the linker
4677 // may not handle the argument.
4678 //
4679 // FIXME: We may be able to remove this, once we can verify no one depends on
4680 // it.
4681 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4682 CmdArgs.push_back("-ios_simulator_version_min");
4683 else if (DarwinTC.isTargetIPhoneOS())
4684 CmdArgs.push_back("-iphoneos_version_min");
4685 else
4686 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004687 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004688
Daniel Dunbarc1964212009-03-26 16:23:12 +00004689 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4690 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4691 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4692 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4693 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004694
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004695 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4696 options::OPT_fno_pie,
4697 options::OPT_fno_PIE)) {
4698 if (A->getOption().matches(options::OPT_fpie) ||
4699 A->getOption().matches(options::OPT_fPIE))
4700 CmdArgs.push_back("-pie");
4701 else
4702 CmdArgs.push_back("-no_pie");
4703 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004704
4705 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4706 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4707 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4708 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4709 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4710 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4711 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4712 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4713 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4714 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4715 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4716 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4717 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4718 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4719 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4720 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004721
Daniel Dunbar84384642011-05-02 21:03:47 +00004722 // Give --sysroot= preference, over the Apple specific behavior to also use
4723 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004724 StringRef sysroot = C.getSysRoot();
4725 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004726 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004727 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004728 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4729 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00004730 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004731 }
4732
Daniel Dunbarc1964212009-03-26 16:23:12 +00004733 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4734 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4735 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4736 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4737 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004738 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004739 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4740 Args.AddAllArgs(CmdArgs, options::OPT_y);
4741 Args.AddLastArg(CmdArgs, options::OPT_w);
4742 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4743 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4744 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4745 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4746 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4747 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4748 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4749 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4750 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4751 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4752 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4753 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4754}
4755
4756void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004757 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004758 const InputInfoList &Inputs,
4759 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004760 const char *LinkingOutput) const {
4761 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004762
Daniel Dunbarc1964212009-03-26 16:23:12 +00004763 // The logic here is derived from gcc's behavior; most of which
4764 // comes from specs (starting with link_command). Consult gcc for
4765 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004766 ArgStringList CmdArgs;
4767
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004768 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4769 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4770 options::OPT_ccc_arcmt_migrate)) {
4771 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4772 (*I)->claim();
4773 const char *Exec =
4774 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4775 CmdArgs.push_back(Output.getFilename());
4776 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4777 return;
4778 }
4779
Daniel Dunbarc1964212009-03-26 16:23:12 +00004780 // I'm not sure why this particular decomposition exists in gcc, but
4781 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004782 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004783
Daniel Dunbarc1964212009-03-26 16:23:12 +00004784 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4785 Args.AddAllArgs(CmdArgs, options::OPT_s);
4786 Args.AddAllArgs(CmdArgs, options::OPT_t);
4787 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4788 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004789 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004790 Args.AddAllArgs(CmdArgs, options::OPT_r);
4791
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004792 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4793 // members of static archive libraries which implement Objective-C classes or
4794 // categories.
4795 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4796 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004797
Daniel Dunbarc1964212009-03-26 16:23:12 +00004798 CmdArgs.push_back("-o");
4799 CmdArgs.push_back(Output.getFilename());
4800
Chad Rosier06fd3c62012-05-16 23:45:12 +00004801 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004802 !Args.hasArg(options::OPT_nostartfiles)) {
4803 // Derived from startfile spec.
4804 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004805 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004806 if (getDarwinToolChain().isTargetIOSSimulator()) {
4807 // The simulator doesn't have a versioned crt1 file.
4808 CmdArgs.push_back("-ldylib1.o");
4809 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004810 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4811 CmdArgs.push_back("-ldylib1.o");
4812 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004813 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004814 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004815 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004816 CmdArgs.push_back("-ldylib1.10.5.o");
4817 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004818 } else {
4819 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004820 if (!Args.hasArg(options::OPT_static)) {
4821 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004822 if (getDarwinToolChain().isTargetIOSSimulator()) {
4823 // The simulator doesn't have a versioned crt1 file.
4824 CmdArgs.push_back("-lbundle1.o");
4825 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004826 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4827 CmdArgs.push_back("-lbundle1.o");
4828 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004829 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004830 CmdArgs.push_back("-lbundle1.o");
4831 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004832 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004833 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004834 if (Args.hasArg(options::OPT_pg) &&
4835 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004836 if (Args.hasArg(options::OPT_static) ||
4837 Args.hasArg(options::OPT_object) ||
4838 Args.hasArg(options::OPT_preload)) {
4839 CmdArgs.push_back("-lgcrt0.o");
4840 } else {
4841 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004842
Daniel Dunbarc1964212009-03-26 16:23:12 +00004843 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004844 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004845 // By default on OS X 10.8 and later, we don't link with a crt1.o
4846 // file and the linker knows to use _main as the entry point. But,
4847 // when compiling with -pg, we need to link with the gcrt1.o file,
4848 // so pass the -no_new_main option to tell the linker to use the
4849 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004850 if (getDarwinToolChain().isTargetMacOS() &&
4851 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4852 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004853 } else {
4854 if (Args.hasArg(options::OPT_static) ||
4855 Args.hasArg(options::OPT_object) ||
4856 Args.hasArg(options::OPT_preload)) {
4857 CmdArgs.push_back("-lcrt0.o");
4858 } else {
4859 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004860 if (getDarwinToolChain().isTargetIOSSimulator()) {
4861 // The simulator doesn't have a versioned crt1 file.
4862 CmdArgs.push_back("-lcrt1.o");
4863 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004864 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4865 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004866 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00004867 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004868 } else {
4869 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4870 CmdArgs.push_back("-lcrt1.o");
4871 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4872 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004873 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004874 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004875
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004876 // darwin_crt2 spec is empty.
4877 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004878 }
4879 }
4880 }
4881 }
4882
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004883 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4884 Args.hasArg(options::OPT_shared_libgcc) &&
4885 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004886 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004887 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004888 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004889 }
4890 }
4891
4892 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004893
Daniel Dunbarc1964212009-03-26 16:23:12 +00004894 if (Args.hasArg(options::OPT_fopenmp))
4895 // This is more complicated in gcc...
4896 CmdArgs.push_back("-lgomp");
4897
Douglas Gregor9295df02012-05-15 21:00:27 +00004898 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4899
Bob Wilson16d93952012-05-15 18:57:39 +00004900 if (isObjCRuntimeLinked(Args) &&
4901 !Args.hasArg(options::OPT_nostdlib) &&
4902 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004903 // Avoid linking compatibility stubs on i386 mac.
4904 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004905 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004906 // If we don't have ARC or subscripting runtime support, link in the
4907 // runtime stubs. We have to do this *before* adding any of the normal
4908 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004909 ObjCRuntime runtime =
4910 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004911 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004912 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004913 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004914 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004915 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004916 CmdArgs.push_back("-framework");
4917 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004918 // Link libobj.
4919 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004920 }
John McCall31168b02011-06-15 23:02:42 +00004921
Daniel Dunbarc1964212009-03-26 16:23:12 +00004922 if (LinkingOutput) {
4923 CmdArgs.push_back("-arch_multiple");
4924 CmdArgs.push_back("-final_output");
4925 CmdArgs.push_back(LinkingOutput);
4926 }
4927
Daniel Dunbarc1964212009-03-26 16:23:12 +00004928 if (Args.hasArg(options::OPT_fnested_functions))
4929 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004930
Daniel Dunbarc1964212009-03-26 16:23:12 +00004931 if (!Args.hasArg(options::OPT_nostdlib) &&
4932 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00004933 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004934 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004935
Daniel Dunbarc1964212009-03-26 16:23:12 +00004936 // link_ssp spec is empty.
4937
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004938 // Let the tool chain choose which runtime library to link.
4939 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004940 }
4941
Chad Rosier06fd3c62012-05-16 23:45:12 +00004942 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004943 !Args.hasArg(options::OPT_nostartfiles)) {
4944 // endfile_spec is empty.
4945 }
4946
4947 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4948 Args.AddAllArgs(CmdArgs, options::OPT_F);
4949
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004950 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004951 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004952 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004953}
4954
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004955void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004956 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004957 const InputInfoList &Inputs,
4958 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004959 const char *LinkingOutput) const {
4960 ArgStringList CmdArgs;
4961
4962 CmdArgs.push_back("-create");
4963 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004964
4965 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004966 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004967
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004968 for (InputInfoList::const_iterator
4969 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4970 const InputInfo &II = *it;
4971 assert(II.isFilename() && "Unexpected lipo input.");
4972 CmdArgs.push_back(II.getFilename());
4973 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004974 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004975 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004976 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004977}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004978
Daniel Dunbar88299622010-06-04 18:28:36 +00004979void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004980 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004981 const InputInfoList &Inputs,
4982 const ArgList &Args,
4983 const char *LinkingOutput) const {
4984 ArgStringList CmdArgs;
4985
Daniel Dunbareb86b042011-05-09 17:23:16 +00004986 CmdArgs.push_back("-o");
4987 CmdArgs.push_back(Output.getFilename());
4988
Daniel Dunbar88299622010-06-04 18:28:36 +00004989 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4990 const InputInfo &Input = Inputs[0];
4991 assert(Input.isFilename() && "Unexpected dsymutil input.");
4992 CmdArgs.push_back(Input.getFilename());
4993
Daniel Dunbar88299622010-06-04 18:28:36 +00004994 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004995 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004996 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004997}
4998
Eric Christopher551ef452011-08-23 17:56:55 +00004999void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00005000 const InputInfo &Output,
5001 const InputInfoList &Inputs,
5002 const ArgList &Args,
5003 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00005004 ArgStringList CmdArgs;
5005 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00005006 CmdArgs.push_back("--debug-info");
5007 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00005008 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00005009
5010 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5011 const InputInfo &Input = Inputs[0];
5012 assert(Input.isFilename() && "Unexpected verify input");
5013
5014 // Grabbing the output of the earlier dsymutil run.
5015 CmdArgs.push_back(Input.getFilename());
5016
5017 const char *Exec =
5018 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5019 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5020}
5021
David Chisnallf571cde2012-02-15 13:39:01 +00005022void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5023 const InputInfo &Output,
5024 const InputInfoList &Inputs,
5025 const ArgList &Args,
5026 const char *LinkingOutput) const {
5027 ArgStringList CmdArgs;
5028
5029 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5030 options::OPT_Xassembler);
5031
5032 CmdArgs.push_back("-o");
5033 CmdArgs.push_back(Output.getFilename());
5034
5035 for (InputInfoList::const_iterator
5036 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5037 const InputInfo &II = *it;
5038 CmdArgs.push_back(II.getFilename());
5039 }
5040
5041 const char *Exec =
5042 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5043 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5044}
5045
5046
5047void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5048 const InputInfo &Output,
5049 const InputInfoList &Inputs,
5050 const ArgList &Args,
5051 const char *LinkingOutput) const {
5052 // FIXME: Find a real GCC, don't hard-code versions here
5053 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5054 const llvm::Triple &T = getToolChain().getTriple();
5055 std::string LibPath = "/usr/lib/";
5056 llvm::Triple::ArchType Arch = T.getArch();
5057 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005058 case llvm::Triple::x86:
5059 GCCLibPath +=
5060 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5061 break;
5062 case llvm::Triple::x86_64:
5063 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5064 GCCLibPath += "/4.5.2/amd64/";
5065 LibPath += "amd64/";
5066 break;
5067 default:
5068 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00005069 }
5070
5071 ArgStringList CmdArgs;
5072
David Chisnall272a0712012-02-29 15:06:12 +00005073 // Demangle C++ names in errors
5074 CmdArgs.push_back("-C");
5075
David Chisnallf571cde2012-02-15 13:39:01 +00005076 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5077 (!Args.hasArg(options::OPT_shared))) {
5078 CmdArgs.push_back("-e");
5079 CmdArgs.push_back("_start");
5080 }
5081
5082 if (Args.hasArg(options::OPT_static)) {
5083 CmdArgs.push_back("-Bstatic");
5084 CmdArgs.push_back("-dn");
5085 } else {
5086 CmdArgs.push_back("-Bdynamic");
5087 if (Args.hasArg(options::OPT_shared)) {
5088 CmdArgs.push_back("-shared");
5089 } else {
5090 CmdArgs.push_back("--dynamic-linker");
5091 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5092 }
5093 }
5094
5095 if (Output.isFilename()) {
5096 CmdArgs.push_back("-o");
5097 CmdArgs.push_back(Output.getFilename());
5098 } else {
5099 assert(Output.isNothing() && "Invalid output.");
5100 }
5101
5102 if (!Args.hasArg(options::OPT_nostdlib) &&
5103 !Args.hasArg(options::OPT_nostartfiles)) {
5104 if (!Args.hasArg(options::OPT_shared)) {
5105 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5106 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005107 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005108 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5109 } else {
5110 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005111 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5112 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005113 }
Hans Wennborg70850d82013-07-18 20:29:38 +00005114 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00005115 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005116 }
5117
5118 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5119
5120 Args.AddAllArgs(CmdArgs, options::OPT_L);
5121 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5122 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00005123 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00005124
5125 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5126
5127 if (!Args.hasArg(options::OPT_nostdlib) &&
5128 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005129 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00005130 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00005131 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005132 if (!Args.hasArg(options::OPT_shared)) {
5133 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00005134 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00005135 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005136 }
David Chisnallf571cde2012-02-15 13:39:01 +00005137 }
5138
5139 if (!Args.hasArg(options::OPT_nostdlib) &&
5140 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00005141 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005142 }
David Chisnall96de9932012-02-16 16:00:47 +00005143 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005144
5145 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5146
5147 const char *Exec =
5148 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5149 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5150}
5151
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005152void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005153 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005154 const InputInfoList &Inputs,
5155 const ArgList &Args,
5156 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005157 ArgStringList CmdArgs;
5158
5159 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5160 options::OPT_Xassembler);
5161
5162 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005163 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005164
5165 for (InputInfoList::const_iterator
5166 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5167 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005168 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005169 }
5170
5171 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005172 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005173 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005174}
5175
5176void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005177 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005178 const InputInfoList &Inputs,
5179 const ArgList &Args,
5180 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005181 ArgStringList CmdArgs;
5182
5183 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005184 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005185 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005186 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005187 }
5188
5189 if (Args.hasArg(options::OPT_static)) {
5190 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005191 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005192 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005193// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005194 CmdArgs.push_back("-Bdynamic");
5195 if (Args.hasArg(options::OPT_shared)) {
5196 CmdArgs.push_back("-shared");
5197 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00005198 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005199 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5200 }
5201 }
5202
Daniel Dunbarb440f562010-08-02 02:38:21 +00005203 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005204 CmdArgs.push_back("-o");
5205 CmdArgs.push_back(Output.getFilename());
5206 } else {
5207 assert(Output.isNothing() && "Invalid output.");
5208 }
5209
5210 if (!Args.hasArg(options::OPT_nostdlib) &&
5211 !Args.hasArg(options::OPT_nostartfiles)) {
5212 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005213 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005214 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005215 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005216 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005217 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005218 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005219 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005220 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005221 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005222 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005223 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005224 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005225 }
5226
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005227 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5228 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005229 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005230
5231 Args.AddAllArgs(CmdArgs, options::OPT_L);
5232 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5233 Args.AddAllArgs(CmdArgs, options::OPT_e);
5234
Daniel Dunbar54423b22010-09-17 00:24:54 +00005235 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005236
5237 if (!Args.hasArg(options::OPT_nostdlib) &&
5238 !Args.hasArg(options::OPT_nodefaultlibs)) {
5239 // FIXME: For some reason GCC passes -lgcc before adding
5240 // the default system libraries. Just mimic this for now.
5241 CmdArgs.push_back("-lgcc");
5242
5243 if (Args.hasArg(options::OPT_pthread))
5244 CmdArgs.push_back("-pthread");
5245 if (!Args.hasArg(options::OPT_shared))
5246 CmdArgs.push_back("-lc");
5247 CmdArgs.push_back("-lgcc");
5248 }
5249
5250 if (!Args.hasArg(options::OPT_nostdlib) &&
5251 !Args.hasArg(options::OPT_nostartfiles)) {
5252 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005253 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005254 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005255 }
5256
Bill Wendling08760582011-06-27 19:15:03 +00005257 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005258
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005259 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005260 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005261 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005262}
5263
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005264void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005265 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005266 const InputInfoList &Inputs,
5267 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005268 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005269 ArgStringList CmdArgs;
5270
5271 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5272 options::OPT_Xassembler);
5273
5274 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005275 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005276
5277 for (InputInfoList::const_iterator
5278 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5279 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005280 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005281 }
5282
5283 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005284 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005285 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005286}
5287
5288void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005289 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005290 const InputInfoList &Inputs,
5291 const ArgList &Args,
5292 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005293 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005294 ArgStringList CmdArgs;
5295
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005296 // Silence warning for "clang -g foo.o -o foo"
5297 Args.ClaimAllArgs(options::OPT_g_Group);
5298 // and "clang -emit-llvm foo.o -o foo"
5299 Args.ClaimAllArgs(options::OPT_emit_llvm);
5300 // and for "clang -w foo.o -o foo". Other warning options are already
5301 // handled somewhere else.
5302 Args.ClaimAllArgs(options::OPT_w);
5303
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005304 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005305 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005306 CmdArgs.push_back("-e");
5307 CmdArgs.push_back("__start");
5308 }
5309
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005310 if (Args.hasArg(options::OPT_static)) {
5311 CmdArgs.push_back("-Bstatic");
5312 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005313 if (Args.hasArg(options::OPT_rdynamic))
5314 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005315 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005316 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005317 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005318 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005319 } else {
5320 CmdArgs.push_back("-dynamic-linker");
5321 CmdArgs.push_back("/usr/libexec/ld.so");
5322 }
5323 }
5324
Rafael Espindola044f7832013-06-05 04:28:55 +00005325 if (Args.hasArg(options::OPT_nopie))
5326 CmdArgs.push_back("-nopie");
5327
Daniel Dunbarb440f562010-08-02 02:38:21 +00005328 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005329 CmdArgs.push_back("-o");
5330 CmdArgs.push_back(Output.getFilename());
5331 } else {
5332 assert(Output.isNothing() && "Invalid output.");
5333 }
5334
5335 if (!Args.hasArg(options::OPT_nostdlib) &&
5336 !Args.hasArg(options::OPT_nostartfiles)) {
5337 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00005338 if (Args.hasArg(options::OPT_pg))
5339 CmdArgs.push_back(Args.MakeArgString(
5340 getToolChain().GetFilePath("gcrt0.o")));
5341 else
5342 CmdArgs.push_back(Args.MakeArgString(
5343 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005344 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005345 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005346 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005347 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005348 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005349 }
5350 }
5351
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005352 std::string Triple = getToolChain().getTripleString();
5353 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005354 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005355 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005356 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005357
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005358 Args.AddAllArgs(CmdArgs, options::OPT_L);
5359 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5360 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005361 Args.AddAllArgs(CmdArgs, options::OPT_s);
5362 Args.AddAllArgs(CmdArgs, options::OPT_t);
5363 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5364 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005365
Daniel Dunbar54423b22010-09-17 00:24:54 +00005366 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005367
5368 if (!Args.hasArg(options::OPT_nostdlib) &&
5369 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005370 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005371 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005372 if (Args.hasArg(options::OPT_pg))
5373 CmdArgs.push_back("-lm_p");
5374 else
5375 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005376 }
5377
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005378 // FIXME: For some reason GCC passes -lgcc before adding
5379 // the default system libraries. Just mimic this for now.
5380 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005381
Eric Christopher17674ec2012-09-13 06:32:34 +00005382 if (Args.hasArg(options::OPT_pthread)) {
5383 if (!Args.hasArg(options::OPT_shared) &&
5384 Args.hasArg(options::OPT_pg))
5385 CmdArgs.push_back("-lpthread_p");
5386 else
5387 CmdArgs.push_back("-lpthread");
5388 }
5389
Chandler Carruth45661652011-12-17 22:32:42 +00005390 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005391 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005392 CmdArgs.push_back("-lc_p");
5393 else
5394 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005395 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005396
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005397 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005398 }
5399
5400 if (!Args.hasArg(options::OPT_nostdlib) &&
5401 !Args.hasArg(options::OPT_nostartfiles)) {
5402 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005403 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005404 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005405 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005406 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005407 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005408 }
5409
5410 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005411 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005412 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005413}
Ed Schoutene33194b2009-04-02 19:13:12 +00005414
Eli Friedman9fa28852012-08-08 23:57:20 +00005415void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5416 const InputInfo &Output,
5417 const InputInfoList &Inputs,
5418 const ArgList &Args,
5419 const char *LinkingOutput) const {
5420 ArgStringList CmdArgs;
5421
5422 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5423 options::OPT_Xassembler);
5424
5425 CmdArgs.push_back("-o");
5426 CmdArgs.push_back(Output.getFilename());
5427
5428 for (InputInfoList::const_iterator
5429 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5430 const InputInfo &II = *it;
5431 CmdArgs.push_back(II.getFilename());
5432 }
5433
5434 const char *Exec =
5435 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5436 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5437}
5438
5439void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5440 const InputInfo &Output,
5441 const InputInfoList &Inputs,
5442 const ArgList &Args,
5443 const char *LinkingOutput) const {
5444 const Driver &D = getToolChain().getDriver();
5445 ArgStringList CmdArgs;
5446
5447 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5448 (!Args.hasArg(options::OPT_shared))) {
5449 CmdArgs.push_back("-e");
5450 CmdArgs.push_back("__start");
5451 }
5452
5453 if (Args.hasArg(options::OPT_static)) {
5454 CmdArgs.push_back("-Bstatic");
5455 } else {
5456 if (Args.hasArg(options::OPT_rdynamic))
5457 CmdArgs.push_back("-export-dynamic");
5458 CmdArgs.push_back("--eh-frame-hdr");
5459 CmdArgs.push_back("-Bdynamic");
5460 if (Args.hasArg(options::OPT_shared)) {
5461 CmdArgs.push_back("-shared");
5462 } else {
5463 CmdArgs.push_back("-dynamic-linker");
5464 CmdArgs.push_back("/usr/libexec/ld.so");
5465 }
5466 }
5467
5468 if (Output.isFilename()) {
5469 CmdArgs.push_back("-o");
5470 CmdArgs.push_back(Output.getFilename());
5471 } else {
5472 assert(Output.isNothing() && "Invalid output.");
5473 }
5474
5475 if (!Args.hasArg(options::OPT_nostdlib) &&
5476 !Args.hasArg(options::OPT_nostartfiles)) {
5477 if (!Args.hasArg(options::OPT_shared)) {
5478 if (Args.hasArg(options::OPT_pg))
5479 CmdArgs.push_back(Args.MakeArgString(
5480 getToolChain().GetFilePath("gcrt0.o")));
5481 else
5482 CmdArgs.push_back(Args.MakeArgString(
5483 getToolChain().GetFilePath("crt0.o")));
5484 CmdArgs.push_back(Args.MakeArgString(
5485 getToolChain().GetFilePath("crtbegin.o")));
5486 } else {
5487 CmdArgs.push_back(Args.MakeArgString(
5488 getToolChain().GetFilePath("crtbeginS.o")));
5489 }
5490 }
5491
5492 Args.AddAllArgs(CmdArgs, options::OPT_L);
5493 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5494 Args.AddAllArgs(CmdArgs, options::OPT_e);
5495
5496 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5497
5498 if (!Args.hasArg(options::OPT_nostdlib) &&
5499 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005500 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00005501 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5502 if (Args.hasArg(options::OPT_pg))
5503 CmdArgs.push_back("-lm_p");
5504 else
5505 CmdArgs.push_back("-lm");
5506 }
5507
Rafael Espindola1ad26f02012-10-23 17:07:31 +00005508 if (Args.hasArg(options::OPT_pthread)) {
5509 if (!Args.hasArg(options::OPT_shared) &&
5510 Args.hasArg(options::OPT_pg))
5511 CmdArgs.push_back("-lpthread_p");
5512 else
5513 CmdArgs.push_back("-lpthread");
5514 }
5515
Eli Friedman9fa28852012-08-08 23:57:20 +00005516 if (!Args.hasArg(options::OPT_shared)) {
5517 if (Args.hasArg(options::OPT_pg))
5518 CmdArgs.push_back("-lc_p");
5519 else
5520 CmdArgs.push_back("-lc");
5521 }
5522
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005523 StringRef MyArch;
5524 switch (getToolChain().getTriple().getArch()) {
5525 case llvm::Triple::arm:
5526 MyArch = "arm";
5527 break;
5528 case llvm::Triple::x86:
5529 MyArch = "i386";
5530 break;
5531 case llvm::Triple::x86_64:
5532 MyArch = "amd64";
5533 break;
5534 default:
5535 llvm_unreachable("Unsupported architecture");
5536 }
5537 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00005538 }
5539
5540 if (!Args.hasArg(options::OPT_nostdlib) &&
5541 !Args.hasArg(options::OPT_nostartfiles)) {
5542 if (!Args.hasArg(options::OPT_shared))
5543 CmdArgs.push_back(Args.MakeArgString(
5544 getToolChain().GetFilePath("crtend.o")));
5545 else
5546 CmdArgs.push_back(Args.MakeArgString(
5547 getToolChain().GetFilePath("crtendS.o")));
5548 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005549
5550 const char *Exec =
5551 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5552 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005553}
5554
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005555void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005556 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005557 const InputInfoList &Inputs,
5558 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005559 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005560 ArgStringList CmdArgs;
5561
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005562 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5563 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005564 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005565 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005566 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005567 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005568 else if (getToolChain().getArch() == llvm::Triple::mips ||
5569 getToolChain().getArch() == llvm::Triple::mipsel ||
5570 getToolChain().getArch() == llvm::Triple::mips64 ||
5571 getToolChain().getArch() == llvm::Triple::mips64el) {
5572 StringRef CPUName;
5573 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005574 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005575
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005576 CmdArgs.push_back("-march");
5577 CmdArgs.push_back(CPUName.data());
5578
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005579 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005580 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005581
5582 if (getToolChain().getArch() == llvm::Triple::mips ||
5583 getToolChain().getArch() == llvm::Triple::mips64)
5584 CmdArgs.push_back("-EB");
5585 else
5586 CmdArgs.push_back("-EL");
5587
5588 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5589 options::OPT_fpic, options::OPT_fno_pic,
5590 options::OPT_fPIE, options::OPT_fno_PIE,
5591 options::OPT_fpie, options::OPT_fno_pie);
5592 if (LastPICArg &&
5593 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5594 LastPICArg->getOption().matches(options::OPT_fpic) ||
5595 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5596 LastPICArg->getOption().matches(options::OPT_fpie))) {
5597 CmdArgs.push_back("-KPIC");
5598 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005599 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5600 getToolChain().getArch() == llvm::Triple::thumb) {
5601 CmdArgs.push_back("-mfpu=softvfp");
5602 switch(getToolChain().getTriple().getEnvironment()) {
5603 case llvm::Triple::GNUEABI:
5604 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00005605 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005606 break;
5607
5608 default:
5609 CmdArgs.push_back("-matpcs");
5610 }
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005611 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005612
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005613 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5614 options::OPT_Xassembler);
5615
5616 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005617 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005618
5619 for (InputInfoList::const_iterator
5620 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5621 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005622 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005623 }
5624
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005625 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005626 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005627 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005628}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005629
5630void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005631 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005632 const InputInfoList &Inputs,
5633 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005634 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005635 const toolchains::FreeBSD& ToolChain =
5636 static_cast<const toolchains::FreeBSD&>(getToolChain());
5637 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005638 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005639
5640 // Silence warning for "clang -g foo.o -o foo"
5641 Args.ClaimAllArgs(options::OPT_g_Group);
5642 // and "clang -emit-llvm foo.o -o foo"
5643 Args.ClaimAllArgs(options::OPT_emit_llvm);
5644 // and for "clang -w foo.o -o foo". Other warning options are already
5645 // handled somewhere else.
5646 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005647
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005648 if (!D.SysRoot.empty())
5649 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5650
Roman Divackyafe2f232012-08-28 15:09:03 +00005651 if (Args.hasArg(options::OPT_pie))
5652 CmdArgs.push_back("-pie");
5653
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005654 if (Args.hasArg(options::OPT_static)) {
5655 CmdArgs.push_back("-Bstatic");
5656 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005657 if (Args.hasArg(options::OPT_rdynamic))
5658 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005659 CmdArgs.push_back("--eh-frame-hdr");
5660 if (Args.hasArg(options::OPT_shared)) {
5661 CmdArgs.push_back("-Bshareable");
5662 } else {
5663 CmdArgs.push_back("-dynamic-linker");
5664 CmdArgs.push_back("/libexec/ld-elf.so.1");
5665 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005666 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5667 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005668 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5669 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5670 CmdArgs.push_back("--hash-style=both");
5671 }
5672 }
5673 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005674 }
5675
5676 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5677 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005678 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005679 CmdArgs.push_back("-m");
5680 CmdArgs.push_back("elf_i386_fbsd");
5681 }
5682
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005683 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005684 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005685 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005686 }
5687
Daniel Dunbarb440f562010-08-02 02:38:21 +00005688 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005689 CmdArgs.push_back("-o");
5690 CmdArgs.push_back(Output.getFilename());
5691 } else {
5692 assert(Output.isNothing() && "Invalid output.");
5693 }
5694
5695 if (!Args.hasArg(options::OPT_nostdlib) &&
5696 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005697 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005698 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005699 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005700 crt1 = "gcrt1.o";
5701 else if (Args.hasArg(options::OPT_pie))
5702 crt1 = "Scrt1.o";
5703 else
5704 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005705 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005706 if (crt1)
5707 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5708
5709 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5710
5711 const char *crtbegin = NULL;
5712 if (Args.hasArg(options::OPT_static))
5713 crtbegin = "crtbeginT.o";
5714 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5715 crtbegin = "crtbeginS.o";
5716 else
5717 crtbegin = "crtbegin.o";
5718
5719 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005720 }
5721
5722 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005723 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005724 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5725 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005726 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005727 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5728 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005729 Args.AddAllArgs(CmdArgs, options::OPT_s);
5730 Args.AddAllArgs(CmdArgs, options::OPT_t);
5731 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5732 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005733
Roman Divackyafe2f232012-08-28 15:09:03 +00005734 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005735
5736 if (!Args.hasArg(options::OPT_nostdlib) &&
5737 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005738 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005739 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005740 if (Args.hasArg(options::OPT_pg))
5741 CmdArgs.push_back("-lm_p");
5742 else
5743 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005744 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005745 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5746 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005747 if (Args.hasArg(options::OPT_pg))
5748 CmdArgs.push_back("-lgcc_p");
5749 else
5750 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005751 if (Args.hasArg(options::OPT_static)) {
5752 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005753 } else if (Args.hasArg(options::OPT_pg)) {
5754 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005755 } else {
5756 CmdArgs.push_back("--as-needed");
5757 CmdArgs.push_back("-lgcc_s");
5758 CmdArgs.push_back("--no-as-needed");
5759 }
5760
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005761 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005762 if (Args.hasArg(options::OPT_pg))
5763 CmdArgs.push_back("-lpthread_p");
5764 else
5765 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005766 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005767
Roman Divacky66f22762011-02-10 16:59:40 +00005768 if (Args.hasArg(options::OPT_pg)) {
5769 if (Args.hasArg(options::OPT_shared))
5770 CmdArgs.push_back("-lc");
5771 else
5772 CmdArgs.push_back("-lc_p");
5773 CmdArgs.push_back("-lgcc_p");
5774 } else {
5775 CmdArgs.push_back("-lc");
5776 CmdArgs.push_back("-lgcc");
5777 }
5778
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005779 if (Args.hasArg(options::OPT_static)) {
5780 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005781 } else if (Args.hasArg(options::OPT_pg)) {
5782 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005783 } else {
5784 CmdArgs.push_back("--as-needed");
5785 CmdArgs.push_back("-lgcc_s");
5786 CmdArgs.push_back("--no-as-needed");
5787 }
5788 }
5789
5790 if (!Args.hasArg(options::OPT_nostdlib) &&
5791 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005792 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005793 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005794 else
5795 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005796 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005797 }
5798
Roman Divackyafe2f232012-08-28 15:09:03 +00005799 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005800
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005801 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005802 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005803 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005804}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005805
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005806void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5807 const InputInfo &Output,
5808 const InputInfoList &Inputs,
5809 const ArgList &Args,
5810 const char *LinkingOutput) const {
5811 ArgStringList CmdArgs;
5812
5813 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5814 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005815 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005816 CmdArgs.push_back("--32");
5817
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005818 // Set byte order explicitly
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005819 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005820 CmdArgs.push_back("-EB");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005821 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005822 CmdArgs.push_back("-EL");
5823
5824 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5825 options::OPT_Xassembler);
5826
5827 CmdArgs.push_back("-o");
5828 CmdArgs.push_back(Output.getFilename());
5829
5830 for (InputInfoList::const_iterator
5831 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5832 const InputInfo &II = *it;
5833 CmdArgs.push_back(II.getFilename());
5834 }
5835
David Chisnallddbd68f2011-09-27 22:03:18 +00005836 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005837 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5838}
5839
5840void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5841 const InputInfo &Output,
5842 const InputInfoList &Inputs,
5843 const ArgList &Args,
5844 const char *LinkingOutput) const {
5845 const Driver &D = getToolChain().getDriver();
5846 ArgStringList CmdArgs;
5847
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005848 if (!D.SysRoot.empty())
5849 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5850
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005851 if (Args.hasArg(options::OPT_static)) {
5852 CmdArgs.push_back("-Bstatic");
5853 } else {
5854 if (Args.hasArg(options::OPT_rdynamic))
5855 CmdArgs.push_back("-export-dynamic");
5856 CmdArgs.push_back("--eh-frame-hdr");
5857 if (Args.hasArg(options::OPT_shared)) {
5858 CmdArgs.push_back("-Bshareable");
5859 } else {
5860 CmdArgs.push_back("-dynamic-linker");
5861 CmdArgs.push_back("/libexec/ld.elf_so");
5862 }
5863 }
5864
5865 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5866 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005867 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005868 CmdArgs.push_back("-m");
5869 CmdArgs.push_back("elf_i386");
5870 }
5871
5872 if (Output.isFilename()) {
5873 CmdArgs.push_back("-o");
5874 CmdArgs.push_back(Output.getFilename());
5875 } else {
5876 assert(Output.isNothing() && "Invalid output.");
5877 }
5878
5879 if (!Args.hasArg(options::OPT_nostdlib) &&
5880 !Args.hasArg(options::OPT_nostartfiles)) {
5881 if (!Args.hasArg(options::OPT_shared)) {
5882 CmdArgs.push_back(Args.MakeArgString(
5883 getToolChain().GetFilePath("crt0.o")));
5884 CmdArgs.push_back(Args.MakeArgString(
5885 getToolChain().GetFilePath("crti.o")));
5886 CmdArgs.push_back(Args.MakeArgString(
5887 getToolChain().GetFilePath("crtbegin.o")));
5888 } else {
5889 CmdArgs.push_back(Args.MakeArgString(
5890 getToolChain().GetFilePath("crti.o")));
5891 CmdArgs.push_back(Args.MakeArgString(
5892 getToolChain().GetFilePath("crtbeginS.o")));
5893 }
5894 }
5895
5896 Args.AddAllArgs(CmdArgs, options::OPT_L);
5897 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5898 Args.AddAllArgs(CmdArgs, options::OPT_e);
5899 Args.AddAllArgs(CmdArgs, options::OPT_s);
5900 Args.AddAllArgs(CmdArgs, options::OPT_t);
5901 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5902 Args.AddAllArgs(CmdArgs, options::OPT_r);
5903
5904 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5905
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00005906 unsigned Major, Minor, Micro;
5907 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
5908 bool useLibgcc = true;
5909 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) {
5910 if (getToolChain().getArch() == llvm::Triple::x86 ||
5911 getToolChain().getArch() == llvm::Triple::x86_64)
5912 useLibgcc = false;
5913 }
5914
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005915 if (!Args.hasArg(options::OPT_nostdlib) &&
5916 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005917 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005918 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5919 CmdArgs.push_back("-lm");
5920 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005921 if (Args.hasArg(options::OPT_pthread))
5922 CmdArgs.push_back("-lpthread");
5923 CmdArgs.push_back("-lc");
5924
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00005925 if (useLibgcc) {
5926 if (Args.hasArg(options::OPT_static)) {
5927 // libgcc_eh depends on libc, so resolve as much as possible,
5928 // pull in any new requirements from libc and then get the rest
5929 // of libgcc.
5930 CmdArgs.push_back("-lgcc_eh");
5931 CmdArgs.push_back("-lc");
5932 CmdArgs.push_back("-lgcc");
5933 } else {
5934 CmdArgs.push_back("-lgcc");
5935 CmdArgs.push_back("--as-needed");
5936 CmdArgs.push_back("-lgcc_s");
5937 CmdArgs.push_back("--no-as-needed");
5938 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005939 }
5940 }
5941
5942 if (!Args.hasArg(options::OPT_nostdlib) &&
5943 !Args.hasArg(options::OPT_nostartfiles)) {
5944 if (!Args.hasArg(options::OPT_shared))
5945 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5946 "crtend.o")));
5947 else
5948 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5949 "crtendS.o")));
5950 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5951 "crtn.o")));
5952 }
5953
Bill Wendling08760582011-06-27 19:15:03 +00005954 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005955
David Chisnallddbd68f2011-09-27 22:03:18 +00005956 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005957 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5958}
5959
Thomas Schwinge4e555262013-03-28 19:04:25 +00005960void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5961 const InputInfo &Output,
5962 const InputInfoList &Inputs,
5963 const ArgList &Args,
5964 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00005965 ArgStringList CmdArgs;
5966
5967 // Add --32/--64 to make sure we get the format we want.
5968 // This is incomplete
5969 if (getToolChain().getArch() == llvm::Triple::x86) {
5970 CmdArgs.push_back("--32");
5971 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5972 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005973 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5974 CmdArgs.push_back("-a32");
5975 CmdArgs.push_back("-mppc");
5976 CmdArgs.push_back("-many");
5977 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5978 CmdArgs.push_back("-a64");
5979 CmdArgs.push_back("-mppc64");
5980 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00005981 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
5982 CmdArgs.push_back("-a64");
5983 CmdArgs.push_back("-mppc64le");
5984 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005985 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005986 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005987 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5988 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005989
5990 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5991 getToolChain().getTriple());
5992 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005993
5994 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5995 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5996 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005997 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5998 getToolChain().getArch() == llvm::Triple::mipsel ||
5999 getToolChain().getArch() == llvm::Triple::mips64 ||
6000 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006001 StringRef CPUName;
6002 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006003 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006004
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006005 CmdArgs.push_back("-march");
6006 CmdArgs.push_back(CPUName.data());
6007
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006008 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006009 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00006010
6011 if (getToolChain().getArch() == llvm::Triple::mips ||
6012 getToolChain().getArch() == llvm::Triple::mips64)
6013 CmdArgs.push_back("-EB");
6014 else
6015 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006016
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006017 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6018 if (StringRef(A->getValue()) == "2008")
6019 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6020 }
6021
Simon Atanasyan036d16d2013-04-30 07:47:13 +00006022 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6023 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6024 options::OPT_mno_micromips);
6025 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6026 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6027
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006028 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6029 options::OPT_fpic, options::OPT_fno_pic,
6030 options::OPT_fPIE, options::OPT_fno_PIE,
6031 options::OPT_fpie, options::OPT_fno_pie);
6032 if (LastPICArg &&
6033 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6034 LastPICArg->getOption().matches(options::OPT_fpic) ||
6035 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6036 LastPICArg->getOption().matches(options::OPT_fpie))) {
6037 CmdArgs.push_back("-KPIC");
6038 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006039 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
Richard Sandiford4652d892013-07-19 16:51:51 +00006040 // Always pass an -march option, since our default of z10 is later
6041 // than the GNU assembler's default.
6042 StringRef CPUName = getSystemZTargetCPU(Args);
6043 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Rafael Espindola92b00932010-08-10 00:25:48 +00006044 }
6045
6046 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6047 options::OPT_Xassembler);
6048
6049 CmdArgs.push_back("-o");
6050 CmdArgs.push_back(Output.getFilename());
6051
6052 for (InputInfoList::const_iterator
6053 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6054 const InputInfo &II = *it;
6055 CmdArgs.push_back(II.getFilename());
6056 }
6057
6058 const char *Exec =
6059 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6060 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00006061
6062 // Handle the debug info splitting at object creation time if we're
6063 // creating an object.
6064 // TODO: Currently only works on linux with newer objcopy.
6065 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006066 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00006067 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6068 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00006069}
6070
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006071static void AddLibgcc(llvm::Triple Triple, const Driver &D,
6072 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00006073 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00006074 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6075 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00006076 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006077 CmdArgs.push_back("-lgcc");
6078
Logan Chien3d3373c2012-11-19 12:04:11 +00006079 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006080 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006081 CmdArgs.push_back("-lgcc");
6082 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00006083 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006084 CmdArgs.push_back("--as-needed");
6085 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00006086 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006087 CmdArgs.push_back("--no-as-needed");
6088 }
6089
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006090 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00006091 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00006092 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006093 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00006094
6095 // According to Android ABI, we have to link with libdl if we are
6096 // linking with non-static libgcc.
6097 //
6098 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6099 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6100 if (isAndroid && !StaticLibgcc)
6101 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00006102}
6103
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006104static bool hasMipsN32ABIArg(const ArgList &Args) {
6105 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smithbd55daf2012-11-01 04:30:05 +00006106 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006107}
6108
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006109static StringRef getLinuxDynamicLinker(const ArgList &Args,
6110 const toolchains::Linux &ToolChain) {
6111 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android)
6112 return "/system/bin/linker";
6113 else if (ToolChain.getArch() == llvm::Triple::x86)
6114 return "/lib/ld-linux.so.2";
6115 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6116 return "/lib/ld-linux-aarch64.so.1";
6117 else if (ToolChain.getArch() == llvm::Triple::arm ||
6118 ToolChain.getArch() == llvm::Triple::thumb) {
6119 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6120 return "/lib/ld-linux-armhf.so.3";
6121 else
6122 return "/lib/ld-linux.so.3";
6123 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6124 ToolChain.getArch() == llvm::Triple::mipsel)
6125 return "/lib/ld.so.1";
6126 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6127 ToolChain.getArch() == llvm::Triple::mips64el) {
6128 if (hasMipsN32ABIArg(Args))
6129 return "/lib32/ld.so.1";
6130 else
6131 return "/lib64/ld.so.1";
6132 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6133 return "/lib/ld.so.1";
6134 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
Bill Schmidt778d3872013-07-26 01:36:11 +00006135 ToolChain.getArch() == llvm::Triple::ppc64le ||
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006136 ToolChain.getArch() == llvm::Triple::systemz)
6137 return "/lib64/ld64.so.1";
6138 else
6139 return "/lib64/ld-linux-x86-64.so.2";
6140}
6141
Thomas Schwinge4e555262013-03-28 19:04:25 +00006142void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6143 const InputInfo &Output,
6144 const InputInfoList &Inputs,
6145 const ArgList &Args,
6146 const char *LinkingOutput) const {
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006147 const toolchains::Linux& ToolChain =
6148 static_cast<const toolchains::Linux&>(getToolChain());
6149 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00006150 const bool isAndroid =
6151 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Alexey Samsonov609213f92013-08-19 09:14:21 +00006152 const SanitizerArgs &Sanitize = D.getOrParseSanitizerArgs(Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006153 const bool IsPIE =
6154 !Args.hasArg(options::OPT_shared) &&
Alexey Samsonove6203662013-08-09 07:42:13 +00006155 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow(ToolChain));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006156
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006157 ArgStringList CmdArgs;
6158
Rafael Espindolad1002f62010-11-15 18:28:16 +00006159 // Silence warning for "clang -g foo.o -o foo"
6160 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006161 // and "clang -emit-llvm foo.o -o foo"
6162 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00006163 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00006164 // handled somewhere else.
6165 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00006166
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006167 if (!D.SysRoot.empty())
6168 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006169
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006170 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00006171 CmdArgs.push_back("-pie");
6172
Rafael Espindola1c76c592010-11-07 22:57:16 +00006173 if (Args.hasArg(options::OPT_rdynamic))
6174 CmdArgs.push_back("-export-dynamic");
6175
Rafael Espindola34d77dc2010-11-11 19:34:42 +00006176 if (Args.hasArg(options::OPT_s))
6177 CmdArgs.push_back("-s");
6178
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006179 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6180 e = ToolChain.ExtraOpts.end();
6181 i != e; ++i)
6182 CmdArgs.push_back(i->c_str());
6183
6184 if (!Args.hasArg(options::OPT_static)) {
6185 CmdArgs.push_back("--eh-frame-hdr");
6186 }
6187
6188 CmdArgs.push_back("-m");
6189 if (ToolChain.getArch() == llvm::Triple::x86)
6190 CmdArgs.push_back("elf_i386");
Tim Northover9bb857a2013-01-31 12:13:10 +00006191 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6192 CmdArgs.push_back("aarch64linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00006193 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00006194 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006195 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00006196 else if (ToolChain.getArch() == llvm::Triple::ppc)
6197 CmdArgs.push_back("elf32ppclinux");
6198 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6199 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00006200 else if (ToolChain.getArch() == llvm::Triple::mips)
6201 CmdArgs.push_back("elf32btsmip");
6202 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6203 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006204 else if (ToolChain.getArch() == llvm::Triple::mips64) {
6205 if (hasMipsN32ABIArg(Args))
6206 CmdArgs.push_back("elf32btsmipn32");
6207 else
6208 CmdArgs.push_back("elf64btsmip");
6209 }
6210 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
6211 if (hasMipsN32ABIArg(Args))
6212 CmdArgs.push_back("elf32ltsmipn32");
6213 else
6214 CmdArgs.push_back("elf64ltsmip");
6215 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006216 else if (ToolChain.getArch() == llvm::Triple::systemz)
6217 CmdArgs.push_back("elf64_s390");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006218 else
6219 CmdArgs.push_back("elf_x86_64");
6220
6221 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00006222 if (ToolChain.getArch() == llvm::Triple::arm
6223 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006224 CmdArgs.push_back("-Bstatic");
6225 else
6226 CmdArgs.push_back("-static");
6227 } else if (Args.hasArg(options::OPT_shared)) {
6228 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00006229 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006230 CmdArgs.push_back("-Bsymbolic");
6231 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006232 }
6233
6234 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00006235 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006236 (!Args.hasArg(options::OPT_static) &&
6237 !Args.hasArg(options::OPT_shared))) {
6238 CmdArgs.push_back("-dynamic-linker");
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006239 CmdArgs.push_back(Args.MakeArgString(
6240 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006241 }
6242
6243 CmdArgs.push_back("-o");
6244 CmdArgs.push_back(Output.getFilename());
6245
Rafael Espindola81937ec2010-12-01 01:52:43 +00006246 if (!Args.hasArg(options::OPT_nostdlib) &&
6247 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006248 if (!isAndroid) {
6249 const char *crt1 = NULL;
6250 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00006251 if (Args.hasArg(options::OPT_pg))
6252 crt1 = "gcrt1.o";
6253 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006254 crt1 = "Scrt1.o";
6255 else
6256 crt1 = "crt1.o";
6257 }
6258 if (crt1)
6259 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006260
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006261 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6262 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006263
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006264 const char *crtbegin;
6265 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006266 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006267 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006268 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006269 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006270 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006271 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006272 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006273 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00006274
6275 // Add crtfastmath.o if available and fast math is enabled.
6276 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006277 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006278
6279 Args.AddAllArgs(CmdArgs, options::OPT_L);
6280
6281 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6282
Roman Divackyee8188a2011-03-01 17:53:14 +00006283 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6284 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006285 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006286
Rafael Espindola9446d762012-04-09 23:53:34 +00006287 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
6288 // as gold requires -plugin to come before any -plugin-opt that -Wl might
6289 // forward.
Rafael Espindolab0092d72013-09-04 19:37:35 +00006290 if (D.IsUsingLTO(Args)) {
Rafael Espindola9446d762012-04-09 23:53:34 +00006291 CmdArgs.push_back("-plugin");
6292 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
6293 CmdArgs.push_back(Args.MakeArgString(Plugin));
Chandler Carruth953fb082013-01-13 11:46:33 +00006294
6295 // Try to pass driver level flags relevant to LTO code generation down to
6296 // the plugin.
6297
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006298 // Handle flags for selecting CPU variants.
6299 std::string CPU = getCPUName(Args, ToolChain.getTriple());
6300 if (!CPU.empty()) {
Chandler Carruth953fb082013-01-13 11:46:33 +00006301 CmdArgs.push_back(
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006302 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6303 CPU));
6304 }
Rafael Espindola9446d762012-04-09 23:53:34 +00006305 }
6306
Chandler Carruth953fb082013-01-13 11:46:33 +00006307
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00006308 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6309 CmdArgs.push_back("--no-demangle");
6310
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006311 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6312
Eric Christopher04997782012-11-29 18:51:05 +00006313 // Call these before we add the C++ ABI library.
Richard Smith52be6192012-11-05 22:04:41 +00006314 if (Sanitize.needsUbsanRt())
Hans Wennborg70850d82013-07-18 20:29:38 +00006315 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX(),
Richard Smithcff3cde2013-03-20 23:49:07 +00006316 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006317 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
Eric Christopher04997782012-11-29 18:51:05 +00006318 if (Sanitize.needsAsanRt())
6319 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6320 if (Sanitize.needsTsanRt())
6321 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00006322 if (Sanitize.needsMsanRt())
6323 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006324 if (Sanitize.needsLsanRt())
6325 addLsanRTLinux(getToolChain(), Args, CmdArgs);
Peter Collingbournec3772752013-08-07 22:47:34 +00006326 if (Sanitize.needsDfsanRt())
6327 addDfsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith4d3110a2012-10-25 02:14:12 +00006328
Chandler Carruthe4458b32013-06-24 09:38:45 +00006329 // The profile runtime also needs access to system libraries.
6330 addProfileRTLinux(getToolChain(), Args, CmdArgs);
6331
Hans Wennborg70850d82013-07-18 20:29:38 +00006332 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00006333 !Args.hasArg(options::OPT_nostdlib) &&
6334 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00006335 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6336 !Args.hasArg(options::OPT_static);
6337 if (OnlyLibstdcxxStatic)
6338 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006339 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00006340 if (OnlyLibstdcxxStatic)
6341 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006342 CmdArgs.push_back("-lm");
6343 }
6344
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006345 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00006346 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6347 if (Args.hasArg(options::OPT_static))
6348 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00006349
Chandler Carruth01538002013-01-17 13:19:29 +00006350 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6351 if (OpenMP) {
6352 CmdArgs.push_back("-lgomp");
6353
6354 // FIXME: Exclude this for platforms whith libgomp that doesn't require
6355 // librt. Most modern Linux platfroms require it, but some may not.
6356 CmdArgs.push_back("-lrt");
6357 }
6358
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006359 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006360
Chandler Carruth94a32012012-05-14 18:31:18 +00006361 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruth01538002013-01-17 13:19:29 +00006362 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth94a32012012-05-14 18:31:18 +00006363 CmdArgs.push_back("-lpthread");
6364
6365 CmdArgs.push_back("-lc");
6366
6367 if (Args.hasArg(options::OPT_static))
6368 CmdArgs.push_back("--end-group");
6369 else
6370 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6371 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00006372
Rafael Espindola81937ec2010-12-01 01:52:43 +00006373 if (!Args.hasArg(options::OPT_nostartfiles)) {
6374 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006375 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006376 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006377 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006378 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00006379 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006380 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006381
Rafael Espindola81937ec2010-12-01 01:52:43 +00006382 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006383 if (!isAndroid)
6384 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00006385 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006386 }
6387
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006388 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6389}
Rafael Espindola92b00932010-08-10 00:25:48 +00006390
Chris Lattner3e2ee142010-07-07 16:01:42 +00006391void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006392 const InputInfo &Output,
6393 const InputInfoList &Inputs,
6394 const ArgList &Args,
6395 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006396 ArgStringList CmdArgs;
6397
6398 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6399 options::OPT_Xassembler);
6400
6401 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006402 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006403
6404 for (InputInfoList::const_iterator
6405 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6406 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006407 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006408 }
6409
6410 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00006411 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006412 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006413}
6414
6415void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006416 const InputInfo &Output,
6417 const InputInfoList &Inputs,
6418 const ArgList &Args,
6419 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006420 const Driver &D = getToolChain().getDriver();
6421 ArgStringList CmdArgs;
6422
Daniel Dunbarb440f562010-08-02 02:38:21 +00006423 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006424 CmdArgs.push_back("-o");
6425 CmdArgs.push_back(Output.getFilename());
6426 } else {
6427 assert(Output.isNothing() && "Invalid output.");
6428 }
6429
6430 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00006431 !Args.hasArg(options::OPT_nostartfiles)) {
6432 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6433 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6434 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6435 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6436 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006437
6438 Args.AddAllArgs(CmdArgs, options::OPT_L);
6439 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6440 Args.AddAllArgs(CmdArgs, options::OPT_e);
6441
Daniel Dunbar54423b22010-09-17 00:24:54 +00006442 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006443
Eli Friedman83de5132011-12-08 23:54:21 +00006444 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6445
Chris Lattner3e2ee142010-07-07 16:01:42 +00006446 if (!Args.hasArg(options::OPT_nostdlib) &&
6447 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006448 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006449 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006450 CmdArgs.push_back("-lm");
6451 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006452 }
6453
6454 if (!Args.hasArg(options::OPT_nostdlib) &&
6455 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00006456 if (Args.hasArg(options::OPT_pthread))
6457 CmdArgs.push_back("-lpthread");
6458 CmdArgs.push_back("-lc");
6459 CmdArgs.push_back("-lCompilerRT-Generic");
6460 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6461 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00006462 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006463 }
6464
Eli Friedman83de5132011-12-08 23:54:21 +00006465 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006466 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006467}
6468
Daniel Dunbarcc912342009-05-02 18:28:39 +00006469/// DragonFly Tools
6470
6471// For now, DragonFly Assemble does just about the same as for
6472// FreeBSD, but this may change soon.
6473void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006474 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006475 const InputInfoList &Inputs,
6476 const ArgList &Args,
6477 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006478 ArgStringList CmdArgs;
6479
6480 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6481 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006482 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00006483 CmdArgs.push_back("--32");
6484
6485 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6486 options::OPT_Xassembler);
6487
6488 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006489 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006490
6491 for (InputInfoList::const_iterator
6492 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6493 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006494 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006495 }
6496
6497 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006498 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006499 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006500}
6501
6502void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006503 const InputInfo &Output,
6504 const InputInfoList &Inputs,
6505 const ArgList &Args,
6506 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00006507 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00006508 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00006509 ArgStringList CmdArgs;
6510
John McCall65b8da02013-04-11 22:55:55 +00006511 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6512 UseGCC47 = false;
6513
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006514 if (!D.SysRoot.empty())
6515 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6516
John McCall65b8da02013-04-11 22:55:55 +00006517 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006518 if (Args.hasArg(options::OPT_static)) {
6519 CmdArgs.push_back("-Bstatic");
6520 } else {
John McCall65b8da02013-04-11 22:55:55 +00006521 if (Args.hasArg(options::OPT_rdynamic))
6522 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006523 if (Args.hasArg(options::OPT_shared))
6524 CmdArgs.push_back("-Bshareable");
6525 else {
6526 CmdArgs.push_back("-dynamic-linker");
6527 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6528 }
John McCall65b8da02013-04-11 22:55:55 +00006529 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006530 }
6531
6532 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6533 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006534 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006535 CmdArgs.push_back("-m");
6536 CmdArgs.push_back("elf_i386");
6537 }
6538
Daniel Dunbarb440f562010-08-02 02:38:21 +00006539 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006540 CmdArgs.push_back("-o");
6541 CmdArgs.push_back(Output.getFilename());
6542 } else {
6543 assert(Output.isNothing() && "Invalid output.");
6544 }
6545
6546 if (!Args.hasArg(options::OPT_nostdlib) &&
6547 !Args.hasArg(options::OPT_nostartfiles)) {
6548 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00006549 if (Args.hasArg(options::OPT_pg))
6550 CmdArgs.push_back(Args.MakeArgString(
6551 getToolChain().GetFilePath("gcrt1.o")));
6552 else {
6553 if (Args.hasArg(options::OPT_pie))
6554 CmdArgs.push_back(Args.MakeArgString(
6555 getToolChain().GetFilePath("Scrt1.o")));
6556 else
6557 CmdArgs.push_back(Args.MakeArgString(
6558 getToolChain().GetFilePath("crt1.o")));
6559 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006560 }
John McCall65b8da02013-04-11 22:55:55 +00006561 CmdArgs.push_back(Args.MakeArgString(
6562 getToolChain().GetFilePath("crti.o")));
6563 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6564 CmdArgs.push_back(Args.MakeArgString(
6565 getToolChain().GetFilePath("crtbeginS.o")));
6566 else
6567 CmdArgs.push_back(Args.MakeArgString(
6568 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006569 }
6570
6571 Args.AddAllArgs(CmdArgs, options::OPT_L);
6572 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6573 Args.AddAllArgs(CmdArgs, options::OPT_e);
6574
Daniel Dunbar54423b22010-09-17 00:24:54 +00006575 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006576
6577 if (!Args.hasArg(options::OPT_nostdlib) &&
6578 !Args.hasArg(options::OPT_nodefaultlibs)) {
6579 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6580 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00006581 if (UseGCC47)
6582 CmdArgs.push_back("-L/usr/lib/gcc47");
6583 else
6584 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006585
6586 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00006587 if (UseGCC47) {
6588 CmdArgs.push_back("-rpath");
6589 CmdArgs.push_back("/usr/lib/gcc47");
6590 } else {
6591 CmdArgs.push_back("-rpath");
6592 CmdArgs.push_back("/usr/lib/gcc44");
6593 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006594 }
6595
Hans Wennborg70850d82013-07-18 20:29:38 +00006596 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006597 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006598 CmdArgs.push_back("-lm");
6599 }
6600
Daniel Dunbarcc912342009-05-02 18:28:39 +00006601 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006602 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006603
6604 if (!Args.hasArg(options::OPT_nolibc)) {
6605 CmdArgs.push_back("-lc");
6606 }
6607
John McCall65b8da02013-04-11 22:55:55 +00006608 if (UseGCC47) {
6609 if (Args.hasArg(options::OPT_static) ||
6610 Args.hasArg(options::OPT_static_libgcc)) {
6611 CmdArgs.push_back("-lgcc");
6612 CmdArgs.push_back("-lgcc_eh");
6613 } else {
6614 if (Args.hasArg(options::OPT_shared_libgcc)) {
6615 CmdArgs.push_back("-lgcc_pic");
6616 if (!Args.hasArg(options::OPT_shared))
6617 CmdArgs.push_back("-lgcc");
6618 } else {
6619 CmdArgs.push_back("-lgcc");
6620 CmdArgs.push_back("--as-needed");
6621 CmdArgs.push_back("-lgcc_pic");
6622 CmdArgs.push_back("--no-as-needed");
6623 }
6624 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006625 } else {
John McCall65b8da02013-04-11 22:55:55 +00006626 if (Args.hasArg(options::OPT_shared)) {
6627 CmdArgs.push_back("-lgcc_pic");
6628 } else {
6629 CmdArgs.push_back("-lgcc");
6630 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006631 }
6632 }
6633
6634 if (!Args.hasArg(options::OPT_nostdlib) &&
6635 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00006636 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006637 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006638 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00006639 else
6640 CmdArgs.push_back(Args.MakeArgString(
6641 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006642 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00006643 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006644 }
6645
Bill Wendling08760582011-06-27 19:15:03 +00006646 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006647
Daniel Dunbarcc912342009-05-02 18:28:39 +00006648 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006649 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006650 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006651}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006652
6653void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6654 const InputInfo &Output,
6655 const InputInfoList &Inputs,
6656 const ArgList &Args,
6657 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006658 ArgStringList CmdArgs;
6659
6660 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006661 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6662 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006663 } else {
6664 assert(Output.isNothing() && "Invalid output.");
6665 }
6666
6667 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg32e3b722013-08-09 17:38:42 +00006668 !Args.hasArg(options::OPT_nostartfiles) &&
6669 !C.getDriver().IsCLMode()) {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006670 CmdArgs.push_back("-defaultlib:libcmt");
6671 }
6672
6673 CmdArgs.push_back("-nologo");
6674
Hans Wennborgf1a74252013-09-10 20:18:04 +00006675 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
6676
6677 if (DLL) {
6678 CmdArgs.push_back(Args.MakeArgString("-dll"));
6679
6680 SmallString<128> ImplibName(Output.getFilename());
6681 llvm::sys::path::replace_extension(ImplibName, "lib");
6682 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
6683 ImplibName.str()));
6684 }
6685
Hans Wennborg65f17522013-08-27 18:10:21 +00006686 if (getToolChain().getDriver().getOrParseSanitizerArgs(Args).needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00006687 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00006688 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborg65f17522013-08-27 18:10:21 +00006689 SmallString<128> LibSanitizer(getToolChain().getDriver().ResourceDir);
Hans Wennborgf1a74252013-09-10 20:18:04 +00006690 llvm::sys::path::append(LibSanitizer, "lib", "windows");
6691 if (DLL) {
Timur Iskhodzhanov3b6adcb62013-09-11 11:45:31 +00006692 llvm::sys::path::append(LibSanitizer, "clang_rt.asan_dll_thunk-i386.lib");
Hans Wennborgf1a74252013-09-10 20:18:04 +00006693 } else {
6694 llvm::sys::path::append(LibSanitizer, "clang_rt.asan-i386.lib");
6695 }
6696 // FIXME: Handle 64-bit.
Hans Wennborg65f17522013-08-27 18:10:21 +00006697 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
6698 }
6699
Michael J. Spencere2f49362012-06-18 16:56:04 +00006700 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg2e274592013-08-13 23:38:57 +00006701 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00006702
6703 // Add filenames immediately.
6704 for (InputInfoList::const_iterator
6705 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6706 if (it->isFilename())
6707 CmdArgs.push_back(it->getFilename());
Hans Wennborgbe4a6762013-08-14 01:24:35 +00006708 else
6709 it->getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencere2f49362012-06-18 16:56:04 +00006710 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006711
6712 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006713 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006714 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6715}
Hans Wennborg87cfa712013-09-19 20:32:16 +00006716
6717void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
6718 const InputInfo &Output,
6719 const InputInfoList &Inputs,
6720 const ArgList &Args,
6721 const char *LinkingOutput) const {
6722 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
6723}
6724
Hans Wennborg188382e2013-09-20 18:16:35 +00006725// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
6726// If one cannot be found, return FallbackName.
6727// We do this special search to prevent clang-cl from falling back onto itself
6728// if it's available as cl.exe on the path.
6729static std::string FindFallback(const char *FallbackName,
6730 const char *ClangProgramPath) {
6731 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
6732 if (!OptPath.hasValue())
6733 return FallbackName;
6734
6735#ifdef LLVM_ON_WIN32
6736 const StringRef PathSeparators = ";";
6737#else
6738 const StringRef PathSeparators = ":";
6739#endif
6740
6741 SmallVector<StringRef, 8> PathSegments;
6742 llvm::SplitString(OptPath.getValue(), PathSegments, PathSeparators);
6743
6744 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
6745 const StringRef &PathSegment = PathSegments[i];
6746 if (PathSegment.empty())
6747 continue;
6748
6749 SmallString<128> FilePath(PathSegment);
6750 llvm::sys::path::append(FilePath, FallbackName);
6751 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
6752 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
6753 return FilePath.str();
6754 }
6755
6756 return FallbackName;
6757}
6758
Hans Wennborg87cfa712013-09-19 20:32:16 +00006759Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
6760 const InputInfo &Output,
6761 const InputInfoList &Inputs,
6762 const ArgList &Args,
6763 const char *LinkingOutput) const {
6764 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00006765 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00006766 CmdArgs.push_back("/c"); // Compile only.
6767 CmdArgs.push_back("/W0"); // No warnings.
6768
6769 // The goal is to be able to invoke this tool correctly based on
6770 // any flag accepted by clang-cl.
6771
6772 // These are spelled the same way in clang and cl.exe,.
6773 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
6774 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00006775
6776 // Optimization level.
6777 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
6778 if (A->getOption().getID() == options::OPT_O0) {
6779 CmdArgs.push_back("/Od");
6780 } else {
6781 StringRef OptLevel = A->getValue();
6782 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
6783 A->render(Args, CmdArgs);
6784 else if (OptLevel == "3")
6785 CmdArgs.push_back("/Ox");
6786 }
6787 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00006788
6789 // Flags for which clang-cl have an alias.
6790 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
6791
6792 if (Arg *A = Args.getLastArg(options::OPT_frtti, options::OPT_fno_rtti))
6793 CmdArgs.push_back(A->getOption().getID() == options::OPT_frtti ? "/GR"
6794 : "/GR-");
6795 if (Args.hasArg(options::OPT_fsyntax_only))
6796 CmdArgs.push_back("/Zs");
6797
Hans Wennborg260ff402013-09-27 17:54:18 +00006798 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
6799 for (size_t I = 0, E = Includes.size(); I != E; ++I)
6800 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Includes[I]));
6801
Hans Wennborg87cfa712013-09-19 20:32:16 +00006802 // Flags that can simply be passed through.
6803 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
6804 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
6805
6806 // The order of these flags is relevant, so pick the last one.
6807 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
6808 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
6809 A->render(Args, CmdArgs);
6810
6811
6812 // Input filename.
6813 assert(Inputs.size() == 1);
6814 const InputInfo &II = Inputs[0];
6815 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
6816 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
6817 if (II.isFilename())
6818 CmdArgs.push_back(II.getFilename());
6819 else
6820 II.getInputArg().renderAsInput(Args, CmdArgs);
6821
6822 // Output filename.
6823 assert(Output.getType() == types::TY_Object);
6824 const char *Fo = Args.MakeArgString(std::string("/Fo") +
6825 Output.getFilename());
6826 CmdArgs.push_back(Fo);
6827
Hans Wennborg188382e2013-09-20 18:16:35 +00006828 const Driver &D = getToolChain().getDriver();
6829 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborg87cfa712013-09-19 20:32:16 +00006830
Hans Wennborg188382e2013-09-20 18:16:35 +00006831 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00006832}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00006833
6834
6835/// XCore Tools
6836// We pass assemble and link construction to the xcc tool.
6837
6838void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6839 const InputInfo &Output,
6840 const InputInfoList &Inputs,
6841 const ArgList &Args,
6842 const char *LinkingOutput) const {
6843 ArgStringList CmdArgs;
6844
6845 CmdArgs.push_back("-o");
6846 CmdArgs.push_back(Output.getFilename());
6847
6848 CmdArgs.push_back("-c");
6849
6850 if (Args.hasArg(options::OPT_g_Group)) {
6851 CmdArgs.push_back("-g");
6852 }
6853
6854 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6855 options::OPT_Xassembler);
6856
6857 for (InputInfoList::const_iterator
6858 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6859 const InputInfo &II = *it;
6860 CmdArgs.push_back(II.getFilename());
6861 }
6862
6863 const char *Exec =
6864 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
6865 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6866}
6867
6868void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
6869 const InputInfo &Output,
6870 const InputInfoList &Inputs,
6871 const ArgList &Args,
6872 const char *LinkingOutput) const {
6873 ArgStringList CmdArgs;
6874
6875 if (Output.isFilename()) {
6876 CmdArgs.push_back("-o");
6877 CmdArgs.push_back(Output.getFilename());
6878 } else {
6879 assert(Output.isNothing() && "Invalid output.");
6880 }
6881
6882 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6883
6884 const char *Exec =
6885 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
6886 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6887}