blob: 9eb6fd44d63da2d930bd76090f3f382072b9f7a7 [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"
Josh Mageee0fc1a82014-02-11 01:35:14 +000013#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000014#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000015#include "clang/Basic/Version.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000016#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000017#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000018#include "clang/Driver/Driver.h"
19#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000020#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000021#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000022#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000023#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000024#include "clang/Driver/Util.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000025#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000026#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000027#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000028#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000029#include "llvm/Option/Arg.h"
30#include "llvm/Option/ArgList.h"
31#include "llvm/Option/Option.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000032#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000033#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000034#include "llvm/Support/FileSystem.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000035#include "llvm/Support/Format.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000036#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000037#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000038#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000039#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000040#include "llvm/Support/raw_ostream.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000041#include <sys/stat.h>
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000042
Daniel Dunbar1a093d22009-03-18 06:00:36 +000043using namespace clang::driver;
44using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000045using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000046using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000047
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +000048static void addAssemblerKPIC(const ArgList &Args, ArgStringList &CmdArgs) {
49 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
50 options::OPT_fpic, options::OPT_fno_pic,
51 options::OPT_fPIE, options::OPT_fno_PIE,
52 options::OPT_fpie, options::OPT_fno_pie);
53 if (!LastPICArg)
54 return;
55 if (LastPICArg->getOption().matches(options::OPT_fPIC) ||
56 LastPICArg->getOption().matches(options::OPT_fpic) ||
57 LastPICArg->getOption().matches(options::OPT_fPIE) ||
58 LastPICArg->getOption().matches(options::OPT_fpie)) {
59 CmdArgs.push_back("-KPIC");
60 }
61}
62
Daniel Dunbar64198ef2009-09-10 01:21:05 +000063/// CheckPreprocessingOptions - Perform some validation of preprocessing
64/// arguments that is shared with gcc.
65static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
66 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
Hans Wennborg70850d82013-07-18 20:29:38 +000067 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP())
Chris Lattner0e62c1c2011-07-23 10:55:15 +000068 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar64198ef2009-09-10 01:21:05 +000069 << A->getAsString(Args) << "-E";
70}
71
Daniel Dunbar4eadb602009-09-10 01:21:12 +000072/// CheckCodeGenerationOptions - Perform some validation of code generation
73/// arguments that is shared with gcc.
74static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
75 // In gcc, only ARM checks this, but it seems reasonable to check universally.
76 if (Args.hasArg(options::OPT_static))
77 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
78 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000079 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000080 << A->getAsString(Args) << "-static";
81}
82
Chris Lattnerbf2803f2010-03-29 17:55:58 +000083// Quote target names for inclusion in GNU Make dependency files.
84// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000085static void QuoteTarget(StringRef Target,
86 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +000087 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
88 switch (Target[i]) {
89 case ' ':
90 case '\t':
91 // Escape the preceding backslashes
92 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
93 Res.push_back('\\');
94
95 // Escape the space/tab
96 Res.push_back('\\');
97 break;
98 case '$':
99 Res.push_back('$');
100 break;
101 case '#':
102 Res.push_back('\\');
103 break;
104 default:
105 break;
106 }
107
108 Res.push_back(Target[i]);
109 }
110}
111
Bill Wendlingc0938f32012-03-12 22:10:06 +0000112static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +0000113 ArgStringList &CmdArgs,
114 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +0000115 const char *EnvVar) {
116 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000117 bool CombinedArg = false;
118
Bill Wendling281ca292012-03-12 21:22:35 +0000119 if (!DirList)
120 return; // Nothing to do.
121
Chad Rosier616e8a52012-10-30 21:42:09 +0000122 StringRef Name(ArgName);
123 if (Name.equals("-I") || Name.equals("-L"))
124 CombinedArg = true;
125
Bill Wendling281ca292012-03-12 21:22:35 +0000126 StringRef Dirs(DirList);
127 if (Dirs.empty()) // Empty string should not add '.'.
128 return;
129
130 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000131 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000132 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000133 if (CombinedArg) {
134 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
135 } else {
136 CmdArgs.push_back(ArgName);
137 CmdArgs.push_back(".");
138 }
Bill Wendling281ca292012-03-12 21:22:35 +0000139 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000140 if (CombinedArg) {
141 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
142 } else {
143 CmdArgs.push_back(ArgName);
144 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
145 }
Bill Wendling281ca292012-03-12 21:22:35 +0000146 }
Nico Weber89355782012-03-19 15:00:03 +0000147 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000148 }
149
150 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000151 if (CombinedArg) {
152 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
153 } else {
154 CmdArgs.push_back(ArgName);
155 CmdArgs.push_back(".");
156 }
Bill Wendling281ca292012-03-12 21:22:35 +0000157 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000158 if (CombinedArg) {
159 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
160 } else {
161 CmdArgs.push_back(ArgName);
162 CmdArgs.push_back(Args.MakeArgString(Dirs));
163 }
Bill Wendling281ca292012-03-12 21:22:35 +0000164 }
165}
166
Daniel Dunbar54423b22010-09-17 00:24:54 +0000167static void AddLinkerInputs(const ToolChain &TC,
168 const InputInfoList &Inputs, const ArgList &Args,
169 ArgStringList &CmdArgs) {
170 const Driver &D = TC.getDriver();
171
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000172 // Add extra linker input arguments which are not treated as inputs
173 // (constructed via -Xarch_).
174 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
175
Daniel Dunbar54423b22010-09-17 00:24:54 +0000176 for (InputInfoList::const_iterator
177 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
178 const InputInfo &II = *it;
179
180 if (!TC.HasNativeLLVMSupport()) {
181 // Don't try to pass LLVM inputs unless we have native support.
182 if (II.getType() == types::TY_LLVM_IR ||
183 II.getType() == types::TY_LTO_IR ||
184 II.getType() == types::TY_LLVM_BC ||
185 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000186 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000187 << TC.getTripleString();
188 }
189
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000190 // Add filenames immediately.
191 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000192 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000193 continue;
194 }
195
196 // Otherwise, this is a linker input argument.
197 const Arg &A = II.getInputArg();
198
199 // Handle reserved library options.
200 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000201 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Senafeb03b2010-09-17 18:39:08 +0000202 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
203 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000204 } else
205 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar54423b22010-09-17 00:24:54 +0000206 }
Bill Wendling281ca292012-03-12 21:22:35 +0000207
208 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000209 // and only supported on native toolchains.
210 if (!TC.isCrossCompiling())
211 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000212}
213
John McCall31168b02011-06-15 23:02:42 +0000214/// \brief Determine whether Objective-C automated reference counting is
215/// enabled.
216static bool isObjCAutoRefCount(const ArgList &Args) {
217 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
218}
219
Ted Kremeneke65b0862012-03-06 20:05:56 +0000220/// \brief Determine whether we are linking the ObjC runtime.
221static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000222 if (isObjCAutoRefCount(Args)) {
223 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000224 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000225 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000226 return Args.hasArg(options::OPT_fobjc_link_runtime);
227}
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");
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000299
300 if (isa<PrecompileJobAction>(JA))
301 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000302 }
303
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000304 if (Args.hasArg(options::OPT_MG)) {
305 if (!A || A->getOption().matches(options::OPT_MD) ||
306 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000307 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000308 CmdArgs.push_back("-MG");
309 }
310
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000311 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000312
313 // Convert all -MQ <target> args to -MT <quoted target>
314 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
315 options::OPT_MQ),
316 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000317 const Arg *A = *it;
318 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000319
Daniel Dunbara442fd52010-06-11 22:00:13 +0000320 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000321 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000322 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000323 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000324 CmdArgs.push_back(Args.MakeArgString(Quoted));
325
326 // -MT flag - no change
327 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000328 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000329 }
330 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000331
Douglas Gregor111af7d2009-04-18 00:34:01 +0000332 // Add -i* options, and automatically translate to
333 // -include-pch/-include-pth for transparent PCH support. It's
334 // wonky, but we include looking for .gch so we can support seamless
335 // replacement into a build system already set up to be generating
336 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000337 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000338 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
339 ie = Args.filtered_end(); it != ie; ++it) {
340 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341
342 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000343 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
344 RenderedImplicitInclude = true;
345
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000346 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000347 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000348
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000349 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000350 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000351 SmallString<128> P(A->getValue());
352 // We want the files to have a name like foo.h.pch. Add a dummy extension
353 // so that replace_extension does the right thing.
354 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000355 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000356 llvm::sys::path::replace_extension(P, "pch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000357 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000358 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000359 }
360
Douglas Gregor111af7d2009-04-18 00:34:01 +0000361 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000362 llvm::sys::path::replace_extension(P, "pth");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000363 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000364 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000365 }
366
Douglas Gregor111af7d2009-04-18 00:34:01 +0000367 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000368 llvm::sys::path::replace_extension(P, "gch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000369 if (llvm::sys::fs::exists(P.str())) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000370 FoundPCH = UsePCH;
371 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000372 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000373 }
374
375 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000376 if (IsFirstImplicitInclude) {
377 A->claim();
378 if (UsePCH)
379 CmdArgs.push_back("-include-pch");
380 else
381 CmdArgs.push_back("-include-pth");
382 CmdArgs.push_back(Args.MakeArgString(P.str()));
383 continue;
384 } else {
385 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000386 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000387 << P.str() << A->getAsString(Args);
388 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000389 }
390 }
391
392 // Not translated, render as usual.
393 A->claim();
394 A->render(Args, CmdArgs);
395 }
396
397 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000398 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
399 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000400
401 // Add -Wp, and -Xassembler if using the preprocessor.
402
403 // FIXME: There is a very unfortunate problem here, some troubled
404 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
405 // really support that we would have to parse and then translate
406 // those options. :(
407 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
408 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000409
410 // -I- is a deprecated GCC feature, reject it.
411 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000412 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000413
414 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
415 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000416 StringRef sysroot = C.getSysRoot();
417 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000418 if (!Args.hasArg(options::OPT_isysroot)) {
419 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000420 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000421 }
422 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000423
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000424 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000425 // FIXME: We should probably sink the logic for handling these from the
426 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000427 // CPATH - included following the user specified includes (but prior to
428 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000429 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000430 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000431 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000432 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000433 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000434 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000435 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000436 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000437 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000438
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000439 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000440 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000441 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000442
443 // Add system include arguments.
444 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000445}
446
Amara Emerson703da2e2013-10-31 09:32:33 +0000447/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are targeting.
448//
449// FIXME: tblgen this.
450static std::string getAArch64TargetCPU(const ArgList &Args,
451 const llvm::Triple &Triple) {
452 // FIXME: Warn on inconsistent use of -mcpu and -march.
453
454 // If we have -mcpu=, use that.
455 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
456 StringRef MCPU = A->getValue();
457 // Handle -mcpu=native.
458 if (MCPU == "native")
459 return llvm::sys::getHostCPUName();
460 else
461 return MCPU;
462 }
463
464 return "generic";
465}
466
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000467// FIXME: Move to target hook.
468static bool isSignedCharDefault(const llvm::Triple &Triple) {
469 switch (Triple.getArch()) {
470 default:
471 return true;
472
Tim Northover9bb857a2013-01-31 12:13:10 +0000473 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000474 case llvm::Triple::aarch64_be:
Tim Northovera2ee4332014-03-29 15:09:45 +0000475 case llvm::Triple::arm64:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000476 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000477 case llvm::Triple::armeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000478 if (Triple.isOSDarwin() || Triple.isOSWindows())
479 return true;
480 return false;
481
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000482 case llvm::Triple::ppc:
483 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000484 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000485 return true;
486 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000487
Bill Schmidt778d3872013-07-26 01:36:11 +0000488 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000489 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000490 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000491 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000492 }
493}
494
Robert Lytton0e076492013-08-13 09:43:10 +0000495static bool isNoCommonDefault(const llvm::Triple &Triple) {
496 switch (Triple.getArch()) {
497 default:
498 return false;
499
500 case llvm::Triple::xcore:
501 return true;
502 }
503}
504
Chad Rosiercfbfc582012-04-04 20:51:35 +0000505// Handle -mfpu=.
506//
507// FIXME: Centralize feature selection, defaulting shouldn't be also in the
508// frontend target.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000509static void getAArch64FPUFeatures(const Driver &D, const Arg *A,
510 const ArgList &Args,
511 std::vector<const char *> &Features) {
512 StringRef FPU = A->getValue();
513 if (FPU == "fp-armv8") {
514 Features.push_back("+fp-armv8");
515 } else if (FPU == "neon-fp-armv8") {
516 Features.push_back("+fp-armv8");
517 Features.push_back("+neon");
518 } else if (FPU == "crypto-neon-fp-armv8") {
519 Features.push_back("+fp-armv8");
520 Features.push_back("+neon");
521 Features.push_back("+crypto");
522 } else if (FPU == "neon") {
523 Features.push_back("+neon");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000524 } else
525 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
526}
527
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000528// Handle -mhwdiv=.
529static void getARMHWDivFeatures(const Driver &D, const Arg *A,
530 const ArgList &Args,
531 std::vector<const char *> &Features) {
532 StringRef HWDiv = A->getValue();
533 if (HWDiv == "arm") {
534 Features.push_back("+hwdiv-arm");
535 Features.push_back("-hwdiv");
536 } else if (HWDiv == "thumb") {
537 Features.push_back("-hwdiv-arm");
538 Features.push_back("+hwdiv");
539 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
540 Features.push_back("+hwdiv-arm");
541 Features.push_back("+hwdiv");
542 } else if (HWDiv == "none") {
543 Features.push_back("-hwdiv-arm");
544 Features.push_back("-hwdiv");
545 } else
546 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
547}
548
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000549// Handle -mfpu=.
550//
551// FIXME: Centralize feature selection, defaulting shouldn't be also in the
552// frontend target.
553static void getARMFPUFeatures(const Driver &D, const Arg *A,
554 const ArgList &Args,
555 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000556 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000557
558 // Set the target features based on the FPU.
559 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
560 // Disable any default FPU support.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000561 Features.push_back("-vfp2");
562 Features.push_back("-vfp3");
563 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000564 } else if (FPU == "vfp") {
565 Features.push_back("+vfp2");
566 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000567 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000568 Features.push_back("+vfp3");
569 Features.push_back("+d16");
570 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000571 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000572 Features.push_back("+vfp3");
573 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000574 } else if (FPU == "vfp4-d16" || FPU == "vfpv4-d16") {
575 Features.push_back("+vfp4");
576 Features.push_back("+d16");
577 Features.push_back("-neon");
578 } else if (FPU == "vfp4" || FPU == "vfpv4") {
579 Features.push_back("+vfp4");
580 Features.push_back("-neon");
Oliver Stannard96601ca2014-02-21 10:39:15 +0000581 } else if (FPU == "fp4-sp-d16" || FPU == "fpv4-sp-d16") {
582 Features.push_back("+vfp4");
583 Features.push_back("+d16");
584 Features.push_back("+fp-only-sp");
585 Features.push_back("-neon");
Joey Gouly7db275b2013-06-27 13:19:54 +0000586 } else if (FPU == "fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000587 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000588 Features.push_back("-neon");
589 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000590 } else if (FPU == "neon-fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000591 Features.push_back("+fp-armv8");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000592 Features.push_back("+neon");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000593 Features.push_back("-crypto");
Amara Emersonfc362c62013-09-19 13:54:03 +0000594 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersonfc362c62013-09-19 13:54:03 +0000595 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000596 Features.push_back("+neon");
597 Features.push_back("+crypto");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000598 } else if (FPU == "neon") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000599 Features.push_back("+neon");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000600 } else if (FPU == "none") {
601 Features.push_back("-vfp2");
602 Features.push_back("-vfp3");
603 Features.push_back("-vfp4");
604 Features.push_back("-fp-armv8");
605 Features.push_back("-crypto");
606 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000607 } else
608 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
609}
610
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000611// Select the float ABI as determined by -msoft-float, -mhard-float, and
612// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000613StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
614 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000615 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000616 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
617 options::OPT_mhard_float,
618 options::OPT_mfloat_abi_EQ)) {
619 if (A->getOption().matches(options::OPT_msoft_float))
620 FloatABI = "soft";
621 else if (A->getOption().matches(options::OPT_mhard_float))
622 FloatABI = "hard";
623 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000624 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000625 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000626 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000627 << A->getAsString(Args);
628 FloatABI = "soft";
629 }
630 }
631 }
632
633 // If unspecified, choose the default based on the platform.
634 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000635 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000636 case llvm::Triple::Darwin:
637 case llvm::Triple::MacOSX:
638 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000639 // Darwin defaults to "softfp" for v6 and v7.
640 //
641 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000642 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000643 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000644 if (StringRef(ArchName).startswith("v6") ||
645 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000646 FloatABI = "softfp";
647 else
648 FloatABI = "soft";
649 break;
650 }
651
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000652 // FIXME: this is invalid for WindowsCE
653 case llvm::Triple::Win32:
654 FloatABI = "hard";
655 break;
656
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000657 case llvm::Triple::FreeBSD:
Renato Golinf4421f72014-02-19 10:44:07 +0000658 switch(Triple.getEnvironment()) {
659 case llvm::Triple::GNUEABIHF:
660 FloatABI = "hard";
661 break;
662 default:
663 // FreeBSD defaults to soft float
664 FloatABI = "soft";
665 break;
666 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000667 break;
668
Daniel Dunbar78485922009-09-10 23:00:09 +0000669 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000670 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000671 case llvm::Triple::GNUEABIHF:
672 FloatABI = "hard";
673 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000674 case llvm::Triple::GNUEABI:
675 FloatABI = "softfp";
676 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000677 case llvm::Triple::EABIHF:
678 FloatABI = "hard";
679 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000680 case llvm::Triple::EABI:
681 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
682 FloatABI = "softfp";
683 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000684 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000685 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000686 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000687 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000688 FloatABI = "softfp";
689 else
690 FloatABI = "soft";
691 break;
692 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000693 default:
694 // Assume "soft", but warn the user we are guessing.
695 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000696 if (Triple.getOS() != llvm::Triple::UnknownOS ||
697 !Triple.isOSBinFormatMachO())
698 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000699 break;
700 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000701 }
702 }
703
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000704 return FloatABI;
705}
706
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000707static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
708 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000709 std::vector<const char *> &Features,
710 bool ForAS) {
Tim Northover9c7e0352013-12-12 11:55:52 +0000711 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000712 if (!ForAS) {
713 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
714 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
715 // stripped out by the ARM target. We should probably pass this a new
716 // -target-option, which is handled by the -cc1/-cc1as invocation.
717 //
718 // FIXME2: For consistency, it would be ideal if we set up the target
719 // machine state the same when using the frontend or the assembler. We don't
720 // currently do that for the assembler, we pass the options directly to the
721 // backend and never even instantiate the frontend TargetInfo. If we did,
722 // and used its handleTargetFeatures hook, then we could ensure the
723 // assembler and the frontend behave the same.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000724
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000725 // Use software floating point operations?
726 if (FloatABI == "soft")
727 Features.push_back("+soft-float");
728
729 // Use software floating point argument passing?
730 if (FloatABI != "hard")
731 Features.push_back("+soft-float-abi");
732 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000733
734 // Honor -mfpu=.
735 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000736 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000737 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
738 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000739
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000740 // Setting -msoft-float effectively disables NEON because of the GCC
741 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000742 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000743 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000744 // Also need to explicitly disable features which imply NEON.
745 Features.push_back("-crypto");
746 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000747
748 // En/disable crc
749 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
750 options::OPT_mnocrc)) {
751 if (A->getOption().matches(options::OPT_mcrc))
752 Features.push_back("+crc");
753 else
754 Features.push_back("-crc");
755 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000756}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000757
758void Clang::AddARMTargetArgs(const ArgList &Args,
759 ArgStringList &CmdArgs,
760 bool KernelOrKext) const {
761 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000762 // Get the effective triple, which takes into account the deployment target.
763 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
764 llvm::Triple Triple(TripleStr);
Bernard Ogden31561762013-12-12 13:27:11 +0000765 std::string CPUName = arm::getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000766
767 // Select the ABI to use.
768 //
769 // FIXME: Support -meabi.
770 const char *ABIName = 0;
771 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000772 ABIName = A->getValue();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000773 } else if (Triple.isOSDarwin()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000774 // The backend is hardwired to assume AAPCS for M-class processors, ensure
775 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000776 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +0000777 (Triple.getOS() == llvm::Triple::UnknownOS &&
778 Triple.getObjectFormat() == llvm::Triple::MachO) ||
Tim Northovere66c9462013-10-03 14:23:28 +0000779 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000780 ABIName = "aapcs";
781 } else {
782 ABIName = "apcs-gnu";
783 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000784 } else if (Triple.isOSWindows()) {
785 // FIXME: this is invalid for WindowsCE
786 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000787 } else {
788 // Select the default based on the platform.
789 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000790 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000791 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000792 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000793 ABIName = "aapcs-linux";
794 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000795 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000796 case llvm::Triple::EABI:
797 ABIName = "aapcs";
798 break;
799 default:
800 ABIName = "apcs-gnu";
801 }
802 }
803 CmdArgs.push_back("-target-abi");
804 CmdArgs.push_back(ABIName);
805
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000806 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000807 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000808 if (FloatABI == "soft") {
809 // Floating point operations and argument passing are soft.
810 //
811 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000812 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000813 CmdArgs.push_back("-mfloat-abi");
814 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000815 } else if (FloatABI == "softfp") {
816 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000817 CmdArgs.push_back("-mfloat-abi");
818 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000819 } else {
820 // Floating point operations and argument passing are hard.
821 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000822 CmdArgs.push_back("-mfloat-abi");
823 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000824 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000825
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000826 // Kernel code has more strict alignment requirements.
827 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000828 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000829 CmdArgs.push_back("-backend-option");
830 CmdArgs.push_back("-arm-long-calls");
831 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000832
Daniel Dunbar12100e22011-03-22 16:48:17 +0000833 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000834 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000835
836 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000837 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000838 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000839 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000840
841 // Setting -mno-global-merge disables the codegen global merge pass. Setting
842 // -mglobal-merge has no effect as the pass is enabled by default.
843 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
844 options::OPT_mno_global_merge)) {
845 if (A->getOption().matches(options::OPT_mno_global_merge))
846 CmdArgs.push_back("-mno-global-merge");
847 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000848
Bob Wilson9c8af452013-04-11 18:53:25 +0000849 if (!Args.hasFlag(options::OPT_mimplicit_float,
850 options::OPT_mno_implicit_float,
851 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000852 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000853
Logan Chien749763e2014-04-03 13:12:44 +0000854 // llvm does not support reserving registers in general. There is support
855 // for reserving r9 on ARM though (defined as a platform-specific register
856 // in ARM EABI).
857 if (Args.hasArg(options::OPT_ffixed_r9)) {
858 CmdArgs.push_back("-backend-option");
859 CmdArgs.push_back("-arm-reserve-r9");
860 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000861}
862
Tim Northovera2ee4332014-03-29 15:09:45 +0000863/// getARM64TargetCPU - Get the (LLVM) name of the ARM64 cpu we are targeting.
864static std::string getARM64TargetCPU(const ArgList &Args) {
865 // If we have -mcpu=, use that.
866 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
867 StringRef MCPU = A->getValue();
868 // Handle -mcpu=native.
869 if (MCPU == "native")
870 return llvm::sys::getHostCPUName();
871 else
872 return MCPU;
873 }
874
875 // At some point, we may need to check -march here, but for now we only
876 // one arm64 architecture.
877
878 // Default to "cyclone" CPU.
879 return "cyclone";
880}
881
882void Clang::AddARM64TargetArgs(const ArgList &Args,
883 ArgStringList &CmdArgs) const {
884 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
885 llvm::Triple Triple(TripleStr);
886
887 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
888 Args.hasArg(options::OPT_mkernel) ||
889 Args.hasArg(options::OPT_fapple_kext))
890 CmdArgs.push_back("-disable-red-zone");
891
892 if (!Args.hasFlag(options::OPT_mimplicit_float,
893 options::OPT_mno_implicit_float, true))
894 CmdArgs.push_back("-no-implicit-float");
895
896 const char *ABIName = 0;
897 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
898 ABIName = A->getValue();
899 else if (Triple.isOSDarwin())
900 ABIName = "darwinpcs";
901 else
902 ABIName = "aapcs";
903
904 CmdArgs.push_back("-target-abi");
905 CmdArgs.push_back(ABIName);
906
907 CmdArgs.push_back("-target-cpu");
908 CmdArgs.push_back(Args.MakeArgString(getARM64TargetCPU(Args)));
909
910 if (Args.hasArg(options::OPT_mstrict_align)) {
911 CmdArgs.push_back("-backend-option");
912 CmdArgs.push_back("-arm64-strict-align");
913 }
914}
915
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000916// Get CPU and ABI names. They are not independent
917// so we have to calculate them together.
918static void getMipsCPUAndABI(const ArgList &Args,
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000919 const llvm::Triple &Triple,
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000920 StringRef &CPUName,
921 StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +0000922 const char *DefMips32CPU = "mips32r2";
923 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000924
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000925 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000926 options::OPT_mcpu_EQ))
927 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000928
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000929 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000930 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000931 // Convert a GNU style Mips ABI name to the name
932 // accepted by LLVM Mips backend.
933 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
934 .Case("32", "o32")
935 .Case("64", "n64")
936 .Default(ABIName);
937 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000938
939 // Setup default CPU and ABI names.
940 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000941 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000942 default:
943 llvm_unreachable("Unexpected triple arch name");
944 case llvm::Triple::mips:
945 case llvm::Triple::mipsel:
946 CPUName = DefMips32CPU;
947 break;
948 case llvm::Triple::mips64:
949 case llvm::Triple::mips64el:
950 CPUName = DefMips64CPU;
951 break;
952 }
953 }
954
955 if (!ABIName.empty()) {
956 // Deduce CPU name from ABI name.
957 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000958 .Cases("32", "o32", "eabi", DefMips32CPU)
959 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000960 .Default("");
961 }
962 else if (!CPUName.empty()) {
963 // Deduce ABI name from CPU name.
964 ABIName = llvm::StringSwitch<const char *>(CPUName)
965 .Cases("mips32", "mips32r2", "o32")
966 .Cases("mips64", "mips64r2", "n64")
967 .Default("");
968 }
969
970 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000971}
972
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000973// Convert ABI name to the GNU tools acceptable variant.
974static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
975 return llvm::StringSwitch<llvm::StringRef>(ABI)
976 .Case("o32", "32")
977 .Case("n64", "64")
978 .Default(ABI);
979}
980
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000981// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
982// and -mfloat-abi=.
983static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000984 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000985 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000986 options::OPT_mhard_float,
987 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000988 if (A->getOption().matches(options::OPT_msoft_float))
989 FloatABI = "soft";
990 else if (A->getOption().matches(options::OPT_mhard_float))
991 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000992 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000993 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +0000994 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000995 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000996 FloatABI = "hard";
997 }
998 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000999 }
1000
1001 // If unspecified, choose the default based on the platform.
1002 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001003 // Assume "hard", because it's a default value used by gcc.
1004 // When we start to recognize specific target MIPS processors,
1005 // we will be able to select the default more correctly.
1006 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001007 }
1008
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001009 return FloatABI;
1010}
1011
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001012static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001013 std::vector<const char *> &Features,
1014 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001015 StringRef FeatureName) {
1016 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001017 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001018 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001019 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001020 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001021 }
1022}
1023
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001024static void getMIPSTargetFeatures(const Driver &D, const ArgList &Args,
1025 std::vector<const char *> &Features) {
1026 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001027 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001028 // FIXME: Note, this is a hack. We need to pass the selected float
1029 // mode to the MipsTargetInfoBase to define appropriate macros there.
1030 // Now it is the only method.
1031 Features.push_back("+soft-float");
1032 }
1033
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001034 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
1035 if (StringRef(A->getValue()) == "2008")
1036 Features.push_back("+nan2008");
1037 }
1038
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001039 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1040 options::OPT_mdouble_float, "single-float");
1041 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1042 "mips16");
1043 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1044 options::OPT_mno_micromips, "micromips");
1045 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1046 "dsp");
1047 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1048 "dspr2");
1049 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1050 "msa");
Daniel Sanders94694172013-10-17 14:55:58 +00001051 AddTargetFeature(Args, Features, options::OPT_mfp64, options::OPT_mfp32,
1052 "fp64");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001053}
1054
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001055void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001056 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001057 const Driver &D = getToolChain().getDriver();
1058 StringRef CPUName;
1059 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001060 const llvm::Triple &Triple = getToolChain().getTriple();
1061 getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001062
1063 CmdArgs.push_back("-target-abi");
1064 CmdArgs.push_back(ABIName.data());
1065
1066 StringRef FloatABI = getMipsFloatABI(D, Args);
1067
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001068 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001069 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001070 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001071 CmdArgs.push_back("-mfloat-abi");
1072 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001073 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001074 else {
1075 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001076 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001077 CmdArgs.push_back("-mfloat-abi");
1078 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001079 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001080
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001081 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1082 if (A->getOption().matches(options::OPT_mxgot)) {
1083 CmdArgs.push_back("-mllvm");
1084 CmdArgs.push_back("-mxgot");
1085 }
1086 }
1087
Simon Atanasyanc580b322013-05-11 06:33:44 +00001088 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1089 options::OPT_mno_ldc1_sdc1)) {
1090 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1091 CmdArgs.push_back("-mllvm");
1092 CmdArgs.push_back("-mno-ldc1-sdc1");
1093 }
1094 }
1095
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001096 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1097 options::OPT_mno_check_zero_division)) {
1098 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1099 CmdArgs.push_back("-mllvm");
1100 CmdArgs.push_back("-mno-check-zero-division");
1101 }
1102 }
1103
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001104 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001105 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001106 CmdArgs.push_back("-mllvm");
1107 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1108 A->claim();
1109 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001110}
1111
Hal Finkel8eb59282012-06-11 22:35:19 +00001112/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1113static std::string getPPCTargetCPU(const ArgList &Args) {
1114 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001115 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001116
1117 if (CPUName == "native") {
1118 std::string CPU = llvm::sys::getHostCPUName();
1119 if (!CPU.empty() && CPU != "generic")
1120 return CPU;
1121 else
1122 return "";
1123 }
1124
1125 return llvm::StringSwitch<const char *>(CPUName)
1126 .Case("common", "generic")
1127 .Case("440", "440")
1128 .Case("440fp", "440")
1129 .Case("450", "450")
1130 .Case("601", "601")
1131 .Case("602", "602")
1132 .Case("603", "603")
1133 .Case("603e", "603e")
1134 .Case("603ev", "603ev")
1135 .Case("604", "604")
1136 .Case("604e", "604e")
1137 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001138 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001139 .Case("G3", "g3")
1140 .Case("7400", "7400")
1141 .Case("G4", "g4")
1142 .Case("7450", "7450")
1143 .Case("G4+", "g4+")
1144 .Case("750", "750")
1145 .Case("970", "970")
1146 .Case("G5", "g5")
1147 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001148 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001149 .Case("e500mc", "e500mc")
1150 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001151 .Case("power3", "pwr3")
1152 .Case("power4", "pwr4")
1153 .Case("power5", "pwr5")
1154 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001155 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001156 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001157 .Case("power7", "pwr7")
Bill Schmidt38378a02013-02-01 20:23:10 +00001158 .Case("pwr3", "pwr3")
1159 .Case("pwr4", "pwr4")
1160 .Case("pwr5", "pwr5")
1161 .Case("pwr5x", "pwr5x")
1162 .Case("pwr6", "pwr6")
1163 .Case("pwr6x", "pwr6x")
1164 .Case("pwr7", "pwr7")
Hal Finkel8eb59282012-06-11 22:35:19 +00001165 .Case("powerpc", "ppc")
1166 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001167 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001168 .Default("");
1169 }
1170
1171 return "";
1172}
1173
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001174static void getPPCTargetFeatures(const ArgList &Args,
1175 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001176 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1177 ie = Args.filtered_end();
1178 it != ie; ++it) {
1179 StringRef Name = (*it)->getOption().getName();
1180 (*it)->claim();
1181
1182 // Skip over "-m".
1183 assert(Name.startswith("m") && "Invalid feature name.");
1184 Name = Name.substr(1);
1185
1186 bool IsNegative = Name.startswith("no-");
1187 if (IsNegative)
1188 Name = Name.substr(3);
1189
1190 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1191 // pass the correct option to the backend while calling the frontend
1192 // option the same.
1193 // TODO: Change the LLVM backend option maybe?
1194 if (Name == "mfcrf")
1195 Name = "mfocrf";
1196
1197 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1198 }
1199
1200 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001201 AddTargetFeature(Args, Features, options::OPT_faltivec,
1202 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001203}
1204
Tom Stellard6674c702013-04-01 20:56:53 +00001205/// Get the (LLVM) name of the R600 gpu we are targeting.
1206static std::string getR600TargetGPU(const ArgList &Args) {
1207 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001208 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001209 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001210 .Cases("rv630", "rv635", "r600")
1211 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001212 .Case("rv740", "rv770")
1213 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001214 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001215 .Case("hemlock", "cypress")
1216 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001217 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001218 }
1219 return "";
1220}
1221
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001222static void getSparcTargetFeatures(const ArgList &Args,
1223 std::vector<const char *> Features) {
1224 bool SoftFloatABI = true;
1225 if (Arg *A =
1226 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1227 if (A->getOption().matches(options::OPT_mhard_float))
1228 SoftFloatABI = false;
1229 }
1230 if (SoftFloatABI)
1231 Features.push_back("+soft-float");
1232}
1233
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001234void Clang::AddSparcTargetArgs(const ArgList &Args,
1235 ArgStringList &CmdArgs) const {
1236 const Driver &D = getToolChain().getDriver();
1237
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001238 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001239 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001240 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1241 options::OPT_mhard_float)) {
1242 if (A->getOption().matches(options::OPT_msoft_float))
1243 FloatABI = "soft";
1244 else if (A->getOption().matches(options::OPT_mhard_float))
1245 FloatABI = "hard";
1246 }
1247
1248 // If unspecified, choose the default based on the platform.
1249 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001250 // Assume "soft", but warn the user we are guessing.
1251 FloatABI = "soft";
1252 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001253 }
1254
1255 if (FloatABI == "soft") {
1256 // Floating point operations and argument passing are soft.
1257 //
1258 // FIXME: This changes CPP defines, we need -target-soft-float.
1259 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001260 } else {
1261 assert(FloatABI == "hard" && "Invalid float abi!");
1262 CmdArgs.push_back("-mhard-float");
1263 }
1264}
1265
Richard Sandiford4652d892013-07-19 16:51:51 +00001266static const char *getSystemZTargetCPU(const ArgList &Args) {
1267 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1268 return A->getValue();
1269 return "z10";
1270}
1271
Chandler Carruth953fb082013-01-13 11:46:33 +00001272static const char *getX86TargetCPU(const ArgList &Args,
1273 const llvm::Triple &Triple) {
1274 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001275 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001276 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001277 return "core-avx2";
1278
Chandler Carruth953fb082013-01-13 11:46:33 +00001279 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001280 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001281
1282 // FIXME: Reject attempts to use -march=native unless the target matches
1283 // the host.
1284 //
1285 // FIXME: We should also incorporate the detected target features for use
1286 // with -native.
1287 std::string CPU = llvm::sys::getHostCPUName();
1288 if (!CPU.empty() && CPU != "generic")
1289 return Args.MakeArgString(CPU);
1290 }
1291
1292 // Select the default CPU if none was given (or detection failed).
1293
1294 if (Triple.getArch() != llvm::Triple::x86_64 &&
1295 Triple.getArch() != llvm::Triple::x86)
1296 return 0; // This routine is only handling x86 targets.
1297
1298 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1299
1300 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001301 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001302 if (Triple.getArchName() == "x86_64h")
1303 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001304 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001305 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001306
Alexey Bataev286d1b92014-01-31 04:07:13 +00001307 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001308 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001309 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001310
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001311 // Everything else goes to x86-64 in 64-bit mode.
1312 if (Is64Bit)
1313 return "x86-64";
1314
1315 switch (Triple.getOS()) {
1316 case llvm::Triple::FreeBSD:
1317 case llvm::Triple::NetBSD:
1318 case llvm::Triple::OpenBSD:
1319 return "i486";
1320 case llvm::Triple::Haiku:
1321 return "i586";
1322 case llvm::Triple::Bitrig:
1323 return "i686";
1324 default:
1325 // Fallback to p4.
1326 return "pentium4";
1327 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001328}
1329
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001330static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1331 switch(T.getArch()) {
1332 default:
1333 return "";
1334
Amara Emerson703da2e2013-10-31 09:32:33 +00001335 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001336 case llvm::Triple::aarch64_be:
Amara Emerson703da2e2013-10-31 09:32:33 +00001337 return getAArch64TargetCPU(Args, T);
1338
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001339 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001340 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001341 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001342 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001343 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001344
1345 case llvm::Triple::mips:
1346 case llvm::Triple::mipsel:
1347 case llvm::Triple::mips64:
1348 case llvm::Triple::mips64el: {
1349 StringRef CPUName;
1350 StringRef ABIName;
1351 getMipsCPUAndABI(Args, T, CPUName, ABIName);
1352 return CPUName;
1353 }
1354
1355 case llvm::Triple::ppc:
1356 case llvm::Triple::ppc64:
1357 case llvm::Triple::ppc64le: {
1358 std::string TargetCPUName = getPPCTargetCPU(Args);
1359 // LLVM may default to generating code for the native CPU,
1360 // but, like gcc, we default to a more generic option for
1361 // each architecture. (except on Darwin)
1362 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1363 if (T.getArch() == llvm::Triple::ppc64)
1364 TargetCPUName = "ppc64";
1365 else if (T.getArch() == llvm::Triple::ppc64le)
1366 TargetCPUName = "ppc64le";
1367 else
1368 TargetCPUName = "ppc";
1369 }
1370 return TargetCPUName;
1371 }
1372
1373 case llvm::Triple::sparc:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001374 case llvm::Triple::sparcv9:
1375 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001376 return A->getValue();
1377 return "";
1378
1379 case llvm::Triple::x86:
1380 case llvm::Triple::x86_64:
1381 return getX86TargetCPU(Args, T);
1382
1383 case llvm::Triple::hexagon:
1384 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1385
1386 case llvm::Triple::systemz:
1387 return getSystemZTargetCPU(Args);
1388
1389 case llvm::Triple::r600:
1390 return getR600TargetGPU(Args);
1391 }
1392}
1393
Alp Tokerce365ca2013-12-02 12:43:03 +00001394static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1395 ArgStringList &CmdArgs) {
1396 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1397 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1398 // forward.
1399 CmdArgs.push_back("-plugin");
1400 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
1401 CmdArgs.push_back(Args.MakeArgString(Plugin));
1402
1403 // Try to pass driver level flags relevant to LTO code generation down to
1404 // the plugin.
1405
1406 // Handle flags for selecting CPU variants.
1407 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1408 if (!CPU.empty())
1409 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1410}
1411
Jim Grosbach82eee262013-11-16 00:53:35 +00001412static void getX86TargetFeatures(const llvm::Triple &Triple,
1413 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001414 std::vector<const char *> &Features) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001415 if (Triple.getArchName() == "x86_64h") {
1416 // x86_64h implies quite a few of the more modern subtarget features
1417 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1418 Features.push_back("-rdrnd");
1419 Features.push_back("-aes");
1420 Features.push_back("-pclmul");
1421 Features.push_back("-rtm");
1422 Features.push_back("-hle");
1423 Features.push_back("-fsgsbase");
1424 }
1425
Alexey Bataev286d1b92014-01-31 04:07:13 +00001426 if (Triple.getEnvironment() == llvm::Triple::Android) {
1427 // Add sse3 feature to comply with gcc on Android
1428 Features.push_back("+sse3");
1429 }
1430
Jim Grosbach82eee262013-11-16 00:53:35 +00001431 // Now add any that the user explicitly requested on the command line,
1432 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001433 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1434 ie = Args.filtered_end();
1435 it != ie; ++it) {
1436 StringRef Name = (*it)->getOption().getName();
1437 (*it)->claim();
1438
1439 // Skip over "-m".
1440 assert(Name.startswith("m") && "Invalid feature name.");
1441 Name = Name.substr(1);
1442
1443 bool IsNegative = Name.startswith("no-");
1444 if (IsNegative)
1445 Name = Name.substr(3);
1446
1447 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1448 }
1449}
1450
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001451void Clang::AddX86TargetArgs(const ArgList &Args,
1452 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001453 if (!Args.hasFlag(options::OPT_mred_zone,
1454 options::OPT_mno_red_zone,
1455 true) ||
1456 Args.hasArg(options::OPT_mkernel) ||
1457 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001458 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001459
Bob Wilson2616e2e2013-02-10 16:01:41 +00001460 // Default to avoid implicit floating-point for kernel/kext code, but allow
1461 // that to be overridden with -mno-soft-float.
1462 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1463 Args.hasArg(options::OPT_fapple_kext));
1464 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1465 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001466 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001467 options::OPT_mno_implicit_float)) {
1468 const Option &O = A->getOption();
1469 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1470 O.matches(options::OPT_msoft_float));
1471 }
1472 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001473 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001474}
1475
Matthew Curtise8f80a12012-12-06 17:49:03 +00001476static inline bool HasPICArg(const ArgList &Args) {
1477 return Args.hasArg(options::OPT_fPIC)
1478 || Args.hasArg(options::OPT_fpic);
1479}
1480
1481static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1482 return Args.getLastArg(options::OPT_G,
1483 options::OPT_G_EQ,
1484 options::OPT_msmall_data_threshold_EQ);
1485}
1486
1487static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1488 std::string value;
1489 if (HasPICArg(Args))
1490 value = "0";
1491 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1492 value = A->getValue();
1493 A->claim();
1494 }
1495 return value;
1496}
1497
Tony Linthicum76329bf2011-12-12 21:14:55 +00001498void Clang::AddHexagonTargetArgs(const ArgList &Args,
1499 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001500 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001501 CmdArgs.push_back("-mqdsp6-compat");
1502 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001503
Matthew Curtise8f80a12012-12-06 17:49:03 +00001504 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1505 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001506 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001507 CmdArgs.push_back(Args.MakeArgString(
1508 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001509 }
1510
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001511 if (!Args.hasArg(options::OPT_fno_short_enums))
1512 CmdArgs.push_back("-fshort-enums");
1513 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1514 CmdArgs.push_back ("-mllvm");
1515 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1516 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001517 CmdArgs.push_back ("-mllvm");
1518 CmdArgs.push_back ("-machine-sink-split=0");
1519}
1520
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001521static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1522 std::vector<const char *> &Features) {
Tim Northover2fe823a2013-08-01 09:23:19 +00001523 // Honor -mfpu=.
1524 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +00001525 getAArch64FPUFeatures(D, A, Args, Features);
Jiangning Liub19c5b62014-02-14 04:37:46 +00001526 else
1527 Features.push_back("+neon");
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001528
1529 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1530 Features.push_back("-fp-armv8");
1531 Features.push_back("-crypto");
1532 Features.push_back("-neon");
1533 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001534}
1535
1536static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001537 const ArgList &Args, ArgStringList &CmdArgs,
1538 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001539 std::vector<const char *> Features;
1540 switch (Triple.getArch()) {
1541 default:
1542 break;
1543 case llvm::Triple::mips:
1544 case llvm::Triple::mipsel:
1545 case llvm::Triple::mips64:
1546 case llvm::Triple::mips64el:
1547 getMIPSTargetFeatures(D, Args, Features);
1548 break;
1549
1550 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001551 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001552 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001553 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001554 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001555 break;
1556
1557 case llvm::Triple::ppc:
1558 case llvm::Triple::ppc64:
1559 case llvm::Triple::ppc64le:
1560 getPPCTargetFeatures(Args, Features);
1561 break;
1562 case llvm::Triple::sparc:
1563 getSparcTargetFeatures(Args, Features);
1564 break;
1565 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001566 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001567 getAArch64TargetFeatures(D, Args, Features);
1568 break;
1569 case llvm::Triple::x86:
1570 case llvm::Triple::x86_64:
Jim Grosbach82eee262013-11-16 00:53:35 +00001571 getX86TargetFeatures(Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001572 break;
1573 }
Rafael Espindola43964802013-08-21 17:34:32 +00001574
1575 // Find the last of each feature.
1576 llvm::StringMap<unsigned> LastOpt;
1577 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1578 const char *Name = Features[I];
1579 assert(Name[0] == '-' || Name[0] == '+');
1580 LastOpt[Name + 1] = I;
1581 }
1582
1583 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1584 // If this feature was overridden, ignore it.
1585 const char *Name = Features[I];
1586 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1587 assert(LastI != LastOpt.end());
1588 unsigned Last = LastI->second;
1589 if (Last != I)
1590 continue;
1591
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001592 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001593 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001594 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001595}
1596
Eric Christopher84fbdb42011-08-19 00:30:14 +00001597static bool
John McCall5fb5df92012-06-20 06:18:46 +00001598shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001599 const llvm::Triple &Triple) {
1600 // We use the zero-cost exception tables for Objective-C if the non-fragile
1601 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1602 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001603 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001604 return true;
1605
Bob Wilson83e723a2013-12-05 19:38:42 +00001606 if (!Triple.isMacOSX())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001607 return false;
1608
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001609 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001610 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001611 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001612}
1613
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001614namespace {
1615 struct ExceptionSettings {
1616 bool ExceptionsEnabled;
1617 bool ShouldUseExceptionTables;
1618 ExceptionSettings() : ExceptionsEnabled(false),
1619 ShouldUseExceptionTables(false) {}
1620 };
1621} // end anonymous namespace.
1622
Robert Lytton694f8842014-02-13 10:38:56 +00001623// exceptionSettings() exists to share the logic between -cc1 and linker invocations.
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001624static ExceptionSettings exceptionSettings(const ArgList &Args,
1625 const llvm::Triple &Triple) {
1626 ExceptionSettings ES;
1627
1628 // Are exceptions enabled by default?
1629 ES.ExceptionsEnabled = (Triple.getArch() != llvm::Triple::xcore);
1630
1631 // This keeps track of whether exceptions were explicitly turned on or off.
1632 bool DidHaveExplicitExceptionFlag = false;
1633
1634 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1635 options::OPT_fno_exceptions)) {
1636 if (A->getOption().matches(options::OPT_fexceptions))
1637 ES.ExceptionsEnabled = true;
1638 else
1639 ES.ExceptionsEnabled = false;
1640
1641 DidHaveExplicitExceptionFlag = true;
1642 }
1643
1644 // Exception tables and cleanups can be enabled with -fexceptions even if the
1645 // language itself doesn't support exceptions.
1646 if (ES.ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1647 ES.ShouldUseExceptionTables = true;
1648
1649 return ES;
1650}
1651
Anders Carlssone96ab552011-02-28 02:27:16 +00001652/// addExceptionArgs - Adds exception related arguments to the driver command
1653/// arguments. There's a master flag, -fexceptions and also language specific
1654/// flags to enable/disable C++ and Objective-C exceptions.
1655/// This makes it possible to for example disable C++ exceptions but enable
1656/// Objective-C exceptions.
1657static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1658 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001659 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001660 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001661 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001662 if (KernelOrKext) {
1663 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1664 // arguments now to avoid warnings about unused arguments.
1665 Args.ClaimAllArgs(options::OPT_fexceptions);
1666 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1667 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1668 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1669 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1670 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001671 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001672 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001673
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001674 // Gather the exception settings from the command line arguments.
1675 ExceptionSettings ES = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001676
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001677 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1678 // is not necessarily sensible, but follows GCC.
1679 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001680 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001681 options::OPT_fno_objc_exceptions,
1682 true)) {
1683 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001684
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001685 ES.ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001686 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001687 }
1688
1689 if (types::isCXX(InputType)) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001690 bool CXXExceptionsEnabled = ES.ExceptionsEnabled;
Anders Carlssone96ab552011-02-28 02:27:16 +00001691
Eric Christopher84fbdb42011-08-19 00:30:14 +00001692 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1693 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001694 options::OPT_fexceptions,
1695 options::OPT_fno_exceptions)) {
1696 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1697 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001698 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001699 CXXExceptionsEnabled = false;
1700 }
1701
1702 if (CXXExceptionsEnabled) {
1703 CmdArgs.push_back("-fcxx-exceptions");
1704
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001705 ES.ShouldUseExceptionTables = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00001706 }
1707 }
1708
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001709 if (ES.ShouldUseExceptionTables)
Anders Carlssone96ab552011-02-28 02:27:16 +00001710 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001711}
1712
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001713static bool ShouldDisableAutolink(const ArgList &Args,
1714 const ToolChain &TC) {
1715 bool Default = true;
1716 if (TC.getTriple().isOSDarwin()) {
1717 // The native darwin assembler doesn't support the linker_option directives,
1718 // so we disable them if we think the .s file will be passed to it.
1719 Default = TC.useIntegratedAs();
1720 }
1721 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1722 Default);
1723}
1724
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001725static bool ShouldDisableCFI(const ArgList &Args,
1726 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001727 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001728 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001729 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001730 // we disable them if we think the .s file will be passed to it.
Rafael Espindola84b588b2013-03-18 18:10:27 +00001731 Default = TC.useIntegratedAs();
Rafael Espindolaf934f982011-05-17 16:26:17 +00001732 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001733 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher45f2e712012-12-18 00:31:10 +00001734 options::OPT_fno_dwarf2_cfi_asm,
1735 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001736}
1737
Ted Kremenek62093662013-03-12 17:02:12 +00001738static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1739 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001740 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1741 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001742 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001743 return !UseDwarfDirectory;
1744}
1745
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001746/// \brief Check whether the given input tree contains any compilation actions.
1747static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001748 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001749 return true;
1750
1751 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1752 if (ContainsCompileAction(*it))
1753 return true;
1754
1755 return false;
1756}
1757
1758/// \brief Check if -relax-all should be passed to the internal assembler.
1759/// This is done by default when compiling non-assembler source with -O0.
1760static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1761 bool RelaxDefault = true;
1762
1763 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1764 RelaxDefault = A->getOption().matches(options::OPT_O0);
1765
1766 if (RelaxDefault) {
1767 RelaxDefault = false;
1768 for (ActionList::const_iterator it = C.getActions().begin(),
1769 ie = C.getActions().end(); it != ie; ++it) {
1770 if (ContainsCompileAction(*it)) {
1771 RelaxDefault = true;
1772 break;
1773 }
1774 }
1775 }
1776
1777 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1778 RelaxDefault);
1779}
1780
David Blaikie9260ed62013-07-25 21:19:01 +00001781static void CollectArgsForIntegratedAssembler(Compilation &C,
1782 const ArgList &Args,
1783 ArgStringList &CmdArgs,
1784 const Driver &D) {
1785 if (UseRelaxAll(C, Args))
1786 CmdArgs.push_back("-mrelax-all");
1787
David Peixottodfb66142013-11-14 22:52:58 +00001788 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00001789 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00001790 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
1791 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
1792 // arg after parsing the '-I' arg.
1793 bool TakeNextArg = false;
1794
David Blaikie9260ed62013-07-25 21:19:01 +00001795 // When using an integrated assembler, translate -Wa, and -Xassembler
1796 // options.
David Blaikie7e2fd942014-03-27 20:47:30 +00001797 bool CompressDebugSections = false;
David Blaikie9260ed62013-07-25 21:19:01 +00001798 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1799 options::OPT_Xassembler),
1800 ie = Args.filtered_end(); it != ie; ++it) {
1801 const Arg *A = *it;
1802 A->claim();
1803
1804 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1805 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00001806 if (TakeNextArg) {
1807 CmdArgs.push_back(Value.data());
1808 TakeNextArg = false;
1809 continue;
1810 }
David Blaikie9260ed62013-07-25 21:19:01 +00001811
1812 if (Value == "-force_cpusubtype_ALL") {
1813 // Do nothing, this is the default and we don't support anything else.
1814 } else if (Value == "-L") {
1815 CmdArgs.push_back("-msave-temp-labels");
1816 } else if (Value == "--fatal-warnings") {
1817 CmdArgs.push_back("-mllvm");
1818 CmdArgs.push_back("-fatal-assembler-warnings");
1819 } else if (Value == "--noexecstack") {
1820 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00001821 } else if (Value == "-compress-debug-sections" ||
1822 Value == "--compress-debug-sections") {
David Blaikie7e2fd942014-03-27 20:47:30 +00001823 CompressDebugSections = true;
1824 } else if (Value == "-nocompress-debug-sections" ||
1825 Value == "--nocompress-debug-sections") {
1826 CompressDebugSections = false;
David Peixottodfb66142013-11-14 22:52:58 +00001827 } else if (Value.startswith("-I")) {
1828 CmdArgs.push_back(Value.data());
1829 // We need to consume the next argument if the current arg is a plain
1830 // -I. The next arg will be the include directory.
1831 if (Value == "-I")
1832 TakeNextArg = true;
David Blaikie9260ed62013-07-25 21:19:01 +00001833 } else {
1834 D.Diag(diag::err_drv_unsupported_option_argument)
1835 << A->getOption().getName() << Value;
1836 }
1837 }
1838 }
David Blaikie24bbfed22014-03-31 23:29:38 +00001839 if (CompressDebugSections) {
1840 if (llvm::zlib::isAvailable())
1841 CmdArgs.push_back("-compress-debug-sections");
1842 else
1843 D.Diag(diag::warn_debug_compression_unavailable);
1844 }
David Blaikie9260ed62013-07-25 21:19:01 +00001845}
1846
Renato Goline807c122014-01-31 11:47:28 +00001847// Until ARM libraries are build separately, we have them all in one library
1848static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001849 if (TC.getArch() == llvm::Triple::arm ||
1850 TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00001851 return "arm";
1852 else
1853 return TC.getArchName();
1854}
1855
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001856static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
1857 // The runtimes are located in the OS-specific resource directory.
1858 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00001859 const llvm::Triple &Triple = TC.getTriple();
1860 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
1861 StringRef OSLibName = (Triple.getOS() == llvm::Triple::FreeBSD) ?
1862 "freebsd" : TC.getOS();
1863 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001864 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00001865}
1866
Renato Golinc4b49242014-02-13 10:01:16 +00001867// This adds the static libclang_rt.arch.a directly to the command line
1868// FIXME: Make sure we can also emit shared objects if they're requested
1869// and available, check for possible errors, etc.
1870static void addClangRTLinux(
1871 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001872 SmallString<128> LibClangRT = getCompilerRTLibDir(TC);
1873 llvm::sys::path::append(LibClangRT,
Renato Golinc4b49242014-02-13 10:01:16 +00001874 Twine("libclang_rt.") + getArchNameForCompilerRTLib(TC) + ".a");
1875
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001876 CmdArgs.push_back(Args.MakeArgString(LibClangRT));
Renato Golinc4b49242014-02-13 10:01:16 +00001877 CmdArgs.push_back("-lgcc_s");
1878 if (TC.getDriver().CCCIsCXX())
1879 CmdArgs.push_back("-lgcc_eh");
1880}
1881
Alexey Samsonov7811d192014-02-20 13:57:37 +00001882static void addProfileRT(
Chandler Carruth36381702013-06-23 11:28:48 +00001883 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1884 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1885 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00001886 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Chandler Carruth36381702013-06-23 11:28:48 +00001887 Args.hasArg(options::OPT_fcreate_profile) ||
1888 Args.hasArg(options::OPT_coverage)))
1889 return;
1890
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001891 SmallString<128> LibProfile = getCompilerRTLibDir(TC);
1892 llvm::sys::path::append(LibProfile,
Renato Goline807c122014-01-31 11:47:28 +00001893 Twine("libclang_rt.profile-") + getArchNameForCompilerRTLib(TC) + ".a");
Chandler Carruth36381702013-06-23 11:28:48 +00001894
Duncan P. N. Exon Smith2d8f93e2014-03-28 17:53:17 +00001895 CmdArgs.push_back(Args.MakeArgString(LibProfile));
Chandler Carruth36381702013-06-23 11:28:48 +00001896}
1897
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00001898static SmallString<128> getSanitizerRTLibName(const ToolChain &TC,
1899 const StringRef Sanitizer,
1900 bool Shared) {
1901 // Sanitizer runtime has name "libclang_rt.<Sanitizer>-<ArchName>.{a,so}"
1902 // (or "libclang_rt.<Sanitizer>-<ArchName>-android.so for Android)
1903 const char *EnvSuffix =
1904 TC.getTriple().getEnvironment() == llvm::Triple::Android ? "-android" : "";
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001905 SmallString<128> LibSanitizer = getCompilerRTLibDir(TC);
1906 llvm::sys::path::append(LibSanitizer,
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00001907 Twine("libclang_rt.") + Sanitizer + "-" +
1908 getArchNameForCompilerRTLib(TC) + EnvSuffix +
1909 (Shared ? ".so" : ".a"));
1910 return LibSanitizer;
1911}
1912
1913static void addSanitizerRTLinkFlags(const ToolChain &TC, const ArgList &Args,
1914 ArgStringList &CmdArgs,
1915 const StringRef Sanitizer,
1916 bool BeforeLibStdCXX,
1917 bool ExportSymbols = true,
1918 bool LinkDeps = true) {
1919 SmallString<128> LibSanitizer =
1920 getSanitizerRTLibName(TC, Sanitizer, /*Shared*/ false);
Richard Smithcff3cde2013-03-20 23:49:07 +00001921
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001922 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1923 // etc.) so that the linker picks custom versions of the global 'operator
1924 // new' and 'operator delete' symbols. We take the extreme (but simple)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001925 // strategy of inserting it at the front of the link command. It also
1926 // needs to be forced to end up in the executable, so wrap it in
1927 // whole-archive.
Richard Smithcff3cde2013-03-20 23:49:07 +00001928 SmallVector<const char *, 3> LibSanitizerArgs;
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001929 LibSanitizerArgs.push_back("-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001930 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001931 LibSanitizerArgs.push_back("-no-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001932
1933 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1934 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1935
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00001936 if (LinkDeps) {
1937 // Link sanitizer dependencies explicitly
1938 CmdArgs.push_back("-lpthread");
1939 CmdArgs.push_back("-lrt");
1940 CmdArgs.push_back("-lm");
1941 // There's no libdl on FreeBSD.
1942 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
1943 CmdArgs.push_back("-ldl");
1944 }
Richard Smithf3e624c2013-03-23 00:30:08 +00001945
1946 // If possible, use a dynamic symbols file to export the symbols from the
1947 // runtime library. If we can't do so, use -export-dynamic instead to export
1948 // all symbols from the binary.
1949 if (ExportSymbols) {
1950 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1951 CmdArgs.push_back(
1952 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1953 else
1954 CmdArgs.push_back("-export-dynamic");
1955 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001956}
1957
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001958/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1959/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001960static void addAsanRT(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00001961 ArgStringList &CmdArgs, bool Shared) {
1962 if (Shared) {
1963 // Link dynamic runtime if necessary.
1964 SmallString<128> LibSanitizer =
1965 getSanitizerRTLibName(TC, "asan", Shared);
1966 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibSanitizer));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001967 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00001968
1969 // Do not link static runtime to DSOs or if compiling for Android.
1970 if (Args.hasArg(options::OPT_shared) ||
1971 (TC.getTriple().getEnvironment() == llvm::Triple::Android))
1972 return;
1973
1974 const char *LibAsanStaticPart = Shared ? "asan-preinit" : "asan";
1975 addSanitizerRTLinkFlags(TC, Args, CmdArgs, LibAsanStaticPart,
1976 /*BeforeLibStdCXX*/ true, /*ExportSymbols*/ !Shared,
1977 /*LinkDeps*/ !Shared);
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001978}
1979
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001980/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1981/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001982static void addTsanRT(const ToolChain &TC, const ArgList &Args,
1983 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001984 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001985 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001986}
1987
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001988/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1989/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001990static void addMsanRT(const ToolChain &TC, const ArgList &Args,
1991 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001992 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001993 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "msan", true);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001994}
1995
1996/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
1997/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001998static void addLsanRT(const ToolChain &TC, const ArgList &Args,
1999 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00002000 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002001 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00002002}
2003
Richard Smithe30752c2012-10-09 19:52:38 +00002004/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
2005/// (Linux).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002006static void addUbsanRT(const ToolChain &TC, const ArgList &Args,
2007 ArgStringList &CmdArgs, bool IsCXX,
2008 bool HasOtherSanitizerRt) {
Nick Lewycky24921692013-10-19 00:27:23 +00002009 // Need a copy of sanitizer_common. This could come from another sanitizer
2010 // runtime; if we're not including one, include our own copy.
2011 if (!HasOtherSanitizerRt)
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002012 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "san", true, false);
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002013
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002014 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan", false);
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002015
2016 // Only include the bits of the runtime which need a C++ ABI library if
2017 // we're linking in C++ mode.
2018 if (IsCXX)
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002019 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smithe30752c2012-10-09 19:52:38 +00002020}
2021
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002022static void addDfsanRT(const ToolChain &TC, const ArgList &Args,
2023 ArgStringList &CmdArgs) {
Peter Collingbournec3772752013-08-07 22:47:34 +00002024 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002025 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "dfsan", true);
2026}
2027
2028// Should be called before we add C++ ABI library.
2029static void addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2030 ArgStringList &CmdArgs) {
2031 const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
2032 const Driver &D = TC.getDriver();
2033 if (Sanitize.needsUbsanRt())
2034 addUbsanRT(TC, Args, CmdArgs, D.CCCIsCXX(),
2035 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
2036 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
2037 if (Sanitize.needsAsanRt())
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002038 addAsanRT(TC, Args, CmdArgs, Sanitize.needsSharedAsanRt());
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002039 if (Sanitize.needsTsanRt())
2040 addTsanRT(TC, Args, CmdArgs);
2041 if (Sanitize.needsMsanRt())
2042 addMsanRT(TC, Args, CmdArgs);
2043 if (Sanitize.needsLsanRt())
2044 addLsanRT(TC, Args, CmdArgs);
2045 if (Sanitize.needsDfsanRt())
2046 addDfsanRT(TC, Args, CmdArgs);
Peter Collingbournec3772752013-08-07 22:47:34 +00002047}
2048
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002049static bool shouldUseFramePointerForTarget(const ArgList &Args,
2050 const llvm::Triple &Triple) {
2051 switch (Triple.getArch()) {
2052 // Don't use a frame pointer on linux if optimizing for certain targets.
2053 case llvm::Triple::mips64:
2054 case llvm::Triple::mips64el:
2055 case llvm::Triple::mips:
2056 case llvm::Triple::mipsel:
2057 case llvm::Triple::systemz:
2058 case llvm::Triple::x86:
2059 case llvm::Triple::x86_64:
2060 if (Triple.isOSLinux())
2061 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2062 if (!A->getOption().matches(options::OPT_O0))
2063 return false;
2064 return true;
2065 case llvm::Triple::xcore:
2066 return false;
2067 default:
2068 return true;
2069 }
2070}
2071
Rafael Espindola224dd632011-12-14 21:02:23 +00002072static bool shouldUseFramePointer(const ArgList &Args,
2073 const llvm::Triple &Triple) {
2074 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2075 options::OPT_fomit_frame_pointer))
2076 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2077
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002078 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002079}
2080
Eric Christopherb7d97e92013-04-03 01:58:53 +00002081static bool shouldUseLeafFramePointer(const ArgList &Args,
2082 const llvm::Triple &Triple) {
2083 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2084 options::OPT_momit_leaf_frame_pointer))
2085 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2086
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002087 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002088}
2089
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002090/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002091static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002092 SmallString<128> cwd;
2093 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002094 CmdArgs.push_back("-fdebug-compilation-dir");
2095 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002096 }
2097}
2098
Eric Christopherd3804002013-02-22 20:12:52 +00002099static const char *SplitDebugName(const ArgList &Args,
2100 const InputInfoList &Inputs) {
2101 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2102 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2103 SmallString<128> T(FinalOutput->getValue());
2104 llvm::sys::path::replace_extension(T, "dwo");
2105 return Args.MakeArgString(T);
2106 } else {
2107 // Use the compilation dir.
2108 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
2109 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
2110 llvm::sys::path::replace_extension(F, "dwo");
2111 T += F;
2112 return Args.MakeArgString(F);
2113 }
2114}
2115
2116static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2117 const Tool &T, const JobAction &JA,
2118 const ArgList &Args, const InputInfo &Output,
2119 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002120 ArgStringList ExtractArgs;
2121 ExtractArgs.push_back("--extract-dwo");
2122
2123 ArgStringList StripArgs;
2124 StripArgs.push_back("--strip-dwo");
2125
2126 // Grabbing the output of the earlier compile step.
2127 StripArgs.push_back(Output.getFilename());
2128 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002129 ExtractArgs.push_back(OutFile);
2130
2131 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002132 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002133
2134 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00002135 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002136
2137 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00002138 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002139}
2140
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002141/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
2142static bool shouldEnableVectorizerAtOLevel(const ArgList &Args) {
2143 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002144 if (A->getOption().matches(options::OPT_O4) ||
2145 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002146 return true;
2147
2148 if (A->getOption().matches(options::OPT_O0))
2149 return false;
2150
2151 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2152
Rafael Espindola91780de2013-08-26 14:05:41 +00002153 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002154 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002155 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002156 return true;
2157
2158 // Don't vectorize -Oz.
2159 if (S == "z")
2160 return false;
2161
2162 unsigned OptLevel = 0;
2163 if (S.getAsInteger(10, OptLevel))
2164 return false;
2165
2166 return OptLevel > 1;
2167 }
2168
2169 return false;
2170}
2171
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002172/// Add -x lang to \p CmdArgs for \p Input.
2173static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2174 ArgStringList &CmdArgs) {
2175 // When using -verify-pch, we don't want to provide the type
2176 // 'precompiled-header' if it was inferred from the file extension
2177 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2178 return;
2179
2180 CmdArgs.push_back("-x");
2181 if (Args.hasArg(options::OPT_rewrite_objc))
2182 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2183 else
2184 CmdArgs.push_back(types::getTypeName(Input.getType()));
2185}
2186
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002187void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002188 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002189 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002190 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002191 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002192 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2193 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002194 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002195 ArgStringList CmdArgs;
2196
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002197 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
2198 bool IsWindowsCygnus = getToolChain().getTriple().isWindowsCygwinEnvironment();
2199 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2200
Daniel Dunbare521a892009-03-31 20:53:55 +00002201 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2202
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002203 // Invoke ourselves in -cc1 mode.
2204 //
2205 // FIXME: Implement custom jobs for internal actions.
2206 CmdArgs.push_back("-cc1");
2207
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002208 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002209 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002210 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002211 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002212
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002213 const llvm::Triple TT(TripleStr);
2214 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2215 TT.getArch() == llvm::Triple::thumb)) {
2216 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2217 unsigned Version;
2218 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2219 if (Version < 7)
2220 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName() << TripleStr;
2221 }
2222
Tim Northover336f1892014-03-29 13:16:12 +00002223 // Push all default warning arguments that are specific to
2224 // the given target. These come before user provided warning options
2225 // are provided.
2226 getToolChain().addClangWarningOptions(CmdArgs);
2227
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002228 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002229 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002230
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002231 if (isa<AnalyzeJobAction>(JA)) {
2232 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2233 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002234 } else if (isa<MigrateJobAction>(JA)) {
2235 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002236 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002237 if (Output.getType() == types::TY_Dependencies)
2238 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002239 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002240 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002241 if (Args.hasArg(options::OPT_rewrite_objc) &&
2242 !Args.hasArg(options::OPT_g_Group))
2243 CmdArgs.push_back("-P");
2244 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002245 } else if (isa<AssembleJobAction>(JA)) {
2246 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002247
David Blaikie9260ed62013-07-25 21:19:01 +00002248 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002249
2250 // Also ignore explicit -force_cpusubtype_ALL option.
2251 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002252 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002253 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002254 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002255
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002256 if (JA.getType() == types::TY_Nothing)
2257 CmdArgs.push_back("-fsyntax-only");
2258 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002259 CmdArgs.push_back("-emit-pch");
2260 else
2261 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002262 } else if (isa<VerifyPCHJobAction>(JA)) {
2263 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002264 } else {
2265 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002266
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002267 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002268 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002269 } else if (JA.getType() == types::TY_LLVM_IR ||
2270 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002271 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002272 } else if (JA.getType() == types::TY_LLVM_BC ||
2273 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002274 CmdArgs.push_back("-emit-llvm-bc");
2275 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002276 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002277 } else if (JA.getType() == types::TY_AST) {
2278 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002279 } else if (JA.getType() == types::TY_ModuleFile) {
2280 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002281 } else if (JA.getType() == types::TY_RewrittenObjC) {
2282 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002283 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002284 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2285 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002286 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002287 } else {
2288 assert(JA.getType() == types::TY_PP_Asm &&
2289 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002290 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002291 }
2292
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002293 // The make clang go fast button.
2294 CmdArgs.push_back("-disable-free");
2295
John McCallbb79b5f2010-02-13 03:50:24 +00002296 // Disable the verification pass in -asserts builds.
2297#ifdef NDEBUG
2298 CmdArgs.push_back("-disable-llvm-verifier");
2299#endif
2300
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002301 // Set the main file name, so that debug info works even with
2302 // -save-temps.
2303 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002304 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002305
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002306 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002307 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002308 if (Args.hasArg(options::OPT_static))
2309 CmdArgs.push_back("-static-define");
2310
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002311 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002312 // Enable region store model by default.
2313 CmdArgs.push_back("-analyzer-store=region");
2314
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002315 // Treat blocks as analysis entry points.
2316 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2317
Ted Kremenek49c79792011-03-24 00:28:47 +00002318 CmdArgs.push_back("-analyzer-eagerly-assume");
2319
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002320 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002321 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002322 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002323
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002324 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002325 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002326
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002327 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002328 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002329
2330 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002331
Jordan Rose10ad0812013-04-05 17:55:07 +00002332 if (types::isCXX(Inputs[0].getType()))
2333 CmdArgs.push_back("-analyzer-checker=cplusplus");
2334
Ted Kremenek37e96522012-01-26 02:27:38 +00002335 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00002336 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2337 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2338 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2339 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2340 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2341 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002342 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002343
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002344 // Set the output format. The default is plist, for (lame) historical
2345 // reasons.
2346 CmdArgs.push_back("-analyzer-output");
2347 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002348 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002349 else
2350 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002351
Ted Kremenekfe449a22010-03-22 22:32:05 +00002352 // Disable the presentation of standard compiler warnings when
2353 // using --analyze. We only want to show static analyzer diagnostics
2354 // or frontend errors.
2355 CmdArgs.push_back("-w");
2356
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002357 // Add -Xanalyzer arguments when running as analyzer.
2358 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002359 }
2360
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002361 CheckCodeGenerationOptions(D, Args);
2362
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002363 bool PIE = getToolChain().isPIEDefault();
2364 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002365 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002366
Alexey Bataev40e75222014-01-28 06:30:35 +00002367 // Android-specific defaults for PIC/PIE
2368 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2369 switch (getToolChain().getTriple().getArch()) {
2370 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002371 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002372 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002373 case llvm::Triple::thumbeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002374 case llvm::Triple::mips:
2375 case llvm::Triple::mipsel:
2376 case llvm::Triple::mips64:
2377 case llvm::Triple::mips64el:
2378 PIC = true; // "-fpic"
2379 break;
2380
2381 case llvm::Triple::x86:
2382 case llvm::Triple::x86_64:
2383 PIC = true; // "-fPIC"
2384 IsPICLevelTwo = true;
2385 break;
2386
2387 default:
2388 break;
2389 }
2390 }
2391
Alexey Samsonov090301e2013-04-09 12:28:19 +00002392 // For the PIC and PIE flag options, this logic is different from the
2393 // legacy logic in very old versions of GCC, as that logic was just
2394 // a bug no one had ever fixed. This logic is both more rational and
2395 // consistent with GCC's new logic now that the bugs are fixed. The last
2396 // argument relating to either PIC or PIE wins, and no other argument is
2397 // used. If the last argument is any flavor of the '-fno-...' arguments,
2398 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2399 // at the same level.
2400 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2401 options::OPT_fpic, options::OPT_fno_pic,
2402 options::OPT_fPIE, options::OPT_fno_PIE,
2403 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002404 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2405 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002406 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002407 if (LastPICArg) {
2408 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002409 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2410 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2411 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2412 PIC = PIE || O.matches(options::OPT_fPIC) ||
2413 O.matches(options::OPT_fpic);
2414 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2415 O.matches(options::OPT_fPIC);
2416 } else {
2417 PIE = PIC = false;
2418 }
2419 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002420 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002421
Nick Lewycky609dd662013-10-11 03:33:53 +00002422 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002423 // specified while enabling PIC enabled level 1 PIC, just force it back to
2424 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2425 // informal testing).
2426 if (PIC && getToolChain().getTriple().isOSDarwin())
2427 IsPICLevelTwo |= getToolChain().isPICDefault();
2428
Chandler Carruthc0c04552012-04-08 16:40:35 +00002429 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2430 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002431 llvm::Triple Triple(TripleStr);
Tim Northovera2ee4332014-03-29 15:09:45 +00002432 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6) ||
2433 Triple.getArch() == llvm::Triple::arm64))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002434 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002435 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002436 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002437
Chandler Carruth76a943b2012-11-19 03:52:03 +00002438 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2439 // This is a very special mode. It trumps the other modes, almost no one
2440 // uses it, and it isn't even valid on any OS but Darwin.
2441 if (!getToolChain().getTriple().isOSDarwin())
2442 D.Diag(diag::err_drv_unsupported_opt_for_target)
2443 << A->getSpelling() << getToolChain().getTriple().str();
2444
2445 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2446
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002447 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002448 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002449
Chandler Carruth76a943b2012-11-19 03:52:03 +00002450 // Only a forced PIC mode can cause the actual compile to have PIC defines
2451 // etc., no flags are sufficient. This behavior was selected to closely
2452 // match that of llvm-gcc and Apple GCC before that.
2453 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2454 CmdArgs.push_back("-pic-level");
2455 CmdArgs.push_back("2");
2456 }
2457 } else {
2458 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2459 // handled in Clang's IRGen by the -pie-level flag.
2460 CmdArgs.push_back("-mrelocation-model");
2461 CmdArgs.push_back(PIC ? "pic" : "static");
2462
2463 if (PIC) {
2464 CmdArgs.push_back("-pic-level");
2465 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2466 if (PIE) {
2467 CmdArgs.push_back("-pie-level");
2468 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2469 }
2470 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002471 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002472
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002473 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2474 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002475 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002476
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002477 // LLVM Code Generator Options.
2478
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002479 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2480 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002481 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002482 }
2483
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002484 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2485 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002486 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002487 D.Diag(diag::err_drv_unsupported_opt_for_target)
2488 << A->getSpelling() << getToolChain().getTriple().str();
2489 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2490 CmdArgs.push_back("-fpcc-struct-return");
2491 } else {
2492 assert(A->getOption().matches(options::OPT_freg_struct_return));
2493 CmdArgs.push_back("-freg-struct-return");
2494 }
2495 }
2496
Roman Divacky65b88cd2011-03-01 17:40:53 +00002497 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2498 CmdArgs.push_back("-mrtd");
2499
Rafael Espindola224dd632011-12-14 21:02:23 +00002500 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002501 CmdArgs.push_back("-mdisable-fp-elim");
2502 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2503 options::OPT_fno_zero_initialized_in_bss))
2504 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002505
2506 bool OFastEnabled = isOptimizationLevelFast(Args);
2507 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2508 // enabled. This alias option is being used to simplify the hasFlag logic.
2509 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2510 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002511 // We turn strict aliasing off by default if we're in CL mode, since MSVC
2512 // doesn't do any TBAA.
2513 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002514 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002515 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00002516 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002517 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2518 options::OPT_fno_struct_path_tbaa))
2519 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002520 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2521 false))
2522 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002523 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2524 options::OPT_fno_optimize_sibling_calls))
2525 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002526
Eric Christopher006208c2013-04-04 06:29:47 +00002527 // Handle segmented stacks.
2528 if (Args.hasArg(options::OPT_fsplit_stack))
2529 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002530
2531 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2532 // This alias option is being used to simplify the getLastArg logic.
2533 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2534 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002535
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002536 // Handle various floating point optimization flags, mapping them to the
2537 // appropriate LLVM code generation flags. The pattern for all of these is to
2538 // default off the codegen optimizations, and if any flag enables them and no
2539 // flag disables them after the flag enabling them, enable the codegen
2540 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002541 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002542 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002543 options::OPT_ffinite_math_only,
2544 options::OPT_fno_finite_math_only,
2545 options::OPT_fhonor_infinities,
2546 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002547 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2548 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002549 A->getOption().getID() != options::OPT_fhonor_infinities)
2550 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002551 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002552 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002553 options::OPT_ffinite_math_only,
2554 options::OPT_fno_finite_math_only,
2555 options::OPT_fhonor_nans,
2556 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002557 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2558 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002559 A->getOption().getID() != options::OPT_fhonor_nans)
2560 CmdArgs.push_back("-menable-no-nans");
2561
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002562 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2563 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002564 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002565 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002566 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002567 options::OPT_fno_math_errno)) {
2568 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2569 // However, turning *off* -ffast_math merely restores the toolchain default
2570 // (which may be false).
2571 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2572 A->getOption().getID() == options::OPT_ffast_math ||
2573 A->getOption().getID() == options::OPT_Ofast)
2574 MathErrno = false;
2575 else if (A->getOption().getID() == options::OPT_fmath_errno)
2576 MathErrno = true;
2577 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002578 if (MathErrno)
2579 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002580
2581 // There are several flags which require disabling very specific
2582 // optimizations. Any of these being disabled forces us to turn off the
2583 // entire set of LLVM optimizations, so collect them through all the flag
2584 // madness.
2585 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002586 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002587 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002588 options::OPT_funsafe_math_optimizations,
2589 options::OPT_fno_unsafe_math_optimizations,
2590 options::OPT_fassociative_math,
2591 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002592 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2593 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002594 A->getOption().getID() != options::OPT_fno_associative_math)
2595 AssociativeMath = true;
2596 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002597 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002598 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002599 options::OPT_funsafe_math_optimizations,
2600 options::OPT_fno_unsafe_math_optimizations,
2601 options::OPT_freciprocal_math,
2602 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002603 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2604 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002605 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2606 ReciprocalMath = true;
2607 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002608 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002609 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002610 options::OPT_funsafe_math_optimizations,
2611 options::OPT_fno_unsafe_math_optimizations,
2612 options::OPT_fsigned_zeros,
2613 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002614 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2615 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002616 A->getOption().getID() != options::OPT_fsigned_zeros)
2617 SignedZeros = false;
2618 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002619 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002620 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002621 options::OPT_funsafe_math_optimizations,
2622 options::OPT_fno_unsafe_math_optimizations,
2623 options::OPT_ftrapping_math,
2624 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002625 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2626 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002627 A->getOption().getID() != options::OPT_ftrapping_math)
2628 TrappingMath = false;
2629 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2630 !TrappingMath)
2631 CmdArgs.push_back("-menable-unsafe-fp-math");
2632
Lang Hamesaa53b932012-07-06 00:59:19 +00002633
2634 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002635 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002636 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002637 options::OPT_ffp_contract)) {
2638 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002639 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002640 if (Val == "fast" || Val == "on" || Val == "off") {
2641 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2642 } else {
2643 D.Diag(diag::err_drv_unsupported_option_argument)
2644 << A->getOption().getName() << Val;
2645 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002646 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2647 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002648 // If fast-math is set then set the fp-contract mode to fast.
2649 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2650 }
2651 }
2652
Bob Wilson6a039162012-07-19 03:52:53 +00002653 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2654 // and if we find them, tell the frontend to provide the appropriate
2655 // preprocessor macros. This is distinct from enabling any optimizations as
2656 // these options induce language changes which must survive serialization
2657 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002658 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2659 options::OPT_fno_fast_math))
2660 if (!A->getOption().matches(options::OPT_fno_fast_math))
2661 CmdArgs.push_back("-ffast-math");
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002662 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2663 if (A->getOption().matches(options::OPT_ffinite_math_only))
2664 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002665
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002666 // Decide whether to use verbose asm. Verbose assembly is the default on
2667 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002668 bool IsIntegratedAssemblerDefault =
2669 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002670 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002671 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002672 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002673 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002674
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00002675 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002676 IsIntegratedAssemblerDefault))
2677 CmdArgs.push_back("-no-integrated-as");
2678
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002679 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2680 CmdArgs.push_back("-mdebug-pass");
2681 CmdArgs.push_back("Structure");
2682 }
2683 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2684 CmdArgs.push_back("-mdebug-pass");
2685 CmdArgs.push_back("Arguments");
2686 }
2687
John McCall8517abc2010-02-19 02:45:38 +00002688 // Enable -mconstructor-aliases except on darwin, where we have to
2689 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002690 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002691 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002692
John McCall7ef5cb32011-03-18 02:56:14 +00002693 // Darwin's kernel doesn't support guard variables; just die if we
2694 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002695 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002696 CmdArgs.push_back("-fforbid-guard-variables");
2697
Douglas Gregordbe39272011-02-01 15:15:22 +00002698 if (Args.hasArg(options::OPT_mms_bitfields)) {
2699 CmdArgs.push_back("-mms-bitfields");
2700 }
John McCall8517abc2010-02-19 02:45:38 +00002701
Daniel Dunbar306945d2009-09-16 06:17:29 +00002702 // This is a coarse approximation of what llvm-gcc actually does, both
2703 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2704 // complicated ways.
2705 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00002706 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2707 options::OPT_fno_asynchronous_unwind_tables,
2708 (getToolChain().IsUnwindTablesDefault() ||
2709 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
2710 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002711 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2712 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002713 CmdArgs.push_back("-munwind-tables");
2714
Chandler Carruth05fb5852012-11-21 23:40:23 +00002715 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002716
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002717 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2718 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002719 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002720 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002721
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002722 // FIXME: Handle -mtune=.
2723 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002724
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002725 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002726 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002727 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002728 }
2729
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002730 // Add the target cpu
2731 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2732 llvm::Triple ETriple(ETripleStr);
2733 std::string CPU = getCPUName(Args, ETriple);
2734 if (!CPU.empty()) {
2735 CmdArgs.push_back("-target-cpu");
2736 CmdArgs.push_back(Args.MakeArgString(CPU));
2737 }
2738
Rafael Espindolaeb265472013-08-21 21:59:03 +00002739 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2740 CmdArgs.push_back("-mfpmath");
2741 CmdArgs.push_back(A->getValue());
2742 }
2743
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002744 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002745 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002746
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002747 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002748 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002749 default:
2750 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002751
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002752 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002753 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002754 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002755 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002756 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002757 break;
2758
Tim Northovera2ee4332014-03-29 15:09:45 +00002759 case llvm::Triple::arm64:
2760 AddARM64TargetArgs(Args, CmdArgs);
2761 break;
2762
Eric Christopher0b26a612010-03-02 02:41:08 +00002763 case llvm::Triple::mips:
2764 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002765 case llvm::Triple::mips64:
2766 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002767 AddMIPSTargetArgs(Args, CmdArgs);
2768 break;
2769
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002770 case llvm::Triple::sparc:
2771 AddSparcTargetArgs(Args, CmdArgs);
2772 break;
2773
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002774 case llvm::Triple::x86:
2775 case llvm::Triple::x86_64:
2776 AddX86TargetArgs(Args, CmdArgs);
2777 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002778
2779 case llvm::Triple::hexagon:
2780 AddHexagonTargetArgs(Args, CmdArgs);
2781 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002782 }
2783
Hans Wennborg75958c42013-08-08 00:17:41 +00002784 // Add clang-cl arguments.
2785 if (getToolChain().getDriver().IsCLMode())
2786 AddClangCLArgs(Args, CmdArgs);
2787
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002788 // Pass the linker version in use.
2789 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2790 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002791 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002792 }
2793
Eric Christopherb7d97e92013-04-03 01:58:53 +00002794 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002795 CmdArgs.push_back("-momit-leaf-frame-pointer");
2796
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002797 // Explicitly error on some things we know we don't support and can't just
2798 // ignore.
2799 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002800 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2801 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002802 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002803 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002804 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002805 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2806 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002807 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002808 << Unsupported->getOption().getName();
2809 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002810 }
2811
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002812 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002813 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002814 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002815 CmdArgs.push_back("-header-include-file");
2816 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2817 D.CCPrintHeadersFilename : "-");
2818 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002819 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002820 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002821
Chad Rosierbe10f982011-08-02 17:58:04 +00002822 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002823 CmdArgs.push_back("-diagnostic-log-file");
2824 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2825 D.CCLogDiagnosticsFilename : "-");
2826 }
2827
Manman Ren17bdb0f2013-11-20 20:22:14 +00002828 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
2829 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002830 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002831 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
David Blaikief5961452014-03-25 20:42:27 +00002832 if (A->getOption().matches(options::OPT_gline_tables_only)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00002833 // FIXME: we should support specifying dwarf version with
2834 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002835 CmdArgs.push_back("-gline-tables-only");
Adrian Prantl549c5142014-02-17 17:40:52 +00002836 // Default is dwarf-2 for darwin.
2837 if (getToolChain().getTriple().isOSDarwin())
2838 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00002839 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00002840 CmdArgs.push_back("-gdwarf-2");
2841 else if (A->getOption().matches(options::OPT_gdwarf_3))
2842 CmdArgs.push_back("-gdwarf-3");
2843 else if (A->getOption().matches(options::OPT_gdwarf_4))
2844 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002845 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00002846 !A->getOption().matches(options::OPT_ggdb0)) {
2847 // Default is dwarf-2 for darwin.
2848 if (getToolChain().getTriple().isOSDarwin())
2849 CmdArgs.push_back("-gdwarf-2");
2850 else
2851 CmdArgs.push_back("-g");
2852 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002853 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002854
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002855 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2856 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002857 if (Args.hasArg(options::OPT_gcolumn_info))
2858 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002859
Eric Christopher138c32b2013-09-13 22:37:55 +00002860 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002861 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2862 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00002863 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002864 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00002865 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002866 CmdArgs.push_back("-g");
2867 CmdArgs.push_back("-backend-option");
2868 CmdArgs.push_back("-split-dwarf=Enable");
2869 }
2870
Eric Christopher138c32b2013-09-13 22:37:55 +00002871 // -ggnu-pubnames turns on gnu style pubnames in the backend.
2872 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2873 CmdArgs.push_back("-backend-option");
2874 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2875 }
Eric Christophereec89c22013-06-18 00:03:50 +00002876
Eric Christopher0d403d22014-02-14 01:27:03 +00002877 // -gdwarf-aranges turns on the emission of the aranges section in the
2878 // backend.
2879 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
2880 CmdArgs.push_back("-backend-option");
2881 CmdArgs.push_back("-generate-arange-section");
2882 }
2883
David Blaikief36d9ba2014-01-27 18:52:43 +00002884 if (Args.hasFlag(options::OPT_fdebug_types_section,
2885 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00002886 CmdArgs.push_back("-backend-option");
2887 CmdArgs.push_back("-generate-type-units");
2888 }
Eric Christophereec89c22013-06-18 00:03:50 +00002889
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00002890 if (Args.hasFlag(options::OPT_ffunction_sections,
2891 options::OPT_fno_function_sections, false)) {
2892 CmdArgs.push_back("-ffunction-sections");
2893 }
2894
2895 if (Args.hasFlag(options::OPT_fdata_sections,
2896 options::OPT_fno_data_sections, false)) {
2897 CmdArgs.push_back("-fdata-sections");
2898 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002899
Chris Lattner3c77a352010-06-22 00:03:40 +00002900 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2901
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002902 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
2903 (Args.hasArg(options::OPT_fprofile_instr_use) ||
2904 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
2905 D.Diag(diag::err_drv_argument_not_allowed_with)
2906 << "-fprofile-instr-generate" << "-fprofile-instr-use";
2907
2908 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
2909
2910 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
2911 A->render(Args, CmdArgs);
2912 else if (Args.hasArg(options::OPT_fprofile_instr_use))
2913 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
2914
Nick Lewycky207bce32011-04-21 23:44:07 +00002915 if (Args.hasArg(options::OPT_ftest_coverage) ||
2916 Args.hasArg(options::OPT_coverage))
2917 CmdArgs.push_back("-femit-coverage-notes");
2918 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2919 Args.hasArg(options::OPT_coverage))
2920 CmdArgs.push_back("-femit-coverage-data");
2921
Nick Lewycky480cb992011-05-04 20:46:58 +00002922 if (C.getArgs().hasArg(options::OPT_c) ||
2923 C.getArgs().hasArg(options::OPT_S)) {
2924 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002925 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00002926 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00002927 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002928 SmallString<128> Pwd;
2929 if (!llvm::sys::fs::current_path(Pwd)) {
2930 llvm::sys::path::append(Pwd, CoverageFilename.str());
2931 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00002932 }
2933 }
Eric Christophere30f61c2013-02-22 00:24:40 +00002934 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002935 }
2936 }
2937
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002938 // Pass options for controlling the default header search paths.
2939 if (Args.hasArg(options::OPT_nostdinc)) {
2940 CmdArgs.push_back("-nostdsysteminc");
2941 CmdArgs.push_back("-nobuiltininc");
2942 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002943 if (Args.hasArg(options::OPT_nostdlibinc))
2944 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002945 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2946 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2947 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002948
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002949 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002950 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002951 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002952
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002953 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2954
Ted Kremenekf7639e12012-03-06 20:06:33 +00002955 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00002956 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002957 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002958 options::OPT_ccc_arcmt_modify,
2959 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002960 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002961 switch (A->getOption().getID()) {
2962 default:
2963 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002964 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002965 CmdArgs.push_back("-arcmt-check");
2966 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002967 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002968 CmdArgs.push_back("-arcmt-modify");
2969 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002970 case options::OPT_ccc_arcmt_migrate:
2971 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002972 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002973 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002974
2975 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2976 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002977 break;
John McCalld70fb982011-06-15 23:25:17 +00002978 }
2979 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00002980 } else {
2981 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2982 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2983 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00002984 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002985
Ted Kremenekf7639e12012-03-06 20:06:33 +00002986 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2987 if (ARCMTEnabled) {
2988 D.Diag(diag::err_drv_argument_not_allowed_with)
2989 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2990 }
2991 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002992 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002993
2994 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002995 options::OPT_objcmt_migrate_subscripting,
2996 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002997 // None specified, means enable them all.
2998 CmdArgs.push_back("-objcmt-migrate-literals");
2999 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003000 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003001 } else {
3002 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3003 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003004 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003005 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003006 } else {
3007 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3008 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3009 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3010 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3011 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3012 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
3013 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3014 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3015 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3016 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3017 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3018 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3019 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003020 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003021 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003022 }
3023
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003024 // Add preprocessing options like -I, -D, etc. if we are using the
3025 // preprocessor.
3026 //
3027 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003028 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003029 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003030
Rafael Espindolaa7431922011-07-21 23:40:37 +00003031 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3032 // that "The compiler can only warn and ignore the option if not recognized".
3033 // When building with ccache, it will pass -D options to clang even on
3034 // preprocessed inputs and configure concludes that -fPIC is not supported.
3035 Args.ClaimAllArgs(options::OPT_D);
3036
Alp Toker7874bdc2013-11-15 20:40:58 +00003037 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003038 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3039 if (A->getOption().matches(options::OPT_O4)) {
3040 CmdArgs.push_back("-O3");
3041 D.Diag(diag::warn_O4_is_O3);
3042 } else {
3043 A->render(Args, CmdArgs);
3044 }
3045 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003046
Chad Rosier86b82082012-12-12 20:06:31 +00003047 // Don't warn about unused -flto. This can happen when we're preprocessing or
3048 // precompiling.
3049 Args.ClaimAllArgs(options::OPT_flto);
3050
Daniel Dunbar945577c2009-10-29 02:24:45 +00003051 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003052 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3053 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003054 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003055 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003056
3057 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003058 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003059 //
3060 // If a std is supplied, only add -trigraphs if it follows the
3061 // option.
3062 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3063 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003064 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003065 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003066 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003067 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003068 else
3069 Std->render(Args, CmdArgs);
3070
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003071 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
3072 options::OPT_trigraphs))
3073 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003074 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003075 } else {
3076 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003077 //
3078 // FIXME: Clang doesn't correctly handle -std= when the input language
3079 // doesn't match. For the time being just ignore this for C++ inputs;
3080 // eventually we want to do all the standard defaulting here instead of
3081 // splitting it between the driver and clang -cc1.
3082 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003083 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3084 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003085 else if (IsWindowsMSVC)
Nico Weber723b4f02012-08-30 02:08:31 +00003086 CmdArgs.push_back("-std=c++11");
3087
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003088 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003089 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003090
Richard Smith282b4492013-09-04 22:50:31 +00003091 // GCC's behavior for -Wwrite-strings is a bit strange:
3092 // * In C, this "warning flag" changes the types of string literals from
3093 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3094 // for the discarded qualifier.
3095 // * In C++, this is just a normal warning flag.
3096 //
3097 // Implementing this warning correctly in C is hard, so we follow GCC's
3098 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3099 // a non-const char* in C, rather than using this crude hack.
3100 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003101 // FIXME: This should behave just like a warning flag, and thus should also
3102 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3103 Arg *WriteStrings =
3104 Args.getLastArg(options::OPT_Wwrite_strings,
3105 options::OPT_Wno_write_strings, options::OPT_w);
3106 if (WriteStrings &&
3107 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003108 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003109 }
3110
Chandler Carruth61fbf622011-04-23 09:27:53 +00003111 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003112 // during C++ compilation, which it is by default. GCC keeps this define even
3113 // in the presence of '-w', match this behavior bug-for-bug.
3114 if (types::isCXX(InputType) &&
3115 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3116 true)) {
3117 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003118 }
3119
Chandler Carruthe0391482010-05-22 02:21:53 +00003120 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3121 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3122 if (Asm->getOption().matches(options::OPT_fasm))
3123 CmdArgs.push_back("-fgnu-keywords");
3124 else
3125 CmdArgs.push_back("-fno-gnu-keywords");
3126 }
3127
Rafael Espindola4cfa7972011-05-02 17:43:32 +00003128 if (ShouldDisableCFI(Args, getToolChain()))
3129 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00003130
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003131 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3132 CmdArgs.push_back("-fno-dwarf-directory-asm");
3133
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003134 if (ShouldDisableAutolink(Args, getToolChain()))
3135 CmdArgs.push_back("-fno-autolink");
3136
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003137 // Add in -fdebug-compilation-dir if necessary.
3138 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003139
Richard Smith9a568822011-11-21 19:36:32 +00003140 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3141 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003142 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003143 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003144 }
3145
Richard Smith79c927b2013-11-06 19:31:51 +00003146 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3147 CmdArgs.push_back("-foperator-arrow-depth");
3148 CmdArgs.push_back(A->getValue());
3149 }
3150
Richard Smith9a568822011-11-21 19:36:32 +00003151 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3152 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003153 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003154 }
3155
Richard Smitha3d3bd22013-05-08 02:12:03 +00003156 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3157 CmdArgs.push_back("-fconstexpr-steps");
3158 CmdArgs.push_back(A->getValue());
3159 }
3160
Richard Smithb3a14522013-02-22 01:59:51 +00003161 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3162 CmdArgs.push_back("-fbracket-depth");
3163 CmdArgs.push_back(A->getValue());
3164 }
3165
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003166 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3167 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003168 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003169 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003170 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3171 } else
3172 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003173 }
3174
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003175
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003176 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003177 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003178
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003179 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3180 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003181 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003182 }
David Chisnall5778fce2009-08-31 16:41:57 +00003183
Chris Lattnere23003d2010-01-09 21:54:33 +00003184 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3185 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003186 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003187 }
3188
Chris Lattnerb35583d2010-04-07 20:49:23 +00003189 CmdArgs.push_back("-ferror-limit");
3190 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003191 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003192 else
3193 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003194
Chandler Carrutha77a7272010-05-06 04:55:18 +00003195 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3196 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003197 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003198 }
3199
3200 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3201 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003202 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003203 }
3204
Richard Smithf6f003a2011-12-16 19:06:07 +00003205 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3206 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003207 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003208 }
3209
Daniel Dunbar2c978472009-11-04 06:24:47 +00003210 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003211 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003212 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003213 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003214 } else {
3215 // If -fmessage-length=N was not specified, determine whether this is a
3216 // terminal and, if so, implicitly define -fmessage-length appropriately.
3217 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003218 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003219 }
3220
John McCallb4a99d32013-02-19 01:57:35 +00003221 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3222 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3223 options::OPT_fvisibility_ms_compat)) {
3224 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3225 CmdArgs.push_back("-fvisibility");
3226 CmdArgs.push_back(A->getValue());
3227 } else {
3228 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3229 CmdArgs.push_back("-fvisibility");
3230 CmdArgs.push_back("hidden");
3231 CmdArgs.push_back("-ftype-visibility");
3232 CmdArgs.push_back("default");
3233 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003234 }
3235
Douglas Gregor08329632010-06-15 17:05:35 +00003236 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003237
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003238 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3239
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003240 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003241 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3242 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003243 CmdArgs.push_back("-ffreestanding");
3244
Daniel Dunbare357d562009-12-03 18:42:11 +00003245 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003246 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003247 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003248 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3249 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003250 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003251 // AltiVec language extensions aren't relevant for assembling.
3252 if (!isa<PreprocessJobAction>(JA) ||
3253 Output.getType() != types::TY_PP_Asm)
3254 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003255 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3256 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003257
Peter Collingbourne32701642013-11-01 18:16:25 +00003258 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3259 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003260
Will Dietz3676d562012-12-30 20:53:28 +00003261 if (!Args.hasFlag(options::OPT_fsanitize_recover,
3262 options::OPT_fno_sanitize_recover,
3263 true))
3264 CmdArgs.push_back("-fno-sanitize-recover");
3265
Alexey Samsonovcb3f8122014-03-20 10:48:29 +00003266 if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
Chad Rosierae229d52013-01-29 23:31:22 +00003267 options::OPT_fno_sanitize_undefined_trap_on_error, false))
3268 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
3269
Eric Christopher459d2712013-02-19 06:16:53 +00003270 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003271 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003272 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003273 getToolChain().getArch() == llvm::Triple::ppc64 ||
3274 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003275 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003276 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003277
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003278 if (getToolChain().SupportsProfiling())
3279 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003280
3281 // -flax-vector-conversions is default.
3282 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3283 options::OPT_fno_lax_vector_conversions))
3284 CmdArgs.push_back("-fno-lax-vector-conversions");
3285
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003286 if (Args.getLastArg(options::OPT_fapple_kext))
3287 CmdArgs.push_back("-fapple-kext");
3288
David Blaikie690f21e2012-06-14 18:55:27 +00003289 if (Args.hasFlag(options::OPT_frewrite_includes,
3290 options::OPT_fno_rewrite_includes, false))
3291 CmdArgs.push_back("-frewrite-includes");
3292
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003293 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003294 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003295 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003296 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3297 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003298
3299 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3300 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003301 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003302 }
3303
Bob Wilson14adb362012-02-03 06:27:22 +00003304 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003305
Chandler Carruth6e501032011-03-27 00:04:55 +00003306 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3307 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3308 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3309 options::OPT_fno_wrapv)) {
3310 if (A->getOption().matches(options::OPT_fwrapv))
3311 CmdArgs.push_back("-fwrapv");
3312 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3313 options::OPT_fno_strict_overflow)) {
3314 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3315 CmdArgs.push_back("-fwrapv");
3316 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003317
3318 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3319 options::OPT_fno_reroll_loops))
3320 if (A->getOption().matches(options::OPT_freroll_loops))
3321 CmdArgs.push_back("-freroll-loops");
3322
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003323 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003324 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3325 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003326
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003327 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3328
Mahesha S6a682be42012-10-27 07:47:56 +00003329
Daniel Dunbar4930e332009-11-17 08:07:36 +00003330 // -stack-protector=0 is default.
3331 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003332 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3333 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003334 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003335 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003336 if (A->getOption().matches(options::OPT_fstack_protector))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003337 StackProtectorLevel = LangOptions::SSPOn;
3338 else if (A->getOption().matches(options::OPT_fstack_protector_strong))
3339 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003340 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003341 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003342 } else {
3343 StackProtectorLevel =
3344 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3345 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003346 if (StackProtectorLevel) {
3347 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003348 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003349 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003350
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003351 // --param ssp-buffer-size=
3352 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3353 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003354 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003355 if (Str.startswith("ssp-buffer-size=")) {
3356 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003357 CmdArgs.push_back("-stack-protector-buffer-size");
3358 // FIXME: Verify the argument is a valid integer.
3359 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003360 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003361 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003362 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003363 }
3364
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003365 // Translate -mstackrealign
3366 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3367 false)) {
3368 CmdArgs.push_back("-backend-option");
3369 CmdArgs.push_back("-force-align-stack");
3370 }
3371 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3372 false)) {
3373 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3374 }
3375
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003376 if (Args.hasArg(options::OPT_mstack_alignment)) {
3377 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3378 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003379 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00003380 // -mkernel implies -mstrict-align; don't add the redundant option.
Renato Golina146a482013-08-24 14:44:41 +00003381 if (!KernelOrKext) {
Renato Golin8d5f3142013-08-28 23:56:07 +00003382 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3383 options::OPT_munaligned_access)) {
3384 if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3385 CmdArgs.push_back("-backend-option");
3386 CmdArgs.push_back("-arm-strict-align");
3387 } else {
3388 CmdArgs.push_back("-backend-option");
3389 CmdArgs.push_back("-arm-no-strict-align");
3390 }
Renato Golina146a482013-08-24 14:44:41 +00003391 }
Chad Rosier60027022012-11-09 17:29:19 +00003392 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003393
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003394 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3395 options::OPT_mno_restrict_it)) {
3396 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3397 CmdArgs.push_back("-backend-option");
3398 CmdArgs.push_back("-arm-restrict-it");
3399 } else {
3400 CmdArgs.push_back("-backend-option");
3401 CmdArgs.push_back("-arm-no-restrict-it");
3402 }
3403 }
3404
Daniel Dunbard18049a2009-04-07 21:16:11 +00003405 // Forward -f options with positive and negative forms; we translate
3406 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003407 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3408 StringRef fname = A->getValue();
3409 if (!llvm::sys::fs::exists(fname))
3410 D.Diag(diag::err_drv_no_such_file) << fname;
3411 else
3412 A->render(Args, CmdArgs);
3413 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003414
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003415 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003416 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003417 CmdArgs.push_back("-fapple-kext");
3418 if (!Args.hasArg(options::OPT_fbuiltin))
3419 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003420 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003421 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003422 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003423 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003424 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003425
Nuno Lopes13c88c72009-12-16 16:59:22 +00003426 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3427 options::OPT_fno_assume_sane_operator_new))
3428 CmdArgs.push_back("-fno-assume-sane-operator-new");
3429
Daniel Dunbar4930e332009-11-17 08:07:36 +00003430 // -fblocks=0 is default.
3431 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003432 getToolChain().IsBlocksDefault()) ||
3433 (Args.hasArg(options::OPT_fgnu_runtime) &&
3434 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3435 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003436 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003437
3438 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3439 !getToolChain().hasBlocksRuntime())
3440 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003441 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003442
Douglas Gregor226173a2012-01-18 15:19:58 +00003443 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3444 // users must also pass -fcxx-modules. The latter flag will disappear once the
3445 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003446 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003447 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3448 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3449 options::OPT_fno_cxx_modules,
3450 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003451 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003452 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003453 HaveModules = true;
3454 }
3455 }
3456
Daniel Jasper07e6c402013-08-05 20:26:17 +00003457 // -fmodule-maps enables module map processing (off by default) for header
3458 // checking. It is implied by -fmodules.
3459 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3460 false)) {
3461 CmdArgs.push_back("-fmodule-maps");
3462 }
3463
Daniel Jasperac42b752013-10-21 06:34:34 +00003464 // -fmodules-decluse checks that modules used are declared so (off by
3465 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003466 if (Args.hasFlag(options::OPT_fmodules_decluse,
3467 options::OPT_fno_modules_decluse,
3468 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003469 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003470 }
3471
Daniel Jasper962b38e2014-04-11 11:47:45 +00003472 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
3473 // all #included headers are part of modules.
3474 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
3475 options::OPT_fno_modules_strict_decluse,
3476 false)) {
3477 CmdArgs.push_back("-fmodules-strict-decluse");
3478 }
3479
Daniel Jasperac42b752013-10-21 06:34:34 +00003480 // -fmodule-name specifies the module that is currently being built (or
3481 // used for header checking by -fmodule-maps).
3482 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name)) {
3483 A->claim();
3484 A->render(Args, CmdArgs);
3485 }
3486
3487 // -fmodule-map-file can be used to specify a file containing module
3488 // definitions.
3489 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file)) {
3490 A->claim();
3491 A->render(Args, CmdArgs);
3492 }
3493
Douglas Gregor35b04d62013-02-07 19:01:24 +00003494 // If a module path was provided, pass it along. Otherwise, use a temporary
3495 // directory.
3496 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3497 A->claim();
3498 if (HaveModules) {
3499 A->render(Args, CmdArgs);
3500 }
3501 } else if (HaveModules) {
3502 SmallString<128> DefaultModuleCache;
3503 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3504 DefaultModuleCache);
Douglas Gregor23c7d672013-03-21 21:48:48 +00003505 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3506 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor4bedb492013-02-07 22:59:12 +00003507 const char Arg[] = "-fmodules-cache-path=";
3508 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3509 Arg, Arg + strlen(Arg));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003510 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3511 }
3512
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00003513 if (Arg *A = Args.getLastArg(options::OPT_fmodules_user_build_path)) {
3514 A->claim();
3515 if (HaveModules) {
3516 A->render(Args, CmdArgs);
3517 }
3518 }
3519
Douglas Gregor35b04d62013-02-07 19:01:24 +00003520 // Pass through all -fmodules-ignore-macro arguments.
3521 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003522 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3523 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003524
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003525 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
3526
3527 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
3528 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp))
3529 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
3530
3531 Args.AddLastArg(CmdArgs,
3532 options::OPT_fmodules_validate_once_per_build_session);
3533 }
3534
Ben Langmuirdcf73862014-03-12 00:06:17 +00003535 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
3536
John McCalldfea9982010-04-09 19:12:06 +00003537 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003538 if (Args.hasFlag(options::OPT_fno_access_control,
3539 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003540 false))
John McCall3155f572010-04-09 19:03:51 +00003541 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003542
Anders Carlssond470fef2010-11-21 00:09:52 +00003543 // -felide-constructors is the default.
3544 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3545 options::OPT_felide_constructors,
3546 false))
3547 CmdArgs.push_back("-fno-elide-constructors");
3548
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003549 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003550 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00003551 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00003552 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00003553
Richard Smith52be6192012-11-05 22:04:41 +00003554 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003555 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00003556 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00003557 Args.getLastArg(options::OPT_mkernel,
3558 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00003559 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00003560 D.Diag(diag::err_drv_argument_not_allowed_with)
3561 << "-fsanitize=vptr" << NoRttiArg;
3562 }
3563 }
3564
Tony Linthicum76329bf2011-12-12 21:14:55 +00003565 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003566 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003567 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003568 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00003569 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003570 CmdArgs.push_back("-fshort-enums");
3571
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003572 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003573 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003574 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00003575 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00003576
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003577 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003578 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003579 options::OPT_fno_threadsafe_statics))
3580 CmdArgs.push_back("-fno-threadsafe-statics");
3581
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003582 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003583 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3584 options::OPT_fno_use_cxa_atexit,
3585 !IsWindowsCygnus && !IsWindowsGNU &&
3586 getToolChain().getArch() != llvm::Triple::hexagon &&
3587 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00003588 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003589 CmdArgs.push_back("-fno-use-cxa-atexit");
3590
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003591 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003592 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003593 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003594 CmdArgs.push_back("-fms-extensions");
3595
Francois Pichet1b4f1632011-09-17 04:32:15 +00003596 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003597 if (Args.hasFlag(options::OPT_fms_compatibility,
3598 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003599 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
3600 options::OPT_fno_ms_extensions,
3601 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003602 CmdArgs.push_back("-fms-compatibility");
3603
Reid Klecknerc106fda2013-09-18 00:33:59 +00003604 // -fmsc-version=1700 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003605 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003606 IsWindowsMSVC) || Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003607 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003608 if (msc_ver.empty())
Reid Klecknerc106fda2013-09-18 00:33:59 +00003609 CmdArgs.push_back("-fmsc-version=1700");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003610 else
3611 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3612 }
3613
3614
Eric Christopher5ecce122013-02-18 00:38:31 +00003615 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00003616 if (Args.hasFlag(options::OPT_fborland_extensions,
3617 options::OPT_fno_borland_extensions, false))
3618 CmdArgs.push_back("-fborland-extensions");
3619
Francois Pichet02744872011-09-01 16:38:08 +00003620 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3621 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003622 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003623 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003624 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003625
Chandler Carruthe03aa552010-04-17 20:17:31 +00003626 // -fgnu-keywords default varies depending on language; only pass if
3627 // specified.
3628 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003629 options::OPT_fno_gnu_keywords))
3630 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00003631
Rafael Espindola922a6242011-06-02 17:30:53 +00003632 if (Args.hasFlag(options::OPT_fgnu89_inline,
3633 options::OPT_fno_gnu89_inline,
3634 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00003635 CmdArgs.push_back("-fgnu89-inline");
3636
Chad Rosier9c76d242012-03-15 22:31:42 +00003637 if (Args.hasArg(options::OPT_fno_inline))
3638 CmdArgs.push_back("-fno-inline");
3639
Chad Rosier64d6be92012-03-06 21:17:19 +00003640 if (Args.hasArg(options::OPT_fno_inline_functions))
3641 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00003642
John McCall5fb5df92012-06-20 06:18:46 +00003643 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00003644
John McCall5fb5df92012-06-20 06:18:46 +00003645 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00003646 // legacy is the default. Except for deployment taget of 10.5,
3647 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
3648 // gets ignored silently.
3649 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00003650 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3651 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00003652 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003653 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00003654 if (getToolChain().UseObjCMixedDispatch())
3655 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3656 else
3657 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3658 }
3659 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00003660
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00003661 // When ObjectiveC legacy runtime is in effect on MacOSX,
3662 // turn on the option to do Array/Dictionary subscripting
3663 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00003664 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
3665 getToolChain().getTriple().isMacOSX() &&
3666 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
3667 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00003668 objcRuntime.isNeXTFamily())
3669 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
3670
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00003671 // -fencode-extended-block-signature=1 is default.
3672 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3673 CmdArgs.push_back("-fencode-extended-block-signature");
3674 }
3675
John McCall24fc0de2011-07-06 00:26:06 +00003676 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3677 // NOTE: This logic is duplicated in ToolChains.cpp.
3678 bool ARC = isObjCAutoRefCount(Args);
3679 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00003680 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00003681
John McCall24fc0de2011-07-06 00:26:06 +00003682 CmdArgs.push_back("-fobjc-arc");
3683
Chandler Carruth491db322011-11-04 07:34:47 +00003684 // FIXME: It seems like this entire block, and several around it should be
3685 // wrapped in isObjC, but for now we just use it here as this is where it
3686 // was being used previously.
3687 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3688 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3689 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3690 else
3691 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3692 }
3693
John McCall24fc0de2011-07-06 00:26:06 +00003694 // Allow the user to enable full exceptions code emission.
3695 // We define off for Objective-CC, on for Objective-C++.
3696 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3697 options::OPT_fno_objc_arc_exceptions,
3698 /*default*/ types::isCXX(InputType)))
3699 CmdArgs.push_back("-fobjc-arc-exceptions");
3700 }
3701
3702 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3703 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00003704 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00003705 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003706
John McCall24fc0de2011-07-06 00:26:06 +00003707 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3708 // takes precedence.
3709 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3710 if (!GCArg)
3711 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3712 if (GCArg) {
3713 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003714 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00003715 << GCArg->getAsString(Args);
3716 } else if (getToolChain().SupportsObjCGC()) {
3717 GCArg->render(Args, CmdArgs);
3718 } else {
3719 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003720 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00003721 << GCArg->getAsString(Args);
3722 }
3723 }
3724
John McCallb5f652e2011-06-22 00:53:57 +00003725 // Add exception args.
3726 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00003727 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00003728
3729 if (getToolChain().UseSjLjExceptions())
3730 CmdArgs.push_back("-fsjlj-exceptions");
3731
3732 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00003733 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3734 options::OPT_fno_assume_sane_operator_new))
3735 CmdArgs.push_back("-fno-assume-sane-operator-new");
3736
Daniel Dunbar34d7a992010-04-27 15:34:57 +00003737 // -fconstant-cfstrings is default, and may be subject to argument translation
3738 // on Darwin.
3739 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3740 options::OPT_fno_constant_cfstrings) ||
3741 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3742 options::OPT_mno_constant_cfstrings))
3743 CmdArgs.push_back("-fno-constant-cfstrings");
3744
John Thompsoned4e2952009-11-05 20:14:16 +00003745 // -fshort-wchar default varies depending on platform; only
3746 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00003747 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
3748 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00003749 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00003750
Hans Wennborg28c96312013-07-31 23:39:13 +00003751 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003752 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003753 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003754 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003755 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003756
Daniel Dunbar096ed292011-10-05 21:04:55 +00003757 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3758 // -fno-pack-struct doesn't apply to -fpack-struct=.
3759 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00003760 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00003761 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00003762 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00003763 } else if (Args.hasFlag(options::OPT_fpack_struct,
3764 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00003765 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00003766 }
3767
Robert Lytton0e076492013-08-13 09:43:10 +00003768 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003769 if (!Args.hasArg(options::OPT_fcommon))
3770 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00003771 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003772 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00003773
Daniel Dunbard18049a2009-04-07 21:16:11 +00003774 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003775 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003776 CmdArgs.push_back("-fno-common");
3777
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003778 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00003779 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00003780 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003781 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003782 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003783 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3784
Daniel Dunbar6358d682010-10-15 22:30:42 +00003785 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3786 if (!Args.hasFlag(options::OPT_ffor_scope,
3787 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003788 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00003789 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3790
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00003791 // -fcaret-diagnostics is default.
3792 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3793 options::OPT_fno_caret_diagnostics, true))
3794 CmdArgs.push_back("-fno-caret-diagnostics");
3795
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003796 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00003797 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003798 options::OPT_fno_diagnostics_fixit_info))
3799 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003800
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003801 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00003802 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003803 options::OPT_fno_diagnostics_show_option))
3804 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003805
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003806 if (const Arg *A =
3807 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3808 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00003809 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003810 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003811
Douglas Gregor643c9222011-05-21 17:07:29 +00003812 if (const Arg *A =
3813 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3814 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003815 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003816 }
3817
Chandler Carruthb6766f02011-03-27 01:50:55 +00003818 if (Arg *A = Args.getLastArg(
3819 options::OPT_fdiagnostics_show_note_include_stack,
3820 options::OPT_fno_diagnostics_show_note_include_stack)) {
3821 if (A->getOption().matches(
3822 options::OPT_fdiagnostics_show_note_include_stack))
3823 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3824 else
3825 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3826 }
3827
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003828 // Color diagnostics are the default, unless the terminal doesn't support
3829 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00003830 // Support both clang's -f[no-]color-diagnostics and gcc's
3831 // -f[no-]diagnostics-colors[=never|always|auto].
3832 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3833 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3834 it != ie; ++it) {
3835 const Option &O = (*it)->getOption();
3836 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3837 !O.matches(options::OPT_fdiagnostics_color) &&
3838 !O.matches(options::OPT_fno_color_diagnostics) &&
3839 !O.matches(options::OPT_fno_diagnostics_color) &&
3840 !O.matches(options::OPT_fdiagnostics_color_EQ))
3841 continue;
3842
3843 (*it)->claim();
3844 if (O.matches(options::OPT_fcolor_diagnostics) ||
3845 O.matches(options::OPT_fdiagnostics_color)) {
3846 ShowColors = Colors_On;
3847 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3848 O.matches(options::OPT_fno_diagnostics_color)) {
3849 ShowColors = Colors_Off;
3850 } else {
3851 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3852 StringRef value((*it)->getValue());
3853 if (value == "always")
3854 ShowColors = Colors_On;
3855 else if (value == "never")
3856 ShowColors = Colors_Off;
3857 else if (value == "auto")
3858 ShowColors = Colors_Auto;
3859 else
3860 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3861 << ("-fdiagnostics-color=" + value).str();
3862 }
3863 }
3864 if (ShowColors == Colors_On ||
3865 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003866 CmdArgs.push_back("-fcolor-diagnostics");
3867
Nico Rieck7857d462013-09-11 00:38:02 +00003868 if (Args.hasArg(options::OPT_fansi_escape_codes))
3869 CmdArgs.push_back("-fansi-escape-codes");
3870
Daniel Dunbardb097022009-06-08 21:13:54 +00003871 if (!Args.hasFlag(options::OPT_fshow_source_location,
3872 options::OPT_fno_show_source_location))
3873 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003874
Douglas Gregor643c9222011-05-21 17:07:29 +00003875 if (!Args.hasFlag(options::OPT_fshow_column,
3876 options::OPT_fno_show_column,
3877 true))
3878 CmdArgs.push_back("-fno-show-column");
3879
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00003880 if (!Args.hasFlag(options::OPT_fspell_checking,
3881 options::OPT_fno_spell_checking))
3882 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003883
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003884
Chad Rosierc8e56e82012-12-05 21:08:21 +00003885 // -fno-asm-blocks is default.
3886 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3887 false))
3888 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003889
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003890 // Enable vectorization per default according to the optimization level
3891 // selected. For optimization levels that want vectorization we use the alias
3892 // option to simplify the hasFlag logic.
3893 bool EnableVec = shouldEnableVectorizerAtOLevel(Args);
3894 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00003895 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00003896 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00003897 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003898 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003899
Rafael Espindolaf818ef42013-08-01 23:56:42 +00003900 // -fslp-vectorize is default.
3901 if (Args.hasFlag(options::OPT_fslp_vectorize,
3902 options::OPT_fno_slp_vectorize, true))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00003903 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00003904
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003905 // -fno-slp-vectorize-aggressive is default.
3906 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003907 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003908 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003909
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00003910 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3911 A->render(Args, CmdArgs);
3912
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003913 // -fdollars-in-identifiers default varies depending on platform and
3914 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00003915 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003916 options::OPT_fno_dollars_in_identifiers)) {
3917 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003918 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003919 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003920 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003921 }
3922
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003923 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3924 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00003925 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003926 options::OPT_fno_unit_at_a_time)) {
3927 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003928 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003929 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003930
Eli Friedman055c9702011-11-02 01:53:16 +00003931 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3932 options::OPT_fno_apple_pragma_pack, false))
3933 CmdArgs.push_back("-fapple-pragma-pack");
3934
Eli Benderskyc95cfe82013-07-24 18:20:14 +00003935 // le32-specific flags:
3936 // -fno-math-builtin: clang should not convert math builtins to intrinsics
3937 // by default.
3938 if (getToolChain().getArch() == llvm::Triple::le32) {
3939 CmdArgs.push_back("-fno-math-builtin");
3940 }
3941
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003942 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003943 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003944 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003945#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003946 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003947 (getToolChain().getArch() == llvm::Triple::arm ||
3948 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003949 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3950 CmdArgs.push_back("-fno-builtin-strcat");
3951 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3952 CmdArgs.push_back("-fno-builtin-strcpy");
3953 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003954#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003955
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003956 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003957 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003958 options::OPT_traditional_cpp)) {
3959 if (isa<PreprocessJobAction>(JA))
3960 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003961 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003962 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003963 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003964
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003965 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003966 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003967
3968 // Handle serialized diagnostics.
3969 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3970 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003971 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003972 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003973
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003974 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3975 CmdArgs.push_back("-fretain-comments-from-system-headers");
3976
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003977 // Forward -fcomment-block-commands to -cc1.
3978 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00003979 // Forward -fparse-all-comments to -cc1.
3980 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003981
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003982 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3983 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003984 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003985 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3986 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003987 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003988
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003989 // We translate this by hand to the -cc1 argument, since nightly test uses
3990 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003991 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003992 CmdArgs.push_back("-disable-llvm-optzns");
3993 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003994 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003995 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003996
Daniel Dunbard67a3222009-03-30 06:36:42 +00003997 if (Output.getType() == types::TY_Dependencies) {
3998 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003999 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004000 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004001 CmdArgs.push_back(Output.getFilename());
4002 } else {
4003 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004004 }
4005
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004006 for (InputInfoList::const_iterator
4007 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4008 const InputInfo &II = *it;
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004009
4010 addDashXForInput(Args, II, CmdArgs);
4011
Daniel Dunbarb440f562010-08-02 02:38:21 +00004012 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004013 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004014 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004015 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004016 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004017
Chris Lattnere9d7d782009-11-03 19:50:27 +00004018 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4019
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004020 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004021
4022 // Optionally embed the -cc1 level arguments into the debug info, for build
4023 // analysis.
4024 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004025 ArgStringList OriginalArgs;
4026 for (ArgList::const_iterator it = Args.begin(),
4027 ie = Args.end(); it != ie; ++it)
4028 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004029
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004030 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004031 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004032 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004033 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004034 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004035 }
4036 CmdArgs.push_back("-dwarf-debug-flags");
4037 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4038 }
4039
Eric Christopherd3804002013-02-22 20:12:52 +00004040 // Add the split debug info name to the command lines here so we
4041 // can propagate it to the backend.
4042 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004043 getToolChain().getTriple().isOSLinux() &&
Eric Christopherf1545832013-02-22 23:50:16 +00004044 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004045 const char *SplitDwarfOut;
4046 if (SplitDwarf) {
4047 CmdArgs.push_back("-split-dwarf-file");
4048 SplitDwarfOut = SplitDebugName(Args, Inputs);
4049 CmdArgs.push_back(SplitDwarfOut);
4050 }
4051
4052 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004053 if (Args.hasArg(options::OPT__SLASH_fallback) &&
4054 Output.getType() == types::TY_Object) {
Hans Wennborg87cfa712013-09-19 20:32:16 +00004055 tools::visualstudio::Compile CL(getToolChain());
4056 Command *CLCommand = CL.GetCommand(C, JA, Output, Inputs, Args,
4057 LinkingOutput);
4058 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
4059 } else {
4060 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4061 }
4062
Daniel Dunbar17731772009-03-23 19:03:36 +00004063
Eric Christopherf1545832013-02-22 23:50:16 +00004064 // Handle the debug info splitting at object creation time if we're
4065 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004066 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00004067 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004068 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004069
Roman Divacky178e01602011-02-10 16:52:03 +00004070 if (Arg *A = Args.getLastArg(options::OPT_pg))
4071 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004072 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004073 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004074
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004075 // Claim some arguments which clang supports automatically.
4076
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004077 // -fpch-preprocess is used with gcc to add a special marker in the output to
4078 // include the PCH file. Clang's PTH solution is completely transparent, so we
4079 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004080 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004081
Daniel Dunbar17731772009-03-23 19:03:36 +00004082 // Claim some arguments which clang doesn't support, but we don't
4083 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004084 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4085 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004086
Rafael Espindolab0092d72013-09-04 19:37:35 +00004087 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004088 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004089}
4090
John McCall5fb5df92012-06-20 06:18:46 +00004091/// Add options related to the Objective-C runtime/ABI.
4092///
4093/// Returns true if the runtime is non-fragile.
4094ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4095 ArgStringList &cmdArgs,
4096 RewriteKind rewriteKind) const {
4097 // Look for the controlling runtime option.
4098 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4099 options::OPT_fgnu_runtime,
4100 options::OPT_fobjc_runtime_EQ);
4101
4102 // Just forward -fobjc-runtime= to the frontend. This supercedes
4103 // options about fragility.
4104 if (runtimeArg &&
4105 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4106 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004107 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004108 if (runtime.tryParse(value)) {
4109 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4110 << value;
4111 }
4112
4113 runtimeArg->render(args, cmdArgs);
4114 return runtime;
4115 }
4116
4117 // Otherwise, we'll need the ABI "version". Version numbers are
4118 // slightly confusing for historical reasons:
4119 // 1 - Traditional "fragile" ABI
4120 // 2 - Non-fragile ABI, version 1
4121 // 3 - Non-fragile ABI, version 2
4122 unsigned objcABIVersion = 1;
4123 // If -fobjc-abi-version= is present, use that to set the version.
4124 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004125 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004126 if (value == "1")
4127 objcABIVersion = 1;
4128 else if (value == "2")
4129 objcABIVersion = 2;
4130 else if (value == "3")
4131 objcABIVersion = 3;
4132 else
4133 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4134 << value;
4135 } else {
4136 // Otherwise, determine if we are using the non-fragile ABI.
4137 bool nonFragileABIIsDefault =
4138 (rewriteKind == RK_NonFragile ||
4139 (rewriteKind == RK_None &&
4140 getToolChain().IsObjCNonFragileABIDefault()));
4141 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4142 options::OPT_fno_objc_nonfragile_abi,
4143 nonFragileABIIsDefault)) {
4144 // Determine the non-fragile ABI version to use.
4145#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4146 unsigned nonFragileABIVersion = 1;
4147#else
4148 unsigned nonFragileABIVersion = 2;
4149#endif
4150
4151 if (Arg *abiArg = args.getLastArg(
4152 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004153 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004154 if (value == "1")
4155 nonFragileABIVersion = 1;
4156 else if (value == "2")
4157 nonFragileABIVersion = 2;
4158 else
4159 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4160 << value;
4161 }
4162
4163 objcABIVersion = 1 + nonFragileABIVersion;
4164 } else {
4165 objcABIVersion = 1;
4166 }
4167 }
4168
4169 // We don't actually care about the ABI version other than whether
4170 // it's non-fragile.
4171 bool isNonFragile = objcABIVersion != 1;
4172
4173 // If we have no runtime argument, ask the toolchain for its default runtime.
4174 // However, the rewriter only really supports the Mac runtime, so assume that.
4175 ObjCRuntime runtime;
4176 if (!runtimeArg) {
4177 switch (rewriteKind) {
4178 case RK_None:
4179 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4180 break;
4181 case RK_Fragile:
4182 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4183 break;
4184 case RK_NonFragile:
4185 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4186 break;
4187 }
4188
4189 // -fnext-runtime
4190 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4191 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004192 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004193 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4194
4195 // Otherwise, build for a generic macosx port.
4196 } else {
4197 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4198 }
4199
4200 // -fgnu-runtime
4201 } else {
4202 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004203 // Legacy behaviour is to target the gnustep runtime if we are i
4204 // non-fragile mode or the GCC runtime in fragile mode.
4205 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004206 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004207 else
4208 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004209 }
4210
4211 cmdArgs.push_back(args.MakeArgString(
4212 "-fobjc-runtime=" + runtime.getAsString()));
4213 return runtime;
4214}
4215
Hans Wennborg75958c42013-08-08 00:17:41 +00004216void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4217 unsigned RTOptionID = options::OPT__SLASH_MT;
4218
Hans Wennborgf1a74252013-09-10 20:18:04 +00004219 if (Args.hasArg(options::OPT__SLASH_LDd))
4220 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4221 // but defining _DEBUG is sticky.
4222 RTOptionID = options::OPT__SLASH_MTd;
4223
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004224 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004225 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004226
Hans Wennborg75958c42013-08-08 00:17:41 +00004227 switch(RTOptionID) {
4228 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004229 if (Args.hasArg(options::OPT__SLASH_LDd))
4230 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004231 CmdArgs.push_back("-D_MT");
4232 CmdArgs.push_back("-D_DLL");
4233 CmdArgs.push_back("--dependent-lib=msvcrt");
4234 break;
4235 case options::OPT__SLASH_MDd:
4236 CmdArgs.push_back("-D_DEBUG");
4237 CmdArgs.push_back("-D_MT");
4238 CmdArgs.push_back("-D_DLL");
4239 CmdArgs.push_back("--dependent-lib=msvcrtd");
4240 break;
4241 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004242 if (Args.hasArg(options::OPT__SLASH_LDd))
4243 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004244 CmdArgs.push_back("-D_MT");
4245 CmdArgs.push_back("--dependent-lib=libcmt");
4246 break;
4247 case options::OPT__SLASH_MTd:
4248 CmdArgs.push_back("-D_DEBUG");
4249 CmdArgs.push_back("-D_MT");
4250 CmdArgs.push_back("--dependent-lib=libcmtd");
4251 break;
4252 default:
4253 llvm_unreachable("Unexpected option ID.");
4254 }
4255
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004256 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4257 // users want. The /Za flag to cl.exe turns this off, but it's not
4258 // implemented in clang.
4259 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004260
Hans Wennborg0fd62072013-08-09 00:32:23 +00004261 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4262 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004263
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004264 // RTTI is currently not supported, so disable it by default.
4265 if (!Args.hasArg(options::OPT_frtti, options::OPT_fno_rtti))
4266 CmdArgs.push_back("-fno-rtti");
4267
David Majnemer86c318f2014-02-11 21:05:00 +00004268 const Driver &D = getToolChain().getDriver();
4269 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
4270 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
4271 if (MostGeneralArg && BestCaseArg)
4272 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4273 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
4274
4275 if (MostGeneralArg) {
4276 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
4277 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
4278 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
4279
4280 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
4281 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
4282 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
4283 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4284 << FirstConflict->getAsString(Args)
4285 << SecondConflict->getAsString(Args);
4286
4287 if (SingleArg)
4288 CmdArgs.push_back("-fms-memptr-rep=single");
4289 else if (MultipleArg)
4290 CmdArgs.push_back("-fms-memptr-rep=multiple");
4291 else
4292 CmdArgs.push_back("-fms-memptr-rep=virtual");
4293 }
4294
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00004295 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
4296 A->render(Args, CmdArgs);
4297
Hans Wennborg81f74482013-09-10 01:07:07 +00004298 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
4299 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00004300 if (Args.hasArg(options::OPT__SLASH_fallback))
4301 CmdArgs.push_back("msvc-fallback");
4302 else
4303 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00004304 }
Hans Wennborg75958c42013-08-08 00:17:41 +00004305}
4306
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004307void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004308 const InputInfo &Output,
4309 const InputInfoList &Inputs,
4310 const ArgList &Args,
4311 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004312 ArgStringList CmdArgs;
4313
4314 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4315 const InputInfo &Input = Inputs[0];
4316
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004317 // Don't warn about "clang -w -c foo.s"
4318 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00004319 // and "clang -emit-llvm -c foo.s"
4320 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004321
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004322 // Invoke ourselves in -cc1as mode.
4323 //
4324 // FIXME: Implement custom jobs for internal actions.
4325 CmdArgs.push_back("-cc1as");
4326
4327 // Add the "effective" target triple.
4328 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00004329 std::string TripleStr =
4330 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004331 CmdArgs.push_back(Args.MakeArgString(TripleStr));
4332
4333 // Set the output mode, we currently only expect to be used as a real
4334 // assembler.
4335 CmdArgs.push_back("-filetype");
4336 CmdArgs.push_back("obj");
4337
Eric Christopher45f2e712012-12-18 00:31:10 +00004338 // Set the main file name, so that debug info works even with
4339 // -save-temps or preprocessed assembly.
4340 CmdArgs.push_back("-main-file-name");
4341 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
4342
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004343 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004344 const llvm::Triple &Triple = getToolChain().getTriple();
4345 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004346 if (!CPU.empty()) {
4347 CmdArgs.push_back("-target-cpu");
4348 CmdArgs.push_back(Args.MakeArgString(CPU));
4349 }
4350
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004351 // Add the target features
4352 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00004353 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00004354
Daniel Dunbar1d733e22011-03-17 17:37:29 +00004355 // Ignore explicit -force_cpusubtype_ALL option.
4356 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004357
Eric Christopherfc3ee562012-01-10 00:38:01 +00004358 // Determine the original source input.
4359 const Action *SourceAction = &JA;
4360 while (SourceAction->getKind() != Action::InputClass) {
4361 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4362 SourceAction = SourceAction->getInputs()[0];
4363 }
4364
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004365 // Forward -g and handle debug info related flags, assuming we are dealing
4366 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00004367 if (SourceAction->getType() == types::TY_Asm ||
4368 SourceAction->getType() == types::TY_PP_Asm) {
4369 Args.ClaimAllArgs(options::OPT_g_Group);
4370 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
4371 if (!A->getOption().matches(options::OPT_g0))
4372 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004373
4374 // Add the -fdebug-compilation-dir flag if needed.
4375 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00004376
4377 // Set the AT_producer to the clang version when using the integrated
4378 // assembler on assembly source files.
4379 CmdArgs.push_back("-dwarf-debug-producer");
4380 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00004381 }
Kevin Enderby292dc082011-12-22 19:31:58 +00004382
4383 // Optionally embed the -cc1as level arguments into the debug info, for build
4384 // analysis.
4385 if (getToolChain().UseDwarfDebugFlags()) {
4386 ArgStringList OriginalArgs;
4387 for (ArgList::const_iterator it = Args.begin(),
4388 ie = Args.end(); it != ie; ++it)
4389 (*it)->render(Args, OriginalArgs);
4390
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004391 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00004392 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4393 Flags += Exec;
4394 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
4395 Flags += " ";
4396 Flags += OriginalArgs[i];
4397 }
4398 CmdArgs.push_back("-dwarf-debug-flags");
4399 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4400 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004401
4402 // FIXME: Add -static support, once we have it.
4403
David Blaikie372d9502014-01-17 03:17:40 +00004404 // Consume all the warning flags. Usually this would be handled more
4405 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
4406 // doesn't handle that so rather than warning about unused flags that are
4407 // actually used, we'll lie by omission instead.
4408 // FIXME: Stop lying and consume only the appropriate driver flags
4409 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
4410 ie = Args.filtered_end();
4411 it != ie; ++it)
4412 (*it)->claim();
4413
David Blaikie9260ed62013-07-25 21:19:01 +00004414 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
4415 getToolChain().getDriver());
4416
Daniel Dunbar252e8f92011-04-29 17:53:18 +00004417 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004418
4419 assert(Output.isFilename() && "Unexpected lipo output.");
4420 CmdArgs.push_back("-o");
4421 CmdArgs.push_back(Output.getFilename());
4422
Daniel Dunbarb440f562010-08-02 02:38:21 +00004423 assert(Input.isFilename() && "Invalid input.");
4424 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004425
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004426 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004427 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00004428
4429 // Handle the debug info splitting at object creation time if we're
4430 // creating an object.
4431 // TODO: Currently only works on linux with newer objcopy.
4432 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004433 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00004434 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
4435 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004436}
4437
Daniel Dunbara3246a02009-03-18 08:07:30 +00004438void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004439 const InputInfo &Output,
4440 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004441 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004442 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004443 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00004444 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004445
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004446 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004447 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004448 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00004449 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00004450 // Don't forward any -g arguments to assembly steps.
4451 if (isa<AssembleJobAction>(JA) &&
4452 A->getOption().matches(options::OPT_g_Group))
4453 continue;
4454
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00004455 // Don't forward any -W arguments to assembly and link steps.
4456 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4457 A->getOption().matches(options::OPT_W_Group))
4458 continue;
4459
Daniel Dunbar2da02722009-03-19 07:55:12 +00004460 // It is unfortunate that we have to claim here, as this means
4461 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00004462 // platforms using a generic gcc, even if we are just using gcc
4463 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00004464 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004465 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00004466 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004467 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004468
Daniel Dunbar4e295052010-01-25 22:35:08 +00004469 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004470
4471 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004472 llvm::Triple::ArchType Arch = getToolChain().getArch();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004473 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004474 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00004475
4476 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004477 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004478 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004479 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004480 CmdArgs.push_back("ppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00004481 else if (Arch == llvm::Triple::ppc64le)
4482 CmdArgs.push_back("ppc64le");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004483 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004484 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00004485 }
4486
Daniel Dunbar5716d872009-05-02 21:41:52 +00004487 // Try to force gcc to match the tool chain we want, if we recognize
4488 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004489 //
4490 // FIXME: The triple class should directly provide the information we want
4491 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004492 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004493 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00004494 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4495 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004496 CmdArgs.push_back("-m64");
4497
Daniel Dunbarb440f562010-08-02 02:38:21 +00004498 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004499 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004500 CmdArgs.push_back(Output.getFilename());
4501 } else {
4502 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004503 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004504 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004505
Tony Linthicum76329bf2011-12-12 21:14:55 +00004506 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4507 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004508
4509 // Only pass -x if gcc will understand it; otherwise hope gcc
4510 // understands the suffix correctly. The main use case this would go
4511 // wrong in is for linker inputs if they happened to have an odd
4512 // suffix; really the only way to get this to happen is a command
4513 // like '-x foobar a.c' which will treat a.c like a linker input.
4514 //
4515 // FIXME: For the linker case specifically, can we safely convert
4516 // inputs into '-Wl,' options?
4517 for (InputInfoList::const_iterator
4518 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4519 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004520
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004521 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004522 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4523 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004524 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004525 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004526 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004527 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004528 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004529 else if (II.getType() == types::TY_ModuleFile)
4530 D.Diag(diag::err_drv_no_module_support)
4531 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004532
Daniel Dunbara3246a02009-03-18 08:07:30 +00004533 if (types::canTypeBeUserSpecified(II.getType())) {
4534 CmdArgs.push_back("-x");
4535 CmdArgs.push_back(types::getTypeName(II.getType()));
4536 }
4537
Daniel Dunbarb440f562010-08-02 02:38:21 +00004538 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004539 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00004540 else {
4541 const Arg &A = II.getInputArg();
4542
4543 // Reverse translate some rewritten options.
4544 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4545 CmdArgs.push_back("-lstdc++");
4546 continue;
4547 }
4548
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004549 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00004550 A.render(Args, CmdArgs);
4551 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004552 }
4553
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004554 const std::string customGCCName = D.getCCCGenericGCCName();
4555 const char *GCCName;
4556 if (!customGCCName.empty())
4557 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00004558 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004559 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004560 } else
4561 GCCName = "gcc";
4562
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004563 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004564 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004565 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004566}
4567
Daniel Dunbar4e295052010-01-25 22:35:08 +00004568void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4569 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004570 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004571}
4572
Daniel Dunbar4e295052010-01-25 22:35:08 +00004573void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4574 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004575 const Driver &D = getToolChain().getDriver();
4576
Daniel Dunbar4e295052010-01-25 22:35:08 +00004577 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004578 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4579 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00004580 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004581 else {
4582 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004583 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004584 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004585
Daniel Dunbar4e295052010-01-25 22:35:08 +00004586 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004587 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004588}
4589
Daniel Dunbar4e295052010-01-25 22:35:08 +00004590void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4591 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004592 // The types are (hopefully) good enough.
4593}
4594
Tony Linthicum76329bf2011-12-12 21:14:55 +00004595// Hexagon tools start.
4596void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4597 ArgStringList &CmdArgs) const {
4598
4599}
4600void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4601 const InputInfo &Output,
4602 const InputInfoList &Inputs,
4603 const ArgList &Args,
4604 const char *LinkingOutput) const {
4605
4606 const Driver &D = getToolChain().getDriver();
4607 ArgStringList CmdArgs;
4608
4609 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00004610 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00004611 CmdArgs.push_back(Args.MakeArgString(MarchString));
4612
4613 RenderExtraToolArgs(JA, CmdArgs);
4614
4615 if (Output.isFilename()) {
4616 CmdArgs.push_back("-o");
4617 CmdArgs.push_back(Output.getFilename());
4618 } else {
4619 assert(Output.isNothing() && "Unexpected output");
4620 CmdArgs.push_back("-fsyntax-only");
4621 }
4622
Matthew Curtise8f80a12012-12-06 17:49:03 +00004623 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4624 if (!SmallDataThreshold.empty())
4625 CmdArgs.push_back(
4626 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004627
Matthew Curtise5df3812012-12-07 17:23:04 +00004628 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4629 options::OPT_Xassembler);
4630
Tony Linthicum76329bf2011-12-12 21:14:55 +00004631 // Only pass -x if gcc will understand it; otherwise hope gcc
4632 // understands the suffix correctly. The main use case this would go
4633 // wrong in is for linker inputs if they happened to have an odd
4634 // suffix; really the only way to get this to happen is a command
4635 // like '-x foobar a.c' which will treat a.c like a linker input.
4636 //
4637 // FIXME: For the linker case specifically, can we safely convert
4638 // inputs into '-Wl,' options?
4639 for (InputInfoList::const_iterator
4640 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4641 const InputInfo &II = *it;
4642
4643 // Don't try to pass LLVM or AST inputs to a generic gcc.
4644 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4645 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4646 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4647 << getToolChain().getTripleString();
4648 else if (II.getType() == types::TY_AST)
4649 D.Diag(clang::diag::err_drv_no_ast_support)
4650 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004651 else if (II.getType() == types::TY_ModuleFile)
4652 D.Diag(diag::err_drv_no_module_support)
4653 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00004654
4655 if (II.isFilename())
4656 CmdArgs.push_back(II.getFilename());
4657 else
4658 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4659 II.getInputArg().render(Args, CmdArgs);
4660 }
4661
4662 const char *GCCName = "hexagon-as";
4663 const char *Exec =
4664 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4665 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4666
4667}
4668void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4669 ArgStringList &CmdArgs) const {
4670 // The types are (hopefully) good enough.
4671}
4672
4673void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4674 const InputInfo &Output,
4675 const InputInfoList &Inputs,
4676 const ArgList &Args,
4677 const char *LinkingOutput) const {
4678
Matthew Curtise689b052012-12-06 15:46:07 +00004679 const toolchains::Hexagon_TC& ToolChain =
4680 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4681 const Driver &D = ToolChain.getDriver();
4682
Tony Linthicum76329bf2011-12-12 21:14:55 +00004683 ArgStringList CmdArgs;
4684
Matthew Curtise689b052012-12-06 15:46:07 +00004685 //----------------------------------------------------------------------------
4686 //
4687 //----------------------------------------------------------------------------
4688 bool hasStaticArg = Args.hasArg(options::OPT_static);
4689 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00004690 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00004691 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4692 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4693 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4694 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004695
Matthew Curtise689b052012-12-06 15:46:07 +00004696 //----------------------------------------------------------------------------
4697 // Silence warnings for various options
4698 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00004699
Matthew Curtise689b052012-12-06 15:46:07 +00004700 Args.ClaimAllArgs(options::OPT_g_Group);
4701 Args.ClaimAllArgs(options::OPT_emit_llvm);
4702 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4703 // handled somewhere else.
4704 Args.ClaimAllArgs(options::OPT_static_libgcc);
4705
4706 //----------------------------------------------------------------------------
4707 //
4708 //----------------------------------------------------------------------------
4709 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4710 e = ToolChain.ExtraOpts.end();
4711 i != e; ++i)
4712 CmdArgs.push_back(i->c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004713
Matthew Curtisf10a5952012-12-06 14:16:43 +00004714 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4715 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00004716
Matthew Curtise689b052012-12-06 15:46:07 +00004717 if (buildingLib) {
4718 CmdArgs.push_back("-shared");
4719 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4720 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00004721 }
4722
Matthew Curtise689b052012-12-06 15:46:07 +00004723 if (hasStaticArg)
4724 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004725
Matthew Curtise8f80a12012-12-06 17:49:03 +00004726 if (buildPIE && !buildingLib)
4727 CmdArgs.push_back("-pie");
4728
4729 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4730 if (!SmallDataThreshold.empty()) {
4731 CmdArgs.push_back(
4732 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4733 }
4734
Matthew Curtise689b052012-12-06 15:46:07 +00004735 //----------------------------------------------------------------------------
4736 //
4737 //----------------------------------------------------------------------------
4738 CmdArgs.push_back("-o");
4739 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004740
Matthew Curtise689b052012-12-06 15:46:07 +00004741 const std::string MarchSuffix = "/" + MarchString;
4742 const std::string G0Suffix = "/G0";
4743 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4744 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4745 + "/";
4746 const std::string StartFilesDir = RootDir
4747 + "hexagon/lib"
4748 + (buildingLib
4749 ? MarchG0Suffix : MarchSuffix);
4750
4751 //----------------------------------------------------------------------------
4752 // moslib
4753 //----------------------------------------------------------------------------
4754 std::vector<std::string> oslibs;
4755 bool hasStandalone= false;
4756
4757 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4758 ie = Args.filtered_end(); it != ie; ++it) {
4759 (*it)->claim();
4760 oslibs.push_back((*it)->getValue());
4761 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004762 }
Matthew Curtise689b052012-12-06 15:46:07 +00004763 if (oslibs.empty()) {
4764 oslibs.push_back("standalone");
4765 hasStandalone = true;
4766 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004767
Matthew Curtise689b052012-12-06 15:46:07 +00004768 //----------------------------------------------------------------------------
4769 // Start Files
4770 //----------------------------------------------------------------------------
4771 if (incStdLib && incStartFiles) {
4772
4773 if (!buildingLib) {
4774 if (hasStandalone) {
4775 CmdArgs.push_back(
4776 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4777 }
4778 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4779 }
4780 std::string initObj = useShared ? "/initS.o" : "/init.o";
4781 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4782 }
4783
4784 //----------------------------------------------------------------------------
4785 // Library Search Paths
4786 //----------------------------------------------------------------------------
4787 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4788 for (ToolChain::path_list::const_iterator
4789 i = LibPaths.begin(),
4790 e = LibPaths.end();
4791 i != e;
4792 ++i)
4793 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4794
4795 //----------------------------------------------------------------------------
4796 //
4797 //----------------------------------------------------------------------------
4798 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4799 Args.AddAllArgs(CmdArgs, options::OPT_e);
4800 Args.AddAllArgs(CmdArgs, options::OPT_s);
4801 Args.AddAllArgs(CmdArgs, options::OPT_t);
4802 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4803
4804 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4805
4806 //----------------------------------------------------------------------------
4807 // Libraries
4808 //----------------------------------------------------------------------------
4809 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00004810 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00004811 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4812 CmdArgs.push_back("-lm");
4813 }
4814
4815 CmdArgs.push_back("--start-group");
4816
4817 if (!buildingLib) {
4818 for(std::vector<std::string>::iterator i = oslibs.begin(),
4819 e = oslibs.end(); i != e; ++i)
4820 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4821 CmdArgs.push_back("-lc");
4822 }
4823 CmdArgs.push_back("-lgcc");
4824
4825 CmdArgs.push_back("--end-group");
4826 }
4827
4828 //----------------------------------------------------------------------------
4829 // End files
4830 //----------------------------------------------------------------------------
4831 if (incStdLib && incStartFiles) {
4832 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4833 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4834 }
4835
4836 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00004837 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004838}
4839// Hexagon tools end.
4840
Bernard Ogden31561762013-12-12 13:27:11 +00004841/// getARMCPUForMArch - Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting
4842//
4843// FIXME: tblgen this.
4844const char *arm::getARMCPUForMArch(const ArgList &Args,
4845 const llvm::Triple &Triple) {
4846 StringRef MArch;
4847 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
4848 // Otherwise, if we have -march= choose the base CPU for that arch.
4849 MArch = A->getValue();
4850 } else {
4851 // Otherwise, use the Arch from the triple.
4852 MArch = Triple.getArchName();
4853 }
4854
4855 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00004856 if (MArch == "native") {
4857 std::string CPU = llvm::sys::getHostCPUName();
4858 if (CPU != "generic") {
4859 // Translate the native cpu into the architecture. The switch below will
4860 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00004861 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00004862 }
4863 }
4864
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004865 switch (Triple.getOS()) {
4866 case llvm::Triple::NetBSD:
Bernard Ogden31561762013-12-12 13:27:11 +00004867 if (MArch == "armv6")
4868 return "arm1176jzf-s";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004869 break;
4870 case llvm::Triple::Win32:
4871 // FIXME: this is invalid for WindowsCE
4872 return "cortex-a9";
4873 default:
4874 break;
Bernard Ogden31561762013-12-12 13:27:11 +00004875 }
4876
4877 const char *result = llvm::StringSwitch<const char *>(MArch)
4878 .Cases("armv2", "armv2a","arm2")
4879 .Case("armv3", "arm6")
4880 .Case("armv3m", "arm7m")
4881 .Case("armv4", "strongarm")
4882 .Case("armv4t", "arm7tdmi")
4883 .Case("thumbv4t", "arm7tdmi")
4884 .Cases("armv5", "armv5t", "arm10tdmi")
4885 .Cases("thumbv5", "thumbv5t", "arm10tdmi")
4886 .Cases("armv5e", "armv5te", "arm1022e")
4887 .Cases("thumbv5e", "thumbv5te", "arm1022e")
4888 .Case("armv5tej", "arm926ej-s")
4889 .Case("thumbv5tej", "arm926ej-s")
4890 .Cases("armv6", "armv6k", "arm1136jf-s")
4891 .Cases("thumbv6", "thumbv6k", "arm1136jf-s")
4892 .Case("armv6j", "arm1136j-s")
4893 .Case("thumbv6j", "arm1136j-s")
4894 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
4895 .Cases("thumbv6z", "thumbv6zk", "arm1176jzf-s")
4896 .Case("armv6t2", "arm1156t2-s")
4897 .Case("thumbv6t2", "arm1156t2-s")
4898 .Cases("armv6m", "armv6-m", "cortex-m0")
4899 .Case("thumbv6m", "cortex-m0")
4900 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004901 .Cases("armebv7", "armebv7a", "armebv7-a", "cortex-a8")
Bernard Ogden31561762013-12-12 13:27:11 +00004902 .Cases("thumbv7", "thumbv7a", "cortex-a8")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004903 .Cases("thumbebv7", "thumbebv7a", "cortex-a8")
Bernard Ogden31561762013-12-12 13:27:11 +00004904 .Cases("armv7l", "armv7-l", "cortex-a8")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004905 .Cases("armebv7l", "armebv7-l", "cortex-a8")
Bernard Ogden31561762013-12-12 13:27:11 +00004906 .Cases("armv7s", "armv7-s", "swift")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004907 .Cases("armebv7s", "armebv7-s", "swift")
Bernard Ogden31561762013-12-12 13:27:11 +00004908 .Cases("armv7r", "armv7-r", "cortex-r4")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004909 .Cases("armebv7r", "armebv7-r", "cortex-r4")
Bernard Ogden31561762013-12-12 13:27:11 +00004910 .Case("thumbv7r", "cortex-r4")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004911 .Case("thumbebv7r", "cortex-r4")
Bernard Ogden31561762013-12-12 13:27:11 +00004912 .Cases("armv7m", "armv7-m", "cortex-m3")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004913 .Cases("armebv7m", "armebv7-m", "cortex-m3")
Bernard Ogden31561762013-12-12 13:27:11 +00004914 .Case("thumbv7m", "cortex-m3")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004915 .Case("thumbebv7m", "cortex-m3")
Bernard Ogden31561762013-12-12 13:27:11 +00004916 .Cases("armv7em", "armv7e-m", "cortex-m4")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004917 .Cases("armebv7em", "armebv7e-m", "cortex-m4")
Bernard Ogden31561762013-12-12 13:27:11 +00004918 .Cases("thumbv7em", "thumbv7e-m", "cortex-m4")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004919 .Cases("thumbebv7em", "thumbebv7e-m", "cortex-m4")
Bernard Ogden31561762013-12-12 13:27:11 +00004920 .Cases("armv8", "armv8a", "armv8-a", "cortex-a53")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004921 .Cases("armebv8", "armebv8a", "armebv8-a", "cortex-a53")
Bernard Ogden31561762013-12-12 13:27:11 +00004922 .Cases("thumbv8", "thumbv8a", "cortex-a53")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004923 .Cases("thumbebv8", "thumbebv8a", "cortex-a53")
Bernard Ogden31561762013-12-12 13:27:11 +00004924 .Case("ep9312", "ep9312")
4925 .Case("iwmmxt", "iwmmxt")
4926 .Case("xscale", "xscale")
4927 // If all else failed, return the most base CPU with thumb interworking
4928 // supported by LLVM.
4929 .Default(0);
4930
4931 if (result)
4932 return result;
4933
Joerg Sonnenberger695fdb32014-02-21 21:53:33 +00004934 switch (Triple.getOS()) {
4935 case llvm::Triple::NetBSD:
4936 switch (Triple.getEnvironment()) {
4937 case llvm::Triple::GNUEABIHF:
4938 case llvm::Triple::GNUEABI:
4939 case llvm::Triple::EABIHF:
4940 case llvm::Triple::EABI:
4941 return "arm926ej-s";
4942 default:
4943 return "strongarm";
4944 }
4945 default:
4946 switch (Triple.getEnvironment()) {
4947 case llvm::Triple::EABIHF:
4948 case llvm::Triple::GNUEABIHF:
4949 return "arm1176jzf-s";
4950 default:
4951 return "arm7tdmi";
4952 }
4953 }
Bernard Ogden31561762013-12-12 13:27:11 +00004954}
4955
4956/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00004957StringRef arm::getARMTargetCPU(const ArgList &Args,
4958 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00004959 // FIXME: Warn on inconsistent use of -mcpu and -march.
4960 // If we have -mcpu=, use that.
4961 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
4962 StringRef MCPU = A->getValue();
4963 // Handle -mcpu=native.
4964 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00004965 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00004966 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00004967 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00004968 }
4969
4970 return getARMCPUForMArch(Args, Triple);
4971}
4972
4973/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
4974/// CPU.
4975//
4976// FIXME: This is redundant with -mcpu, why does LLVM use this.
4977// FIXME: tblgen this, or kill it!
4978const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
4979 return llvm::StringSwitch<const char *>(CPU)
4980 .Case("strongarm", "v4")
4981 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
4982 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
4983 .Cases("arm920", "arm920t", "arm922t", "v4t")
4984 .Cases("arm940t", "ep9312","v4t")
4985 .Cases("arm10tdmi", "arm1020t", "v5")
4986 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
4987 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
4988 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
4989 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
4990 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
4991 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Bob Wilsonb767d152014-01-15 21:43:40 +00004992 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "v7")
Bernard Ogden31561762013-12-12 13:27:11 +00004993 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "v7")
4994 .Cases("cortex-r4", "cortex-r5", "v7r")
4995 .Case("cortex-m0", "v6m")
4996 .Case("cortex-m3", "v7m")
4997 .Case("cortex-m4", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00004998 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00004999 .Case("cyclone", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00005000 .Cases("cortex-a53", "cortex-a57", "v8")
5001 .Default("");
5002}
5003
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005004bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5005 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5006 return A && (A->getValue() == StringRef(Value));
5007}
5008
Tim Northover157d9112014-01-16 08:48:16 +00005009llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005010 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5011 // archs which Darwin doesn't use.
5012
5013 // The matching this routine does is fairly pointless, since it is neither the
5014 // complete architecture list, nor a reasonable subset. The problem is that
5015 // historically the driver driver accepts this and also ties its -march=
5016 // handling to the architecture name, so we need to be careful before removing
5017 // support for it.
5018
5019 // This code must be kept in sync with Clang's Darwin specific argument
5020 // translation.
5021
5022 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5023 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5024 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5025 .Case("ppc64", llvm::Triple::ppc64)
5026 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5027 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5028 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005029 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005030 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005031 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005032 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005033 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northovera2ee4332014-03-29 15:09:45 +00005034 .Case("arm64", llvm::Triple::arm64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005035 .Case("r600", llvm::Triple::r600)
5036 .Case("nvptx", llvm::Triple::nvptx)
5037 .Case("nvptx64", llvm::Triple::nvptx64)
5038 .Case("amdil", llvm::Triple::amdil)
5039 .Case("spir", llvm::Triple::spir)
5040 .Default(llvm::Triple::UnknownArch);
5041}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005042
Tim Northover157d9112014-01-16 08:48:16 +00005043void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5044 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5045 T.setArch(Arch);
5046
5047 if (Str == "x86_64h")
5048 T.setArchName(Str);
5049 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5050 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005051 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005052 }
5053}
5054
Bob Wilsondecc03e2012-11-23 06:14:39 +00005055const char *Clang::getBaseInputName(const ArgList &Args,
5056 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00005057 return Args.MakeArgString(
5058 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005059}
5060
Bob Wilsondecc03e2012-11-23 06:14:39 +00005061const char *Clang::getBaseInputStem(const ArgList &Args,
5062 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005063 const char *Str = getBaseInputName(Args, Inputs);
5064
Chris Lattner906bb902011-01-16 08:14:11 +00005065 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005066 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005067
5068 return Str;
5069}
5070
Bob Wilsondecc03e2012-11-23 06:14:39 +00005071const char *Clang::getDependencyFileName(const ArgList &Args,
5072 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005073 // FIXME: Think about this more.
5074 std::string Res;
5075
5076 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005077 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005078 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005079 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005080 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005081 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005082 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005083}
5084
Daniel Dunbarbe220842009-03-20 16:06:39 +00005085void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005086 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005087 const InputInfoList &Inputs,
5088 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005089 const char *LinkingOutput) const {
5090 ArgStringList CmdArgs;
5091
5092 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5093 const InputInfo &Input = Inputs[0];
5094
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005095 // Determine the original source input.
5096 const Action *SourceAction = &JA;
5097 while (SourceAction->getKind() != Action::InputClass) {
5098 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5099 SourceAction = SourceAction->getInputs()[0];
5100 }
5101
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005102 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005103 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005104 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5105 // FIXME: at run-time detect assembler capabilities or rely on version
5106 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005107 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005108 const llvm::Triple &T(getToolChain().getTriple());
5109 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005110 CmdArgs.push_back("-Q");
5111 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005112
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005113 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005114 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005115 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005116 if (Args.hasArg(options::OPT_gstabs))
5117 CmdArgs.push_back("--gstabs");
5118 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005119 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005120 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005121
Daniel Dunbarbe220842009-03-20 16:06:39 +00005122 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005123 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005124
Daniel Dunbar6d484762010-07-22 01:47:22 +00005125 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005126 if (getToolChain().getArch() == llvm::Triple::x86 ||
5127 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00005128 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5129 CmdArgs.push_back("-force_cpusubtype_ALL");
5130
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005131 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005132 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00005133 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00005134 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005135 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005136 CmdArgs.push_back("-static");
5137
Daniel Dunbarbe220842009-03-20 16:06:39 +00005138 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5139 options::OPT_Xassembler);
5140
5141 assert(Output.isFilename() && "Unexpected lipo output.");
5142 CmdArgs.push_back("-o");
5143 CmdArgs.push_back(Output.getFilename());
5144
Daniel Dunbarb440f562010-08-02 02:38:21 +00005145 assert(Input.isFilename() && "Invalid input.");
5146 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00005147
5148 // asm_final spec is empty.
5149
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005150 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005151 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005152 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00005153}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005154
Tim Northover157d9112014-01-16 08:48:16 +00005155void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00005156
Tim Northover157d9112014-01-16 08:48:16 +00005157void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5158 ArgStringList &CmdArgs) const {
5159 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005160
Daniel Dunbarc1964212009-03-26 16:23:12 +00005161 // Derived from darwin_arch spec.
5162 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005163 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005164
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005165 // FIXME: Is this needed anymore?
5166 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005167 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005168}
5169
Bill Wendling3b2000f2012-10-02 18:02:50 +00005170bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5171 // We only need to generate a temp path for LTO if we aren't compiling object
5172 // files. When compiling source files, we run 'dsymutil' after linking. We
5173 // don't run 'dsymutil' when compiling object files.
5174 for (InputInfoList::const_iterator
5175 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
5176 if (it->getType() != types::TY_Object)
5177 return true;
5178
5179 return false;
5180}
5181
Daniel Dunbarccbc4522010-09-09 21:51:05 +00005182void darwin::Link::AddLinkArgs(Compilation &C,
5183 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00005184 ArgStringList &CmdArgs,
5185 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005186 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00005187 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00005188
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005189 unsigned Version[3] = { 0, 0, 0 };
5190 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
5191 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00005192 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005193 Version[1], Version[2], HadExtra) ||
5194 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005195 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005196 << A->getAsString(Args);
5197 }
5198
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005199 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005200 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005201 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5202 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005203
Bob Wilson3d27dad2013-08-02 22:25:34 +00005204 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
5205 CmdArgs.push_back("-export_dynamic");
5206
Bill Wendling313b6bf2012-11-16 23:03:00 +00005207 // If we are using LTO, then automatically create a temporary file path for
5208 // the linker to use, so that it's lifetime will extend past a possible
5209 // dsymutil step.
5210 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
5211 const char *TmpPath = C.getArgs().MakeArgString(
5212 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
5213 C.addTempFile(TmpPath);
5214 CmdArgs.push_back("-object_path_lto");
5215 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00005216 }
5217
Daniel Dunbarc1964212009-03-26 16:23:12 +00005218 // Derived from the "link" spec.
5219 Args.AddAllArgs(CmdArgs, options::OPT_static);
5220 if (!Args.hasArg(options::OPT_static))
5221 CmdArgs.push_back("-dynamic");
5222 if (Args.hasArg(options::OPT_fgnu_runtime)) {
5223 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
5224 // here. How do we wish to handle such things?
5225 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005226
Daniel Dunbarc1964212009-03-26 16:23:12 +00005227 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00005228 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00005229 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00005230 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005231
5232 Args.AddLastArg(CmdArgs, options::OPT_bundle);
5233 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
5234 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
5235
5236 Arg *A;
5237 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
5238 (A = Args.getLastArg(options::OPT_current__version)) ||
5239 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005240 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005241 << A->getAsString(Args) << "-dynamiclib";
5242
5243 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
5244 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
5245 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
5246 } else {
5247 CmdArgs.push_back("-dylib");
5248
5249 Arg *A;
5250 if ((A = Args.getLastArg(options::OPT_bundle)) ||
5251 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
5252 (A = Args.getLastArg(options::OPT_client__name)) ||
5253 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
5254 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
5255 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005256 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005257 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005258
Daniel Dunbarc1964212009-03-26 16:23:12 +00005259 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
5260 "-dylib_compatibility_version");
5261 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
5262 "-dylib_current_version");
5263
Tim Northover157d9112014-01-16 08:48:16 +00005264 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005265
5266 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
5267 "-dylib_install_name");
5268 }
5269
5270 Args.AddLastArg(CmdArgs, options::OPT_all__load);
5271 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
5272 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00005273 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005274 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005275 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
5276 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
5277 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
5278 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
5279 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
5280 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00005281 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005282 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
5283 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
5284 Args.AddAllArgs(CmdArgs, options::OPT_init);
5285
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005286 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00005287 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005288
Daniel Dunbarc1964212009-03-26 16:23:12 +00005289 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
5290 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
5291 Args.AddLastArg(CmdArgs, options::OPT_single__module);
5292 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
5293 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005294
Daniel Dunbaraf68a882010-07-13 23:31:40 +00005295 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
5296 options::OPT_fno_pie,
5297 options::OPT_fno_PIE)) {
5298 if (A->getOption().matches(options::OPT_fpie) ||
5299 A->getOption().matches(options::OPT_fPIE))
5300 CmdArgs.push_back("-pie");
5301 else
5302 CmdArgs.push_back("-no_pie");
5303 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005304
5305 Args.AddLastArg(CmdArgs, options::OPT_prebind);
5306 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
5307 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
5308 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
5309 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
5310 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
5311 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
5312 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
5313 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
5314 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
5315 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
5316 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
5317 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
5318 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
5319 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
5320 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005321
Daniel Dunbar84384642011-05-02 21:03:47 +00005322 // Give --sysroot= preference, over the Apple specific behavior to also use
5323 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00005324 StringRef sysroot = C.getSysRoot();
5325 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00005326 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00005327 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00005328 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5329 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00005330 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005331 }
5332
Daniel Dunbarc1964212009-03-26 16:23:12 +00005333 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
5334 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
5335 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
5336 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
5337 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005338 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005339 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
5340 Args.AddAllArgs(CmdArgs, options::OPT_y);
5341 Args.AddLastArg(CmdArgs, options::OPT_w);
5342 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
5343 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
5344 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
5345 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
5346 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
5347 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
5348 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
5349 Args.AddLastArg(CmdArgs, options::OPT_whyload);
5350 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
5351 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
5352 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
5353 Args.AddLastArg(CmdArgs, options::OPT_Mach);
5354}
5355
Alexey Bataev186b28a2014-03-06 05:43:53 +00005356enum LibOpenMP {
5357 LibUnknown,
5358 LibGOMP,
5359 LibIOMP5
5360};
5361
Daniel Dunbarc1964212009-03-26 16:23:12 +00005362void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005363 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005364 const InputInfoList &Inputs,
5365 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00005366 const char *LinkingOutput) const {
5367 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00005368
Daniel Dunbarc1964212009-03-26 16:23:12 +00005369 // The logic here is derived from gcc's behavior; most of which
5370 // comes from specs (starting with link_command). Consult gcc for
5371 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00005372 ArgStringList CmdArgs;
5373
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005374 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
5375 if (Args.hasArg(options::OPT_ccc_arcmt_check,
5376 options::OPT_ccc_arcmt_migrate)) {
5377 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
5378 (*I)->claim();
5379 const char *Exec =
5380 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
5381 CmdArgs.push_back(Output.getFilename());
5382 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5383 return;
5384 }
5385
Daniel Dunbarc1964212009-03-26 16:23:12 +00005386 // I'm not sure why this particular decomposition exists in gcc, but
5387 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00005388 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005389
Daniel Dunbarc1964212009-03-26 16:23:12 +00005390 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
5391 Args.AddAllArgs(CmdArgs, options::OPT_s);
5392 Args.AddAllArgs(CmdArgs, options::OPT_t);
5393 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5394 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005395 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005396 Args.AddAllArgs(CmdArgs, options::OPT_r);
5397
Daniel Dunbar767bbab2010-10-18 22:08:36 +00005398 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
5399 // members of static archive libraries which implement Objective-C classes or
5400 // categories.
5401 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
5402 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005403
Daniel Dunbarc1964212009-03-26 16:23:12 +00005404 CmdArgs.push_back("-o");
5405 CmdArgs.push_back(Output.getFilename());
5406
Chad Rosier06fd3c62012-05-16 23:45:12 +00005407 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00005408 !Args.hasArg(options::OPT_nostartfiles))
5409 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005410
5411 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005412
Alexey Bataev186b28a2014-03-06 05:43:53 +00005413 LibOpenMP UsedOpenMPLib = LibUnknown;
5414 if (Args.hasArg(options::OPT_fopenmp)) {
5415 UsedOpenMPLib = LibGOMP;
5416 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
5417 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
5418 .Case("libgomp", LibGOMP)
5419 .Case("libiomp5", LibIOMP5)
5420 .Default(LibUnknown);
5421 if (UsedOpenMPLib == LibUnknown)
5422 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
5423 << A->getOption().getName() << A->getValue();
5424 }
5425 switch (UsedOpenMPLib) {
5426 case LibGOMP:
Daniel Dunbarc1964212009-03-26 16:23:12 +00005427 CmdArgs.push_back("-lgomp");
Alexey Bataev186b28a2014-03-06 05:43:53 +00005428 break;
5429 case LibIOMP5:
5430 CmdArgs.push_back("-liomp5");
5431 break;
5432 case LibUnknown:
5433 break;
5434 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005435
Douglas Gregor9295df02012-05-15 21:00:27 +00005436 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5437
Bob Wilson16d93952012-05-15 18:57:39 +00005438 if (isObjCRuntimeLinked(Args) &&
5439 !Args.hasArg(options::OPT_nostdlib) &&
5440 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00005441 // We use arclite library for both ARC and subscripting support.
5442 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
5443
Bob Wilson7dda0cd2012-04-21 00:21:42 +00005444 CmdArgs.push_back("-framework");
5445 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00005446 // Link libobj.
5447 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00005448 }
John McCall31168b02011-06-15 23:02:42 +00005449
Daniel Dunbarc1964212009-03-26 16:23:12 +00005450 if (LinkingOutput) {
5451 CmdArgs.push_back("-arch_multiple");
5452 CmdArgs.push_back("-final_output");
5453 CmdArgs.push_back(LinkingOutput);
5454 }
5455
Daniel Dunbarc1964212009-03-26 16:23:12 +00005456 if (Args.hasArg(options::OPT_fnested_functions))
5457 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005458
Daniel Dunbarc1964212009-03-26 16:23:12 +00005459 if (!Args.hasArg(options::OPT_nostdlib) &&
5460 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005461 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005462 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00005463
Daniel Dunbarc1964212009-03-26 16:23:12 +00005464 // link_ssp spec is empty.
5465
Daniel Dunbar26d482a2009-09-18 08:15:03 +00005466 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00005467 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005468 }
5469
Chad Rosier06fd3c62012-05-16 23:45:12 +00005470 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00005471 !Args.hasArg(options::OPT_nostartfiles)) {
5472 // endfile_spec is empty.
5473 }
5474
5475 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5476 Args.AddAllArgs(CmdArgs, options::OPT_F);
5477
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005478 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005479 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005480 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00005481}
5482
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005483void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005484 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005485 const InputInfoList &Inputs,
5486 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005487 const char *LinkingOutput) const {
5488 ArgStringList CmdArgs;
5489
5490 CmdArgs.push_back("-create");
5491 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005492
5493 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005494 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005495
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005496 for (InputInfoList::const_iterator
5497 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5498 const InputInfo &II = *it;
5499 assert(II.isFilename() && "Unexpected lipo input.");
5500 CmdArgs.push_back(II.getFilename());
5501 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005502 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005503 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005504 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005505}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005506
Daniel Dunbar88299622010-06-04 18:28:36 +00005507void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005508 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00005509 const InputInfoList &Inputs,
5510 const ArgList &Args,
5511 const char *LinkingOutput) const {
5512 ArgStringList CmdArgs;
5513
Daniel Dunbareb86b042011-05-09 17:23:16 +00005514 CmdArgs.push_back("-o");
5515 CmdArgs.push_back(Output.getFilename());
5516
Daniel Dunbar88299622010-06-04 18:28:36 +00005517 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5518 const InputInfo &Input = Inputs[0];
5519 assert(Input.isFilename() && "Unexpected dsymutil input.");
5520 CmdArgs.push_back(Input.getFilename());
5521
Daniel Dunbar88299622010-06-04 18:28:36 +00005522 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005523 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005524 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00005525}
5526
Eric Christopher551ef452011-08-23 17:56:55 +00005527void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00005528 const InputInfo &Output,
5529 const InputInfoList &Inputs,
5530 const ArgList &Args,
5531 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00005532 ArgStringList CmdArgs;
5533 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00005534 CmdArgs.push_back("--debug-info");
5535 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00005536 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00005537
5538 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5539 const InputInfo &Input = Inputs[0];
5540 assert(Input.isFilename() && "Unexpected verify input");
5541
5542 // Grabbing the output of the earlier dsymutil run.
5543 CmdArgs.push_back(Input.getFilename());
5544
5545 const char *Exec =
5546 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5547 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5548}
5549
David Chisnallf571cde2012-02-15 13:39:01 +00005550void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5551 const InputInfo &Output,
5552 const InputInfoList &Inputs,
5553 const ArgList &Args,
5554 const char *LinkingOutput) const {
5555 ArgStringList CmdArgs;
5556
5557 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5558 options::OPT_Xassembler);
5559
5560 CmdArgs.push_back("-o");
5561 CmdArgs.push_back(Output.getFilename());
5562
5563 for (InputInfoList::const_iterator
5564 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5565 const InputInfo &II = *it;
5566 CmdArgs.push_back(II.getFilename());
5567 }
5568
5569 const char *Exec =
5570 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5571 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5572}
5573
5574
5575void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5576 const InputInfo &Output,
5577 const InputInfoList &Inputs,
5578 const ArgList &Args,
5579 const char *LinkingOutput) const {
5580 // FIXME: Find a real GCC, don't hard-code versions here
5581 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5582 const llvm::Triple &T = getToolChain().getTriple();
5583 std::string LibPath = "/usr/lib/";
5584 llvm::Triple::ArchType Arch = T.getArch();
5585 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005586 case llvm::Triple::x86:
5587 GCCLibPath +=
5588 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5589 break;
5590 case llvm::Triple::x86_64:
5591 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5592 GCCLibPath += "/4.5.2/amd64/";
5593 LibPath += "amd64/";
5594 break;
5595 default:
5596 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00005597 }
5598
5599 ArgStringList CmdArgs;
5600
David Chisnall272a0712012-02-29 15:06:12 +00005601 // Demangle C++ names in errors
5602 CmdArgs.push_back("-C");
5603
David Chisnallf571cde2012-02-15 13:39:01 +00005604 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5605 (!Args.hasArg(options::OPT_shared))) {
5606 CmdArgs.push_back("-e");
5607 CmdArgs.push_back("_start");
5608 }
5609
5610 if (Args.hasArg(options::OPT_static)) {
5611 CmdArgs.push_back("-Bstatic");
5612 CmdArgs.push_back("-dn");
5613 } else {
5614 CmdArgs.push_back("-Bdynamic");
5615 if (Args.hasArg(options::OPT_shared)) {
5616 CmdArgs.push_back("-shared");
5617 } else {
5618 CmdArgs.push_back("--dynamic-linker");
5619 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5620 }
5621 }
5622
5623 if (Output.isFilename()) {
5624 CmdArgs.push_back("-o");
5625 CmdArgs.push_back(Output.getFilename());
5626 } else {
5627 assert(Output.isNothing() && "Invalid output.");
5628 }
5629
5630 if (!Args.hasArg(options::OPT_nostdlib) &&
5631 !Args.hasArg(options::OPT_nostartfiles)) {
5632 if (!Args.hasArg(options::OPT_shared)) {
5633 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5634 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005635 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005636 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5637 } else {
5638 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005639 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5640 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005641 }
Hans Wennborg70850d82013-07-18 20:29:38 +00005642 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00005643 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005644 }
5645
5646 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5647
5648 Args.AddAllArgs(CmdArgs, options::OPT_L);
5649 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5650 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00005651 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00005652
5653 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5654
5655 if (!Args.hasArg(options::OPT_nostdlib) &&
5656 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005657 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00005658 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00005659 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005660 if (!Args.hasArg(options::OPT_shared)) {
5661 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00005662 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00005663 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005664 }
David Chisnallf571cde2012-02-15 13:39:01 +00005665 }
5666
5667 if (!Args.hasArg(options::OPT_nostdlib) &&
5668 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00005669 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005670 }
David Chisnall96de9932012-02-16 16:00:47 +00005671 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005672
Alexey Samsonov7811d192014-02-20 13:57:37 +00005673 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00005674
5675 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005676 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
David Chisnallf571cde2012-02-15 13:39:01 +00005677 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5678}
5679
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005680void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005681 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005682 const InputInfoList &Inputs,
5683 const ArgList &Args,
5684 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005685 ArgStringList CmdArgs;
5686
5687 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5688 options::OPT_Xassembler);
5689
5690 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005691 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005692
5693 for (InputInfoList::const_iterator
5694 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5695 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005696 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005697 }
5698
5699 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005700 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005701 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005702}
5703
5704void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005705 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005706 const InputInfoList &Inputs,
5707 const ArgList &Args,
5708 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005709 ArgStringList CmdArgs;
5710
5711 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005712 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005713 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005714 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005715 }
5716
5717 if (Args.hasArg(options::OPT_static)) {
5718 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005719 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005720 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005721// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005722 CmdArgs.push_back("-Bdynamic");
5723 if (Args.hasArg(options::OPT_shared)) {
5724 CmdArgs.push_back("-shared");
5725 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00005726 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005727 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5728 }
5729 }
5730
Daniel Dunbarb440f562010-08-02 02:38:21 +00005731 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005732 CmdArgs.push_back("-o");
5733 CmdArgs.push_back(Output.getFilename());
5734 } else {
5735 assert(Output.isNothing() && "Invalid output.");
5736 }
5737
5738 if (!Args.hasArg(options::OPT_nostdlib) &&
5739 !Args.hasArg(options::OPT_nostartfiles)) {
5740 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005741 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005742 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005743 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005744 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005745 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005746 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005747 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005748 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005749 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005750 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005751 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005752 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005753 }
5754
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005755 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5756 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005757 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005758
5759 Args.AddAllArgs(CmdArgs, options::OPT_L);
5760 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5761 Args.AddAllArgs(CmdArgs, options::OPT_e);
5762
Daniel Dunbar54423b22010-09-17 00:24:54 +00005763 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005764
5765 if (!Args.hasArg(options::OPT_nostdlib) &&
5766 !Args.hasArg(options::OPT_nodefaultlibs)) {
5767 // FIXME: For some reason GCC passes -lgcc before adding
5768 // the default system libraries. Just mimic this for now.
5769 CmdArgs.push_back("-lgcc");
5770
5771 if (Args.hasArg(options::OPT_pthread))
5772 CmdArgs.push_back("-pthread");
5773 if (!Args.hasArg(options::OPT_shared))
5774 CmdArgs.push_back("-lc");
5775 CmdArgs.push_back("-lgcc");
5776 }
5777
5778 if (!Args.hasArg(options::OPT_nostdlib) &&
5779 !Args.hasArg(options::OPT_nostartfiles)) {
5780 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005781 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005782 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005783 }
5784
Alexey Samsonov7811d192014-02-20 13:57:37 +00005785 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005786
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005787 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005788 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005789 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005790}
5791
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005792void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005793 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005794 const InputInfoList &Inputs,
5795 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005796 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005797 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00005798 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005799
Rafael Espindolacc126272014-02-28 01:55:21 +00005800 switch (getToolChain().getArch()) {
5801 case llvm::Triple::x86:
5802 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
5803 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005804 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00005805 break;
5806
5807 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005808 CmdArgs.push_back("-mppc");
5809 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00005810 break;
5811
5812 case llvm::Triple::sparc:
5813 CmdArgs.push_back("-32");
5814 NeedsKPIC = true;
5815 break;
5816
5817 case llvm::Triple::sparcv9:
5818 CmdArgs.push_back("-64");
5819 CmdArgs.push_back("-Av9a");
5820 NeedsKPIC = true;
5821 break;
5822
5823 case llvm::Triple::mips64:
5824 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005825 StringRef CPUName;
5826 StringRef ABIName;
5827 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
5828
5829 CmdArgs.push_back("-mabi");
5830 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
5831
5832 if (getToolChain().getArch() == llvm::Triple::mips64)
5833 CmdArgs.push_back("-EB");
5834 else
5835 CmdArgs.push_back("-EL");
5836
Rafael Espindolacc126272014-02-28 01:55:21 +00005837 NeedsKPIC = true;
5838 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005839 }
5840
Rafael Espindolacc126272014-02-28 01:55:21 +00005841 default:
5842 break;
5843 }
5844
5845 if (NeedsKPIC)
5846 addAssemblerKPIC(Args, CmdArgs);
5847
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005848 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5849 options::OPT_Xassembler);
5850
5851 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005852 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005853
5854 for (InputInfoList::const_iterator
5855 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5856 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005857 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005858 }
5859
5860 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005861 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005862 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005863}
5864
5865void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005866 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005867 const InputInfoList &Inputs,
5868 const ArgList &Args,
5869 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005870 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005871 ArgStringList CmdArgs;
5872
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005873 // Silence warning for "clang -g foo.o -o foo"
5874 Args.ClaimAllArgs(options::OPT_g_Group);
5875 // and "clang -emit-llvm foo.o -o foo"
5876 Args.ClaimAllArgs(options::OPT_emit_llvm);
5877 // and for "clang -w foo.o -o foo". Other warning options are already
5878 // handled somewhere else.
5879 Args.ClaimAllArgs(options::OPT_w);
5880
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005881 if (getToolChain().getArch() == llvm::Triple::mips64)
5882 CmdArgs.push_back("-EB");
5883 else if (getToolChain().getArch() == llvm::Triple::mips64el)
5884 CmdArgs.push_back("-EL");
5885
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005886 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005887 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005888 CmdArgs.push_back("-e");
5889 CmdArgs.push_back("__start");
5890 }
5891
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005892 if (Args.hasArg(options::OPT_static)) {
5893 CmdArgs.push_back("-Bstatic");
5894 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005895 if (Args.hasArg(options::OPT_rdynamic))
5896 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005897 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005898 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005899 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005900 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005901 } else {
5902 CmdArgs.push_back("-dynamic-linker");
5903 CmdArgs.push_back("/usr/libexec/ld.so");
5904 }
5905 }
5906
Rafael Espindola044f7832013-06-05 04:28:55 +00005907 if (Args.hasArg(options::OPT_nopie))
5908 CmdArgs.push_back("-nopie");
5909
Daniel Dunbarb440f562010-08-02 02:38:21 +00005910 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005911 CmdArgs.push_back("-o");
5912 CmdArgs.push_back(Output.getFilename());
5913 } else {
5914 assert(Output.isNothing() && "Invalid output.");
5915 }
5916
5917 if (!Args.hasArg(options::OPT_nostdlib) &&
5918 !Args.hasArg(options::OPT_nostartfiles)) {
5919 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00005920 if (Args.hasArg(options::OPT_pg))
5921 CmdArgs.push_back(Args.MakeArgString(
5922 getToolChain().GetFilePath("gcrt0.o")));
5923 else
5924 CmdArgs.push_back(Args.MakeArgString(
5925 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005926 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005927 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005928 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005929 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005930 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005931 }
5932 }
5933
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005934 std::string Triple = getToolChain().getTripleString();
5935 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005936 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005937 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005938 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005939
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005940 Args.AddAllArgs(CmdArgs, options::OPT_L);
5941 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5942 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005943 Args.AddAllArgs(CmdArgs, options::OPT_s);
5944 Args.AddAllArgs(CmdArgs, options::OPT_t);
5945 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5946 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005947
Daniel Dunbar54423b22010-09-17 00:24:54 +00005948 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005949
5950 if (!Args.hasArg(options::OPT_nostdlib) &&
5951 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005952 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005953 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005954 if (Args.hasArg(options::OPT_pg))
5955 CmdArgs.push_back("-lm_p");
5956 else
5957 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005958 }
5959
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005960 // FIXME: For some reason GCC passes -lgcc before adding
5961 // the default system libraries. Just mimic this for now.
5962 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005963
Eric Christopher17674ec2012-09-13 06:32:34 +00005964 if (Args.hasArg(options::OPT_pthread)) {
5965 if (!Args.hasArg(options::OPT_shared) &&
5966 Args.hasArg(options::OPT_pg))
5967 CmdArgs.push_back("-lpthread_p");
5968 else
5969 CmdArgs.push_back("-lpthread");
5970 }
5971
Chandler Carruth45661652011-12-17 22:32:42 +00005972 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005973 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005974 CmdArgs.push_back("-lc_p");
5975 else
5976 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005977 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005978
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005979 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005980 }
5981
5982 if (!Args.hasArg(options::OPT_nostdlib) &&
5983 !Args.hasArg(options::OPT_nostartfiles)) {
5984 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005985 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005986 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005987 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005988 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005989 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005990 }
5991
5992 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005993 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005994 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005995}
Ed Schoutene33194b2009-04-02 19:13:12 +00005996
Eli Friedman9fa28852012-08-08 23:57:20 +00005997void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5998 const InputInfo &Output,
5999 const InputInfoList &Inputs,
6000 const ArgList &Args,
6001 const char *LinkingOutput) const {
6002 ArgStringList CmdArgs;
6003
6004 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6005 options::OPT_Xassembler);
6006
6007 CmdArgs.push_back("-o");
6008 CmdArgs.push_back(Output.getFilename());
6009
6010 for (InputInfoList::const_iterator
6011 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6012 const InputInfo &II = *it;
6013 CmdArgs.push_back(II.getFilename());
6014 }
6015
6016 const char *Exec =
6017 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6018 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6019}
6020
6021void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6022 const InputInfo &Output,
6023 const InputInfoList &Inputs,
6024 const ArgList &Args,
6025 const char *LinkingOutput) const {
6026 const Driver &D = getToolChain().getDriver();
6027 ArgStringList CmdArgs;
6028
6029 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6030 (!Args.hasArg(options::OPT_shared))) {
6031 CmdArgs.push_back("-e");
6032 CmdArgs.push_back("__start");
6033 }
6034
6035 if (Args.hasArg(options::OPT_static)) {
6036 CmdArgs.push_back("-Bstatic");
6037 } else {
6038 if (Args.hasArg(options::OPT_rdynamic))
6039 CmdArgs.push_back("-export-dynamic");
6040 CmdArgs.push_back("--eh-frame-hdr");
6041 CmdArgs.push_back("-Bdynamic");
6042 if (Args.hasArg(options::OPT_shared)) {
6043 CmdArgs.push_back("-shared");
6044 } else {
6045 CmdArgs.push_back("-dynamic-linker");
6046 CmdArgs.push_back("/usr/libexec/ld.so");
6047 }
6048 }
6049
6050 if (Output.isFilename()) {
6051 CmdArgs.push_back("-o");
6052 CmdArgs.push_back(Output.getFilename());
6053 } else {
6054 assert(Output.isNothing() && "Invalid output.");
6055 }
6056
6057 if (!Args.hasArg(options::OPT_nostdlib) &&
6058 !Args.hasArg(options::OPT_nostartfiles)) {
6059 if (!Args.hasArg(options::OPT_shared)) {
6060 if (Args.hasArg(options::OPT_pg))
6061 CmdArgs.push_back(Args.MakeArgString(
6062 getToolChain().GetFilePath("gcrt0.o")));
6063 else
6064 CmdArgs.push_back(Args.MakeArgString(
6065 getToolChain().GetFilePath("crt0.o")));
6066 CmdArgs.push_back(Args.MakeArgString(
6067 getToolChain().GetFilePath("crtbegin.o")));
6068 } else {
6069 CmdArgs.push_back(Args.MakeArgString(
6070 getToolChain().GetFilePath("crtbeginS.o")));
6071 }
6072 }
6073
6074 Args.AddAllArgs(CmdArgs, options::OPT_L);
6075 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6076 Args.AddAllArgs(CmdArgs, options::OPT_e);
6077
6078 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6079
6080 if (!Args.hasArg(options::OPT_nostdlib) &&
6081 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006082 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006083 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6084 if (Args.hasArg(options::OPT_pg))
6085 CmdArgs.push_back("-lm_p");
6086 else
6087 CmdArgs.push_back("-lm");
6088 }
6089
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006090 if (Args.hasArg(options::OPT_pthread)) {
6091 if (!Args.hasArg(options::OPT_shared) &&
6092 Args.hasArg(options::OPT_pg))
6093 CmdArgs.push_back("-lpthread_p");
6094 else
6095 CmdArgs.push_back("-lpthread");
6096 }
6097
Eli Friedman9fa28852012-08-08 23:57:20 +00006098 if (!Args.hasArg(options::OPT_shared)) {
6099 if (Args.hasArg(options::OPT_pg))
6100 CmdArgs.push_back("-lc_p");
6101 else
6102 CmdArgs.push_back("-lc");
6103 }
6104
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006105 StringRef MyArch;
6106 switch (getToolChain().getTriple().getArch()) {
6107 case llvm::Triple::arm:
6108 MyArch = "arm";
6109 break;
6110 case llvm::Triple::x86:
6111 MyArch = "i386";
6112 break;
6113 case llvm::Triple::x86_64:
6114 MyArch = "amd64";
6115 break;
6116 default:
6117 llvm_unreachable("Unsupported architecture");
6118 }
6119 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006120 }
6121
6122 if (!Args.hasArg(options::OPT_nostdlib) &&
6123 !Args.hasArg(options::OPT_nostartfiles)) {
6124 if (!Args.hasArg(options::OPT_shared))
6125 CmdArgs.push_back(Args.MakeArgString(
6126 getToolChain().GetFilePath("crtend.o")));
6127 else
6128 CmdArgs.push_back(Args.MakeArgString(
6129 getToolChain().GetFilePath("crtendS.o")));
6130 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006131
6132 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00006133 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006134 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006135}
6136
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006137void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006138 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006139 const InputInfoList &Inputs,
6140 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006141 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006142 ArgStringList CmdArgs;
6143
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006144 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6145 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006146 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006147 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006148 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006149 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006150 else if (getToolChain().getArch() == llvm::Triple::mips ||
6151 getToolChain().getArch() == llvm::Triple::mipsel ||
6152 getToolChain().getArch() == llvm::Triple::mips64 ||
6153 getToolChain().getArch() == llvm::Triple::mips64el) {
6154 StringRef CPUName;
6155 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006156 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006157
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006158 CmdArgs.push_back("-march");
6159 CmdArgs.push_back(CPUName.data());
6160
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006161 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006162 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006163
6164 if (getToolChain().getArch() == llvm::Triple::mips ||
6165 getToolChain().getArch() == llvm::Triple::mips64)
6166 CmdArgs.push_back("-EB");
6167 else
6168 CmdArgs.push_back("-EL");
6169
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006170 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006171 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006172 getToolChain().getArch() == llvm::Triple::armeb ||
6173 getToolChain().getArch() == llvm::Triple::thumb ||
6174 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006175 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006176 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006177 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6178
6179 if (FloatABI == "hard") {
6180 CmdArgs.push_back("-mfpu=vfp");
6181 } else {
6182 CmdArgs.push_back("-mfpu=softvfp");
6183 }
6184
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006185 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00006186 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006187 case llvm::Triple::GNUEABI:
6188 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00006189 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006190 break;
6191
6192 default:
6193 CmdArgs.push_back("-matpcs");
6194 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00006195 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00006196 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00006197 if (getToolChain().getArch() == llvm::Triple::sparc)
6198 CmdArgs.push_back("-Av8plusa");
6199 else
6200 CmdArgs.push_back("-Av9a");
6201
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006202 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006203 }
Eric Christopher0b26a612010-03-02 02:41:08 +00006204
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006205 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6206 options::OPT_Xassembler);
6207
6208 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006209 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006210
6211 for (InputInfoList::const_iterator
6212 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6213 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006214 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006215 }
6216
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006217 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006218 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006219 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006220}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006221
6222void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006223 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006224 const InputInfoList &Inputs,
6225 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006226 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00006227 const toolchains::FreeBSD& ToolChain =
6228 static_cast<const toolchains::FreeBSD&>(getToolChain());
6229 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006230 const bool IsPIE =
6231 !Args.hasArg(options::OPT_shared) &&
6232 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006233 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00006234
6235 // Silence warning for "clang -g foo.o -o foo"
6236 Args.ClaimAllArgs(options::OPT_g_Group);
6237 // and "clang -emit-llvm foo.o -o foo"
6238 Args.ClaimAllArgs(options::OPT_emit_llvm);
6239 // and for "clang -w foo.o -o foo". Other warning options are already
6240 // handled somewhere else.
6241 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006242
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006243 if (!D.SysRoot.empty())
6244 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6245
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006246 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006247 CmdArgs.push_back("-pie");
6248
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006249 if (Args.hasArg(options::OPT_static)) {
6250 CmdArgs.push_back("-Bstatic");
6251 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006252 if (Args.hasArg(options::OPT_rdynamic))
6253 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006254 CmdArgs.push_back("--eh-frame-hdr");
6255 if (Args.hasArg(options::OPT_shared)) {
6256 CmdArgs.push_back("-Bshareable");
6257 } else {
6258 CmdArgs.push_back("-dynamic-linker");
6259 CmdArgs.push_back("/libexec/ld-elf.so.1");
6260 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006261 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
6262 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00006263 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
6264 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
6265 CmdArgs.push_back("--hash-style=both");
6266 }
6267 }
6268 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006269 }
6270
6271 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6272 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006273 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006274 CmdArgs.push_back("-m");
6275 CmdArgs.push_back("elf_i386_fbsd");
6276 }
6277
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006278 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00006279 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00006280 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00006281 }
6282
Daniel Dunbarb440f562010-08-02 02:38:21 +00006283 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006284 CmdArgs.push_back("-o");
6285 CmdArgs.push_back(Output.getFilename());
6286 } else {
6287 assert(Output.isNothing() && "Invalid output.");
6288 }
6289
6290 if (!Args.hasArg(options::OPT_nostdlib) &&
6291 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00006292 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006293 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006294 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00006295 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006296 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006297 crt1 = "Scrt1.o";
6298 else
6299 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006300 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006301 if (crt1)
6302 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
6303
6304 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6305
6306 const char *crtbegin = NULL;
6307 if (Args.hasArg(options::OPT_static))
6308 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006309 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006310 crtbegin = "crtbeginS.o";
6311 else
6312 crtbegin = "crtbegin.o";
6313
6314 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006315 }
6316
6317 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00006318 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00006319 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6320 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006321 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006322 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6323 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00006324 Args.AddAllArgs(CmdArgs, options::OPT_s);
6325 Args.AddAllArgs(CmdArgs, options::OPT_t);
6326 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6327 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006328
Alp Tokerce365ca2013-12-02 12:43:03 +00006329 if (D.IsUsingLTO(Args))
6330 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00006331
Roman Divackyafe2f232012-08-28 15:09:03 +00006332 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006333
6334 if (!Args.hasArg(options::OPT_nostdlib) &&
6335 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006336 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00006337 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00006338 if (Args.hasArg(options::OPT_pg))
6339 CmdArgs.push_back("-lm_p");
6340 else
6341 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00006342 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006343 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
6344 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00006345 if (Args.hasArg(options::OPT_pg))
6346 CmdArgs.push_back("-lgcc_p");
6347 else
6348 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006349 if (Args.hasArg(options::OPT_static)) {
6350 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006351 } else if (Args.hasArg(options::OPT_pg)) {
6352 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006353 } else {
6354 CmdArgs.push_back("--as-needed");
6355 CmdArgs.push_back("-lgcc_s");
6356 CmdArgs.push_back("--no-as-needed");
6357 }
6358
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006359 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006360 if (Args.hasArg(options::OPT_pg))
6361 CmdArgs.push_back("-lpthread_p");
6362 else
6363 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006364 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006365
Roman Divacky66f22762011-02-10 16:59:40 +00006366 if (Args.hasArg(options::OPT_pg)) {
6367 if (Args.hasArg(options::OPT_shared))
6368 CmdArgs.push_back("-lc");
6369 else
6370 CmdArgs.push_back("-lc_p");
6371 CmdArgs.push_back("-lgcc_p");
6372 } else {
6373 CmdArgs.push_back("-lc");
6374 CmdArgs.push_back("-lgcc");
6375 }
6376
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006377 if (Args.hasArg(options::OPT_static)) {
6378 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006379 } else if (Args.hasArg(options::OPT_pg)) {
6380 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006381 } else {
6382 CmdArgs.push_back("--as-needed");
6383 CmdArgs.push_back("-lgcc_s");
6384 CmdArgs.push_back("--no-as-needed");
6385 }
6386 }
6387
6388 if (!Args.hasArg(options::OPT_nostdlib) &&
6389 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006390 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006391 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00006392 else
6393 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00006394 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006395 }
6396
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00006397 addSanitizerRuntimes(getToolChain(), Args, CmdArgs);
6398
Alexey Samsonov7811d192014-02-20 13:57:37 +00006399 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006400
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006401 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00006402 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006403 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006404}
Daniel Dunbarcc912342009-05-02 18:28:39 +00006405
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006406void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6407 const InputInfo &Output,
6408 const InputInfoList &Inputs,
6409 const ArgList &Args,
6410 const char *LinkingOutput) const {
6411 ArgStringList CmdArgs;
6412
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006413 // GNU as needs different flags for creating the correct output format
6414 // on architectures with different ABIs or optional feature sets.
6415 switch (getToolChain().getArch()) {
6416 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006417 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006418 break;
6419 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006420 case llvm::Triple::armeb:
6421 case llvm::Triple::thumb:
6422 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00006423 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006424 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006425 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006426 }
6427
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006428 case llvm::Triple::mips:
6429 case llvm::Triple::mipsel:
6430 case llvm::Triple::mips64:
6431 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006432 StringRef CPUName;
6433 StringRef ABIName;
6434 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6435
6436 CmdArgs.push_back("-march");
6437 CmdArgs.push_back(CPUName.data());
6438
6439 CmdArgs.push_back("-mabi");
6440 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6441
6442 if (getToolChain().getArch() == llvm::Triple::mips ||
6443 getToolChain().getArch() == llvm::Triple::mips64)
6444 CmdArgs.push_back("-EB");
6445 else
6446 CmdArgs.push_back("-EL");
6447
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006448 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006449 break;
6450 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006451
6452 case llvm::Triple::sparc:
6453 CmdArgs.push_back("-32");
6454 addAssemblerKPIC(Args, CmdArgs);
6455 break;
6456
6457 case llvm::Triple::sparcv9:
6458 CmdArgs.push_back("-64");
6459 CmdArgs.push_back("-Av9");
6460 addAssemblerKPIC(Args, CmdArgs);
6461 break;
6462
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006463 default:
6464 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006465 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006466
6467 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6468 options::OPT_Xassembler);
6469
6470 CmdArgs.push_back("-o");
6471 CmdArgs.push_back(Output.getFilename());
6472
6473 for (InputInfoList::const_iterator
6474 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6475 const InputInfo &II = *it;
6476 CmdArgs.push_back(II.getFilename());
6477 }
6478
David Chisnallddbd68f2011-09-27 22:03:18 +00006479 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006480 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6481}
6482
6483void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6484 const InputInfo &Output,
6485 const InputInfoList &Inputs,
6486 const ArgList &Args,
6487 const char *LinkingOutput) const {
6488 const Driver &D = getToolChain().getDriver();
6489 ArgStringList CmdArgs;
6490
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006491 if (!D.SysRoot.empty())
6492 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6493
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00006494 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006495 if (Args.hasArg(options::OPT_static)) {
6496 CmdArgs.push_back("-Bstatic");
6497 } else {
6498 if (Args.hasArg(options::OPT_rdynamic))
6499 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006500 if (Args.hasArg(options::OPT_shared)) {
6501 CmdArgs.push_back("-Bshareable");
6502 } else {
6503 CmdArgs.push_back("-dynamic-linker");
6504 CmdArgs.push_back("/libexec/ld.elf_so");
6505 }
6506 }
6507
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006508 // Many NetBSD architectures support more than one ABI.
6509 // Determine the correct emulation for ld.
6510 switch (getToolChain().getArch()) {
6511 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006512 CmdArgs.push_back("-m");
6513 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006514 break;
6515 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006516 case llvm::Triple::armeb:
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006517 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006518 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006519 CmdArgs.push_back("-m");
6520 switch (getToolChain().getTriple().getEnvironment()) {
6521 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006522 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006523 CmdArgs.push_back("armelf_nbsd_eabi");
6524 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00006525 case llvm::Triple::EABIHF:
6526 case llvm::Triple::GNUEABIHF:
6527 CmdArgs.push_back("armelf_nbsd_eabihf");
6528 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006529 default:
6530 CmdArgs.push_back("armelf_nbsd");
6531 break;
6532 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006533 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006534 case llvm::Triple::mips64:
6535 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006536 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006537 CmdArgs.push_back("-m");
6538 if (getToolChain().getArch() == llvm::Triple::mips64)
6539 CmdArgs.push_back("elf32btsmip");
6540 else
6541 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006542 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006543 CmdArgs.push_back("-m");
6544 if (getToolChain().getArch() == llvm::Triple::mips64)
6545 CmdArgs.push_back("elf64btsmip");
6546 else
6547 CmdArgs.push_back("elf64ltsmip");
6548 }
6549 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006550
6551 case llvm::Triple::sparc:
6552 CmdArgs.push_back("-m");
6553 CmdArgs.push_back("elf32_sparc");
6554 break;
6555
6556 case llvm::Triple::sparcv9:
6557 CmdArgs.push_back("-m");
6558 CmdArgs.push_back("elf64_sparc");
6559 break;
6560
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006561 default:
6562 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006563 }
6564
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006565 if (Output.isFilename()) {
6566 CmdArgs.push_back("-o");
6567 CmdArgs.push_back(Output.getFilename());
6568 } else {
6569 assert(Output.isNothing() && "Invalid output.");
6570 }
6571
6572 if (!Args.hasArg(options::OPT_nostdlib) &&
6573 !Args.hasArg(options::OPT_nostartfiles)) {
6574 if (!Args.hasArg(options::OPT_shared)) {
6575 CmdArgs.push_back(Args.MakeArgString(
6576 getToolChain().GetFilePath("crt0.o")));
6577 CmdArgs.push_back(Args.MakeArgString(
6578 getToolChain().GetFilePath("crti.o")));
6579 CmdArgs.push_back(Args.MakeArgString(
6580 getToolChain().GetFilePath("crtbegin.o")));
6581 } else {
6582 CmdArgs.push_back(Args.MakeArgString(
6583 getToolChain().GetFilePath("crti.o")));
6584 CmdArgs.push_back(Args.MakeArgString(
6585 getToolChain().GetFilePath("crtbeginS.o")));
6586 }
6587 }
6588
6589 Args.AddAllArgs(CmdArgs, options::OPT_L);
6590 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6591 Args.AddAllArgs(CmdArgs, options::OPT_e);
6592 Args.AddAllArgs(CmdArgs, options::OPT_s);
6593 Args.AddAllArgs(CmdArgs, options::OPT_t);
6594 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6595 Args.AddAllArgs(CmdArgs, options::OPT_r);
6596
6597 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6598
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006599 unsigned Major, Minor, Micro;
6600 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
6601 bool useLibgcc = true;
6602 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006603 switch(getToolChain().getArch()) {
6604 case llvm::Triple::x86:
6605 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006606 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006607 break;
6608 default:
6609 break;
6610 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006611 }
6612
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006613 if (!Args.hasArg(options::OPT_nostdlib) &&
6614 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006615 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006616 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6617 CmdArgs.push_back("-lm");
6618 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006619 if (Args.hasArg(options::OPT_pthread))
6620 CmdArgs.push_back("-lpthread");
6621 CmdArgs.push_back("-lc");
6622
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006623 if (useLibgcc) {
6624 if (Args.hasArg(options::OPT_static)) {
6625 // libgcc_eh depends on libc, so resolve as much as possible,
6626 // pull in any new requirements from libc and then get the rest
6627 // of libgcc.
6628 CmdArgs.push_back("-lgcc_eh");
6629 CmdArgs.push_back("-lc");
6630 CmdArgs.push_back("-lgcc");
6631 } else {
6632 CmdArgs.push_back("-lgcc");
6633 CmdArgs.push_back("--as-needed");
6634 CmdArgs.push_back("-lgcc_s");
6635 CmdArgs.push_back("--no-as-needed");
6636 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006637 }
6638 }
6639
6640 if (!Args.hasArg(options::OPT_nostdlib) &&
6641 !Args.hasArg(options::OPT_nostartfiles)) {
6642 if (!Args.hasArg(options::OPT_shared))
6643 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6644 "crtend.o")));
6645 else
6646 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6647 "crtendS.o")));
6648 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6649 "crtn.o")));
6650 }
6651
Alexey Samsonov7811d192014-02-20 13:57:37 +00006652 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006653
Rafael Espindola236db462013-11-09 20:07:19 +00006654 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006655 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6656}
6657
Thomas Schwinge4e555262013-03-28 19:04:25 +00006658void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6659 const InputInfo &Output,
6660 const InputInfoList &Inputs,
6661 const ArgList &Args,
6662 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00006663 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006664 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00006665
6666 // Add --32/--64 to make sure we get the format we want.
6667 // This is incomplete
6668 if (getToolChain().getArch() == llvm::Triple::x86) {
6669 CmdArgs.push_back("--32");
6670 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
6671 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00006672 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
6673 CmdArgs.push_back("-a32");
6674 CmdArgs.push_back("-mppc");
6675 CmdArgs.push_back("-many");
6676 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
6677 CmdArgs.push_back("-a64");
6678 CmdArgs.push_back("-mppc64");
6679 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00006680 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
6681 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00006682 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00006683 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00006684 CmdArgs.push_back("-mlittle-endian");
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00006685 } else if (getToolChain().getArch() == llvm::Triple::sparc) {
6686 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00006687 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006688 NeedsKPIC = true;
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00006689 } else if (getToolChain().getArch() == llvm::Triple::sparcv9) {
6690 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00006691 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006692 NeedsKPIC = true;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006693 } else if (getToolChain().getArch() == llvm::Triple::arm ||
6694 getToolChain().getArch() == llvm::Triple::armeb) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006695 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00006696 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
6697 CmdArgs.push_back("-mfpu=neon");
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006698 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a" ||
6699 MArch == "armebv8" || MArch == "armebv8a" || MArch == "armebv8-a")
Bernard Ogdena58ef052013-10-24 18:32:41 +00006700 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006701
Tim Northover9c7e0352013-12-12 11:55:52 +00006702 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
6703 getToolChain().getDriver(), Args, getToolChain().getTriple());
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006704 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006705
6706 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00006707
6708 // FIXME: remove krait check when GNU tools support krait cpu
6709 // for now replace it with -march=armv7-a to avoid a lower
6710 // march from being picked in the absence of a cpu flag.
6711 Arg *A;
6712 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
6713 StringRef(A->getValue()) == "krait")
6714 CmdArgs.push_back("-march=armv7-a");
6715 else
6716 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006717 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006718 } else if (getToolChain().getArch() == llvm::Triple::mips ||
6719 getToolChain().getArch() == llvm::Triple::mipsel ||
6720 getToolChain().getArch() == llvm::Triple::mips64 ||
6721 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006722 StringRef CPUName;
6723 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006724 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006725
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006726 CmdArgs.push_back("-march");
6727 CmdArgs.push_back(CPUName.data());
6728
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006729 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006730 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00006731
6732 if (getToolChain().getArch() == llvm::Triple::mips ||
6733 getToolChain().getArch() == llvm::Triple::mips64)
6734 CmdArgs.push_back("-EB");
6735 else
6736 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006737
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006738 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6739 if (StringRef(A->getValue()) == "2008")
6740 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6741 }
6742
Simon Atanasyan8cc7c122013-11-26 11:57:58 +00006743 Args.AddLastArg(CmdArgs, options::OPT_mfp32, options::OPT_mfp64);
Simon Atanasyan036d16d2013-04-30 07:47:13 +00006744 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6745 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6746 options::OPT_mno_micromips);
6747 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6748 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6749
Simon Atanasyanbd986632013-11-26 11:58:04 +00006750 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
6751 // Do not use AddLastArg because not all versions of MIPS assembler
6752 // support -mmsa / -mno-msa options.
6753 if (A->getOption().matches(options::OPT_mmsa))
6754 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
6755 }
6756
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006757 NeedsKPIC = true;
6758 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
6759 // Always pass an -march option, since our default of z10 is later
6760 // than the GNU assembler's default.
6761 StringRef CPUName = getSystemZTargetCPU(Args);
6762 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
6763 }
6764
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006765 if (NeedsKPIC)
6766 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00006767
6768 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6769 options::OPT_Xassembler);
6770
6771 CmdArgs.push_back("-o");
6772 CmdArgs.push_back(Output.getFilename());
6773
6774 for (InputInfoList::const_iterator
6775 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6776 const InputInfo &II = *it;
6777 CmdArgs.push_back(II.getFilename());
6778 }
6779
6780 const char *Exec =
6781 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6782 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00006783
6784 // Handle the debug info splitting at object creation time if we're
6785 // creating an object.
6786 // TODO: Currently only works on linux with newer objcopy.
6787 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006788 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00006789 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6790 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00006791}
6792
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006793static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006794 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00006795 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00006796 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6797 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00006798 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006799 CmdArgs.push_back("-lgcc");
6800
Logan Chien3d3373c2012-11-19 12:04:11 +00006801 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006802 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006803 CmdArgs.push_back("-lgcc");
6804 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00006805 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006806 CmdArgs.push_back("--as-needed");
6807 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00006808 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006809 CmdArgs.push_back("--no-as-needed");
6810 }
6811
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006812 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00006813 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00006814 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006815 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00006816
6817 // According to Android ABI, we have to link with libdl if we are
6818 // linking with non-static libgcc.
6819 //
6820 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6821 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6822 if (isAndroid && !StaticLibgcc)
6823 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00006824}
6825
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006826static StringRef getLinuxDynamicLinker(const ArgList &Args,
6827 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00006828 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
6829 if (ToolChain.getTriple().isArch64Bit())
6830 return "/system/bin/linker64";
6831 else
6832 return "/system/bin/linker";
6833 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
6834 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006835 return "/lib/ld-linux.so.2";
Tim Northovera2ee4332014-03-29 15:09:45 +00006836 else if (ToolChain.getArch() == llvm::Triple::aarch64 ||
6837 ToolChain.getArch() == llvm::Triple::arm64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006838 return "/lib/ld-linux-aarch64.so.1";
Christian Pirkera74c7912014-03-14 12:15:45 +00006839 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
6840 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006841 else if (ToolChain.getArch() == llvm::Triple::arm ||
6842 ToolChain.getArch() == llvm::Triple::thumb) {
6843 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6844 return "/lib/ld-linux-armhf.so.3";
6845 else
6846 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006847 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
6848 ToolChain.getArch() == llvm::Triple::thumbeb) {
6849 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6850 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
6851 else
6852 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006853 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6854 ToolChain.getArch() == llvm::Triple::mipsel)
6855 return "/lib/ld.so.1";
6856 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6857 ToolChain.getArch() == llvm::Triple::mips64el) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006858 if (mips::hasMipsAbiArg(Args, "n32"))
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006859 return "/lib32/ld.so.1";
6860 else
6861 return "/lib64/ld.so.1";
6862 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6863 return "/lib/ld.so.1";
6864 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
Bill Schmidt778d3872013-07-26 01:36:11 +00006865 ToolChain.getArch() == llvm::Triple::ppc64le ||
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006866 ToolChain.getArch() == llvm::Triple::systemz)
6867 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00006868 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
6869 return "/lib64/ld-linux.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006870 else
6871 return "/lib64/ld-linux-x86-64.so.2";
6872}
6873
Renato Golinc4b49242014-02-13 10:01:16 +00006874static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
6875 ArgStringList &CmdArgs, const ArgList &Args) {
6876 // Make use of compiler-rt if --rtlib option is used
6877 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
6878
6879 switch(RLT) {
6880 case ToolChain::RLT_CompilerRT:
6881 addClangRTLinux(TC, Args, CmdArgs);
6882 break;
6883 case ToolChain::RLT_Libgcc:
6884 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
6885 break;
Renato Golinc4b49242014-02-13 10:01:16 +00006886 }
6887}
6888
Thomas Schwinge4e555262013-03-28 19:04:25 +00006889void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6890 const InputInfo &Output,
6891 const InputInfoList &Inputs,
6892 const ArgList &Args,
6893 const char *LinkingOutput) const {
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006894 const toolchains::Linux& ToolChain =
6895 static_cast<const toolchains::Linux&>(getToolChain());
6896 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00006897 const bool isAndroid =
6898 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006899 const bool IsPIE =
6900 !Args.hasArg(options::OPT_shared) &&
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006901 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006902
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006903 ArgStringList CmdArgs;
6904
Rafael Espindolad1002f62010-11-15 18:28:16 +00006905 // Silence warning for "clang -g foo.o -o foo"
6906 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006907 // and "clang -emit-llvm foo.o -o foo"
6908 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00006909 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00006910 // handled somewhere else.
6911 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00006912
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006913 if (!D.SysRoot.empty())
6914 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006915
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006916 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00006917 CmdArgs.push_back("-pie");
6918
Rafael Espindola1c76c592010-11-07 22:57:16 +00006919 if (Args.hasArg(options::OPT_rdynamic))
6920 CmdArgs.push_back("-export-dynamic");
6921
Rafael Espindola34d77dc2010-11-11 19:34:42 +00006922 if (Args.hasArg(options::OPT_s))
6923 CmdArgs.push_back("-s");
6924
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006925 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6926 e = ToolChain.ExtraOpts.end();
6927 i != e; ++i)
6928 CmdArgs.push_back(i->c_str());
6929
6930 if (!Args.hasArg(options::OPT_static)) {
6931 CmdArgs.push_back("--eh-frame-hdr");
6932 }
6933
6934 CmdArgs.push_back("-m");
6935 if (ToolChain.getArch() == llvm::Triple::x86)
6936 CmdArgs.push_back("elf_i386");
Tim Northovera2ee4332014-03-29 15:09:45 +00006937 else if (ToolChain.getArch() == llvm::Triple::aarch64 ||
6938 ToolChain.getArch() == llvm::Triple::arm64)
Tim Northover9bb857a2013-01-31 12:13:10 +00006939 CmdArgs.push_back("aarch64linux");
Christian Pirkera74c7912014-03-14 12:15:45 +00006940 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
6941 CmdArgs.push_back("aarch64_be_linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00006942 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00006943 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006944 CmdArgs.push_back("armelf_linux_eabi");
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006945 else if (ToolChain.getArch() == llvm::Triple::armeb
6946 || ToolChain.getArch() == llvm::Triple::thumbeb)
6947 CmdArgs.push_back("armebelf_linux_eabi"); /* TODO: check which NAME. */
Ted Kremenek43d47cc2011-04-05 22:04:27 +00006948 else if (ToolChain.getArch() == llvm::Triple::ppc)
6949 CmdArgs.push_back("elf32ppclinux");
6950 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6951 CmdArgs.push_back("elf64ppc");
Will Schmidtc1fc1902014-03-24 17:10:37 +00006952 else if (ToolChain.getArch() == llvm::Triple::ppc64le)
6953 CmdArgs.push_back("elf64lppc");
Jakob Stoklund Olesen91a8e032014-01-10 03:51:33 +00006954 else if (ToolChain.getArch() == llvm::Triple::sparc)
6955 CmdArgs.push_back("elf32_sparc");
6956 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
6957 CmdArgs.push_back("elf64_sparc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00006958 else if (ToolChain.getArch() == llvm::Triple::mips)
6959 CmdArgs.push_back("elf32btsmip");
6960 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6961 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006962 else if (ToolChain.getArch() == llvm::Triple::mips64) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006963 if (mips::hasMipsAbiArg(Args, "n32"))
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006964 CmdArgs.push_back("elf32btsmipn32");
6965 else
6966 CmdArgs.push_back("elf64btsmip");
6967 }
6968 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006969 if (mips::hasMipsAbiArg(Args, "n32"))
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006970 CmdArgs.push_back("elf32ltsmipn32");
6971 else
6972 CmdArgs.push_back("elf64ltsmip");
6973 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006974 else if (ToolChain.getArch() == llvm::Triple::systemz)
6975 CmdArgs.push_back("elf64_s390");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006976 else
6977 CmdArgs.push_back("elf_x86_64");
6978
6979 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00006980 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006981 ToolChain.getArch() == llvm::Triple::armeb ||
6982 ToolChain.getArch() == llvm::Triple::thumb ||
6983 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006984 CmdArgs.push_back("-Bstatic");
6985 else
6986 CmdArgs.push_back("-static");
6987 } else if (Args.hasArg(options::OPT_shared)) {
6988 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00006989 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006990 CmdArgs.push_back("-Bsymbolic");
6991 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006992 }
6993
6994 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006995 ToolChain.getArch() == llvm::Triple::armeb ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00006996 ToolChain.getArch() == llvm::Triple::thumb ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006997 ToolChain.getArch() == llvm::Triple::thumbeb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006998 (!Args.hasArg(options::OPT_static) &&
6999 !Args.hasArg(options::OPT_shared))) {
7000 CmdArgs.push_back("-dynamic-linker");
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007001 CmdArgs.push_back(Args.MakeArgString(
7002 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007003 }
7004
7005 CmdArgs.push_back("-o");
7006 CmdArgs.push_back(Output.getFilename());
7007
Rafael Espindola81937ec2010-12-01 01:52:43 +00007008 if (!Args.hasArg(options::OPT_nostdlib) &&
7009 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007010 if (!isAndroid) {
7011 const char *crt1 = NULL;
7012 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007013 if (Args.hasArg(options::OPT_pg))
7014 crt1 = "gcrt1.o";
7015 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007016 crt1 = "Scrt1.o";
7017 else
7018 crt1 = "crt1.o";
7019 }
7020 if (crt1)
7021 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007022
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007023 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7024 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007025
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007026 const char *crtbegin;
7027 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007028 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007029 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007030 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007031 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007032 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007033 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007034 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007035 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00007036
7037 // Add crtfastmath.o if available and fast math is enabled.
7038 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007039 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007040
7041 Args.AddAllArgs(CmdArgs, options::OPT_L);
7042
7043 const ToolChain::path_list Paths = ToolChain.getFilePaths();
7044
Roman Divackyee8188a2011-03-01 17:53:14 +00007045 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
7046 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00007047 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007048
Alp Tokerce365ca2013-12-02 12:43:03 +00007049 if (D.IsUsingLTO(Args))
7050 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00007051
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00007052 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7053 CmdArgs.push_back("--no-demangle");
7054
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007055 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7056
Alexey Samsonovce8ab102014-02-25 12:43:43 +00007057 addSanitizerRuntimes(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007058 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00007059 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007060
Hans Wennborg70850d82013-07-18 20:29:38 +00007061 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00007062 !Args.hasArg(options::OPT_nostdlib) &&
7063 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00007064 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7065 !Args.hasArg(options::OPT_static);
7066 if (OnlyLibstdcxxStatic)
7067 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007068 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00007069 if (OnlyLibstdcxxStatic)
7070 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007071 CmdArgs.push_back("-lm");
7072 }
7073
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007074 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00007075 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7076 if (Args.hasArg(options::OPT_static))
7077 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00007078
Alexey Bataev186b28a2014-03-06 05:43:53 +00007079 LibOpenMP UsedOpenMPLib = LibUnknown;
7080 if (Args.hasArg(options::OPT_fopenmp)) {
7081 UsedOpenMPLib = LibGOMP;
7082 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7083 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7084 .Case("libgomp", LibGOMP)
7085 .Case("libiomp5", LibIOMP5)
7086 .Default(LibUnknown);
7087 if (UsedOpenMPLib == LibUnknown)
7088 D.Diag(diag::err_drv_unsupported_option_argument)
7089 << A->getOption().getName() << A->getValue();
7090 }
7091 switch (UsedOpenMPLib) {
7092 case LibGOMP:
Chandler Carruth01538002013-01-17 13:19:29 +00007093 CmdArgs.push_back("-lgomp");
7094
Alp Tokerf6a24ce2013-12-05 16:25:25 +00007095 // FIXME: Exclude this for platforms with libgomp that don't require
7096 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00007097 CmdArgs.push_back("-lrt");
Alexey Bataev186b28a2014-03-06 05:43:53 +00007098 break;
7099 case LibIOMP5:
7100 CmdArgs.push_back("-liomp5");
7101 break;
7102 case LibUnknown:
7103 break;
Chandler Carruth01538002013-01-17 13:19:29 +00007104 }
Renato Golinc4b49242014-02-13 10:01:16 +00007105 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007106
Chandler Carruth94a32012012-05-14 18:31:18 +00007107 if (Args.hasArg(options::OPT_pthread) ||
Alexey Bataev648250a2014-03-07 07:43:52 +00007108 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown)
Chandler Carruth94a32012012-05-14 18:31:18 +00007109 CmdArgs.push_back("-lpthread");
7110
7111 CmdArgs.push_back("-lc");
7112
7113 if (Args.hasArg(options::OPT_static))
7114 CmdArgs.push_back("--end-group");
7115 else
Renato Golinc4b49242014-02-13 10:01:16 +00007116 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00007117 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00007118
Rafael Espindola81937ec2010-12-01 01:52:43 +00007119 if (!Args.hasArg(options::OPT_nostartfiles)) {
7120 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007121 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007122 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007123 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007124 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00007125 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007126 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007127
Rafael Espindola81937ec2010-12-01 01:52:43 +00007128 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007129 if (!isAndroid)
7130 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00007131 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007132 }
7133
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007134 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
7135}
Rafael Espindola92b00932010-08-10 00:25:48 +00007136
Chris Lattner3e2ee142010-07-07 16:01:42 +00007137void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007138 const InputInfo &Output,
7139 const InputInfoList &Inputs,
7140 const ArgList &Args,
7141 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007142 ArgStringList CmdArgs;
7143
7144 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7145 options::OPT_Xassembler);
7146
7147 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007148 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007149
7150 for (InputInfoList::const_iterator
7151 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7152 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00007153 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007154 }
7155
7156 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00007157 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007158 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007159}
7160
7161void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007162 const InputInfo &Output,
7163 const InputInfoList &Inputs,
7164 const ArgList &Args,
7165 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007166 const Driver &D = getToolChain().getDriver();
7167 ArgStringList CmdArgs;
7168
Daniel Dunbarb440f562010-08-02 02:38:21 +00007169 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007170 CmdArgs.push_back("-o");
7171 CmdArgs.push_back(Output.getFilename());
7172 } else {
7173 assert(Output.isNothing() && "Invalid output.");
7174 }
7175
7176 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00007177 !Args.hasArg(options::OPT_nostartfiles)) {
7178 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7179 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7180 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
7181 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
7182 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007183
7184 Args.AddAllArgs(CmdArgs, options::OPT_L);
7185 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7186 Args.AddAllArgs(CmdArgs, options::OPT_e);
7187
Daniel Dunbar54423b22010-09-17 00:24:54 +00007188 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007189
Alexey Samsonov7811d192014-02-20 13:57:37 +00007190 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00007191
Chris Lattner3e2ee142010-07-07 16:01:42 +00007192 if (!Args.hasArg(options::OPT_nostdlib) &&
7193 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007194 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007195 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007196 CmdArgs.push_back("-lm");
7197 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007198 }
7199
7200 if (!Args.hasArg(options::OPT_nostdlib) &&
7201 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00007202 if (Args.hasArg(options::OPT_pthread))
7203 CmdArgs.push_back("-lpthread");
7204 CmdArgs.push_back("-lc");
7205 CmdArgs.push_back("-lCompilerRT-Generic");
7206 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
7207 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00007208 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007209 }
7210
Rafael Espindola236db462013-11-09 20:07:19 +00007211 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007212 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007213}
7214
Daniel Dunbarcc912342009-05-02 18:28:39 +00007215/// DragonFly Tools
7216
7217// For now, DragonFly Assemble does just about the same as for
7218// FreeBSD, but this may change soon.
7219void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007220 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007221 const InputInfoList &Inputs,
7222 const ArgList &Args,
7223 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007224 ArgStringList CmdArgs;
7225
7226 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7227 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007228 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00007229 CmdArgs.push_back("--32");
7230
7231 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7232 options::OPT_Xassembler);
7233
7234 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007235 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007236
7237 for (InputInfoList::const_iterator
7238 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7239 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00007240 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007241 }
7242
7243 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00007244 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007245 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007246}
7247
7248void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007249 const InputInfo &Output,
7250 const InputInfoList &Inputs,
7251 const ArgList &Args,
7252 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00007253 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00007254 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00007255 ArgStringList CmdArgs;
7256
John McCall65b8da02013-04-11 22:55:55 +00007257 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
7258 UseGCC47 = false;
7259
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007260 if (!D.SysRoot.empty())
7261 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7262
John McCall65b8da02013-04-11 22:55:55 +00007263 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007264 if (Args.hasArg(options::OPT_static)) {
7265 CmdArgs.push_back("-Bstatic");
7266 } else {
John McCall65b8da02013-04-11 22:55:55 +00007267 if (Args.hasArg(options::OPT_rdynamic))
7268 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007269 if (Args.hasArg(options::OPT_shared))
7270 CmdArgs.push_back("-Bshareable");
7271 else {
7272 CmdArgs.push_back("-dynamic-linker");
7273 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
7274 }
John McCall65b8da02013-04-11 22:55:55 +00007275 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007276 }
7277
7278 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7279 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007280 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007281 CmdArgs.push_back("-m");
7282 CmdArgs.push_back("elf_i386");
7283 }
7284
Daniel Dunbarb440f562010-08-02 02:38:21 +00007285 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007286 CmdArgs.push_back("-o");
7287 CmdArgs.push_back(Output.getFilename());
7288 } else {
7289 assert(Output.isNothing() && "Invalid output.");
7290 }
7291
7292 if (!Args.hasArg(options::OPT_nostdlib) &&
7293 !Args.hasArg(options::OPT_nostartfiles)) {
7294 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00007295 if (Args.hasArg(options::OPT_pg))
7296 CmdArgs.push_back(Args.MakeArgString(
7297 getToolChain().GetFilePath("gcrt1.o")));
7298 else {
7299 if (Args.hasArg(options::OPT_pie))
7300 CmdArgs.push_back(Args.MakeArgString(
7301 getToolChain().GetFilePath("Scrt1.o")));
7302 else
7303 CmdArgs.push_back(Args.MakeArgString(
7304 getToolChain().GetFilePath("crt1.o")));
7305 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007306 }
John McCall65b8da02013-04-11 22:55:55 +00007307 CmdArgs.push_back(Args.MakeArgString(
7308 getToolChain().GetFilePath("crti.o")));
7309 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
7310 CmdArgs.push_back(Args.MakeArgString(
7311 getToolChain().GetFilePath("crtbeginS.o")));
7312 else
7313 CmdArgs.push_back(Args.MakeArgString(
7314 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007315 }
7316
7317 Args.AddAllArgs(CmdArgs, options::OPT_L);
7318 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7319 Args.AddAllArgs(CmdArgs, options::OPT_e);
7320
Daniel Dunbar54423b22010-09-17 00:24:54 +00007321 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007322
7323 if (!Args.hasArg(options::OPT_nostdlib) &&
7324 !Args.hasArg(options::OPT_nodefaultlibs)) {
7325 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
7326 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00007327 if (UseGCC47)
7328 CmdArgs.push_back("-L/usr/lib/gcc47");
7329 else
7330 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007331
7332 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00007333 if (UseGCC47) {
7334 CmdArgs.push_back("-rpath");
7335 CmdArgs.push_back("/usr/lib/gcc47");
7336 } else {
7337 CmdArgs.push_back("-rpath");
7338 CmdArgs.push_back("/usr/lib/gcc44");
7339 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007340 }
7341
Hans Wennborg70850d82013-07-18 20:29:38 +00007342 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007343 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00007344 CmdArgs.push_back("-lm");
7345 }
7346
Daniel Dunbarcc912342009-05-02 18:28:39 +00007347 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00007348 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007349
7350 if (!Args.hasArg(options::OPT_nolibc)) {
7351 CmdArgs.push_back("-lc");
7352 }
7353
John McCall65b8da02013-04-11 22:55:55 +00007354 if (UseGCC47) {
7355 if (Args.hasArg(options::OPT_static) ||
7356 Args.hasArg(options::OPT_static_libgcc)) {
7357 CmdArgs.push_back("-lgcc");
7358 CmdArgs.push_back("-lgcc_eh");
7359 } else {
7360 if (Args.hasArg(options::OPT_shared_libgcc)) {
7361 CmdArgs.push_back("-lgcc_pic");
7362 if (!Args.hasArg(options::OPT_shared))
7363 CmdArgs.push_back("-lgcc");
7364 } else {
7365 CmdArgs.push_back("-lgcc");
7366 CmdArgs.push_back("--as-needed");
7367 CmdArgs.push_back("-lgcc_pic");
7368 CmdArgs.push_back("--no-as-needed");
7369 }
7370 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007371 } else {
John McCall65b8da02013-04-11 22:55:55 +00007372 if (Args.hasArg(options::OPT_shared)) {
7373 CmdArgs.push_back("-lgcc_pic");
7374 } else {
7375 CmdArgs.push_back("-lgcc");
7376 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007377 }
7378 }
7379
7380 if (!Args.hasArg(options::OPT_nostdlib) &&
7381 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00007382 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00007383 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00007384 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00007385 else
7386 CmdArgs.push_back(Args.MakeArgString(
7387 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007388 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00007389 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007390 }
7391
Alexey Samsonov7811d192014-02-20 13:57:37 +00007392 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007393
Daniel Dunbarcc912342009-05-02 18:28:39 +00007394 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00007395 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007396 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007397}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007398
7399void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
7400 const InputInfo &Output,
7401 const InputInfoList &Inputs,
7402 const ArgList &Args,
7403 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007404 ArgStringList CmdArgs;
7405
7406 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00007407 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
7408 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007409 } else {
7410 assert(Output.isNothing() && "Invalid output.");
7411 }
7412
7413 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg32e3b722013-08-09 17:38:42 +00007414 !Args.hasArg(options::OPT_nostartfiles) &&
7415 !C.getDriver().IsCLMode()) {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007416 CmdArgs.push_back("-defaultlib:libcmt");
7417 }
7418
7419 CmdArgs.push_back("-nologo");
7420
Hans Wennborgf1a74252013-09-10 20:18:04 +00007421 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
7422
7423 if (DLL) {
7424 CmdArgs.push_back(Args.MakeArgString("-dll"));
7425
7426 SmallString<128> ImplibName(Output.getFilename());
7427 llvm::sys::path::replace_extension(ImplibName, "lib");
7428 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
7429 ImplibName.str()));
7430 }
7431
Peter Collingbourne32701642013-11-01 18:16:25 +00007432 if (getToolChain().getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00007433 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00007434 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborg65f17522013-08-27 18:10:21 +00007435 SmallString<128> LibSanitizer(getToolChain().getDriver().ResourceDir);
Hans Wennborgf1a74252013-09-10 20:18:04 +00007436 llvm::sys::path::append(LibSanitizer, "lib", "windows");
7437 if (DLL) {
Timur Iskhodzhanov3b6adcb62013-09-11 11:45:31 +00007438 llvm::sys::path::append(LibSanitizer, "clang_rt.asan_dll_thunk-i386.lib");
Hans Wennborgf1a74252013-09-10 20:18:04 +00007439 } else {
7440 llvm::sys::path::append(LibSanitizer, "clang_rt.asan-i386.lib");
7441 }
7442 // FIXME: Handle 64-bit.
Hans Wennborg65f17522013-08-27 18:10:21 +00007443 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
7444 }
7445
Michael J. Spencere2f49362012-06-18 16:56:04 +00007446 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg2e274592013-08-13 23:38:57 +00007447 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00007448
7449 // Add filenames immediately.
7450 for (InputInfoList::const_iterator
7451 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7452 if (it->isFilename())
7453 CmdArgs.push_back(it->getFilename());
Hans Wennborgbe4a6762013-08-14 01:24:35 +00007454 else
7455 it->getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencere2f49362012-06-18 16:56:04 +00007456 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007457
7458 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00007459 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007460 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7461}
Hans Wennborg87cfa712013-09-19 20:32:16 +00007462
7463void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
7464 const InputInfo &Output,
7465 const InputInfoList &Inputs,
7466 const ArgList &Args,
7467 const char *LinkingOutput) const {
7468 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
7469}
7470
Hans Wennborg188382e2013-09-20 18:16:35 +00007471// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
7472// If one cannot be found, return FallbackName.
7473// We do this special search to prevent clang-cl from falling back onto itself
7474// if it's available as cl.exe on the path.
7475static std::string FindFallback(const char *FallbackName,
7476 const char *ClangProgramPath) {
7477 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
7478 if (!OptPath.hasValue())
7479 return FallbackName;
7480
7481#ifdef LLVM_ON_WIN32
7482 const StringRef PathSeparators = ";";
7483#else
7484 const StringRef PathSeparators = ":";
7485#endif
7486
7487 SmallVector<StringRef, 8> PathSegments;
7488 llvm::SplitString(OptPath.getValue(), PathSegments, PathSeparators);
7489
7490 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
7491 const StringRef &PathSegment = PathSegments[i];
7492 if (PathSegment.empty())
7493 continue;
7494
7495 SmallString<128> FilePath(PathSegment);
7496 llvm::sys::path::append(FilePath, FallbackName);
7497 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
7498 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
7499 return FilePath.str();
7500 }
7501
7502 return FallbackName;
7503}
7504
Hans Wennborg87cfa712013-09-19 20:32:16 +00007505Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
7506 const InputInfo &Output,
7507 const InputInfoList &Inputs,
7508 const ArgList &Args,
7509 const char *LinkingOutput) const {
7510 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00007511 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007512 CmdArgs.push_back("/c"); // Compile only.
7513 CmdArgs.push_back("/W0"); // No warnings.
7514
7515 // The goal is to be able to invoke this tool correctly based on
7516 // any flag accepted by clang-cl.
7517
7518 // These are spelled the same way in clang and cl.exe,.
7519 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
7520 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00007521
7522 // Optimization level.
7523 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
7524 if (A->getOption().getID() == options::OPT_O0) {
7525 CmdArgs.push_back("/Od");
7526 } else {
7527 StringRef OptLevel = A->getValue();
7528 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
7529 A->render(Args, CmdArgs);
7530 else if (OptLevel == "3")
7531 CmdArgs.push_back("/Ox");
7532 }
7533 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00007534
7535 // Flags for which clang-cl have an alias.
7536 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
7537
7538 if (Arg *A = Args.getLastArg(options::OPT_frtti, options::OPT_fno_rtti))
7539 CmdArgs.push_back(A->getOption().getID() == options::OPT_frtti ? "/GR"
7540 : "/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00007541 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
7542 options::OPT_fno_function_sections))
7543 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
7544 ? "/Gy"
7545 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00007546 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
7547 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00007548 CmdArgs.push_back(
7549 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007550 if (Args.hasArg(options::OPT_fsyntax_only))
7551 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00007552 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
7553 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007554
Hans Wennborg260ff402013-09-27 17:54:18 +00007555 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
7556 for (size_t I = 0, E = Includes.size(); I != E; ++I)
7557 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Includes[I]));
7558
Hans Wennborg87cfa712013-09-19 20:32:16 +00007559 // Flags that can simply be passed through.
7560 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
7561 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
7562
7563 // The order of these flags is relevant, so pick the last one.
7564 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
7565 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
7566 A->render(Args, CmdArgs);
7567
7568
7569 // Input filename.
7570 assert(Inputs.size() == 1);
7571 const InputInfo &II = Inputs[0];
7572 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
7573 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
7574 if (II.isFilename())
7575 CmdArgs.push_back(II.getFilename());
7576 else
7577 II.getInputArg().renderAsInput(Args, CmdArgs);
7578
7579 // Output filename.
7580 assert(Output.getType() == types::TY_Object);
7581 const char *Fo = Args.MakeArgString(std::string("/Fo") +
7582 Output.getFilename());
7583 CmdArgs.push_back(Fo);
7584
Hans Wennborg188382e2013-09-20 18:16:35 +00007585 const Driver &D = getToolChain().getDriver();
7586 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborg87cfa712013-09-19 20:32:16 +00007587
Hans Wennborg188382e2013-09-20 18:16:35 +00007588 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00007589}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007590
7591
7592/// XCore Tools
7593// We pass assemble and link construction to the xcc tool.
7594
7595void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7596 const InputInfo &Output,
7597 const InputInfoList &Inputs,
7598 const ArgList &Args,
7599 const char *LinkingOutput) const {
7600 ArgStringList CmdArgs;
7601
7602 CmdArgs.push_back("-o");
7603 CmdArgs.push_back(Output.getFilename());
7604
7605 CmdArgs.push_back("-c");
7606
Robert Lytton9e8c1a42014-02-13 10:40:12 +00007607 if (Args.hasArg(options::OPT_v))
7608 CmdArgs.push_back("-v");
7609
7610 if (Args.hasArg(options::OPT_g_Group))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007611 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00007612
Robert Lytton8e95d4e2014-02-11 10:34:45 +00007613 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
7614 false))
7615 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007616
7617 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7618 options::OPT_Xassembler);
7619
7620 for (InputInfoList::const_iterator
7621 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7622 const InputInfo &II = *it;
7623 CmdArgs.push_back(II.getFilename());
7624 }
7625
7626 const char *Exec =
7627 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7628 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7629}
7630
7631void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
7632 const InputInfo &Output,
7633 const InputInfoList &Inputs,
7634 const ArgList &Args,
7635 const char *LinkingOutput) const {
7636 ArgStringList CmdArgs;
7637
7638 if (Output.isFilename()) {
7639 CmdArgs.push_back("-o");
7640 CmdArgs.push_back(Output.getFilename());
7641 } else {
7642 assert(Output.isNothing() && "Invalid output.");
7643 }
7644
Robert Lytton9e8c1a42014-02-13 10:40:12 +00007645 if (Args.hasArg(options::OPT_v))
7646 CmdArgs.push_back("-v");
7647
Robert Lyttonf7e03c12014-02-13 10:34:44 +00007648 ExceptionSettings EH = exceptionSettings(Args, getToolChain().getTriple());
7649 if (EH.ShouldUseExceptionTables)
7650 CmdArgs.push_back("-fexceptions");
7651
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007652 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7653
7654 const char *Exec =
7655 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7656 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7657}