blob: cd369d72eb59a0c85f51b32adff9503d0c2f697c [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;
2511 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Rafael Espindola8f41aee2013-11-17 22:42:24 +00002512 options::OPT_fno_strict_aliasing, true))
Dan Gohman10169b92010-10-14 22:36:56 +00002513 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002514 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2515 options::OPT_fno_struct_path_tbaa))
2516 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002517 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2518 false))
2519 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002520 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2521 options::OPT_fno_optimize_sibling_calls))
2522 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002523
Eric Christopher006208c2013-04-04 06:29:47 +00002524 // Handle segmented stacks.
2525 if (Args.hasArg(options::OPT_fsplit_stack))
2526 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002527
2528 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2529 // This alias option is being used to simplify the getLastArg logic.
2530 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2531 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002532
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002533 // Handle various floating point optimization flags, mapping them to the
2534 // appropriate LLVM code generation flags. The pattern for all of these is to
2535 // default off the codegen optimizations, and if any flag enables them and no
2536 // flag disables them after the flag enabling them, enable the codegen
2537 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002538 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002539 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002540 options::OPT_ffinite_math_only,
2541 options::OPT_fno_finite_math_only,
2542 options::OPT_fhonor_infinities,
2543 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002544 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2545 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002546 A->getOption().getID() != options::OPT_fhonor_infinities)
2547 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002548 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002549 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002550 options::OPT_ffinite_math_only,
2551 options::OPT_fno_finite_math_only,
2552 options::OPT_fhonor_nans,
2553 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002554 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2555 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002556 A->getOption().getID() != options::OPT_fhonor_nans)
2557 CmdArgs.push_back("-menable-no-nans");
2558
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002559 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2560 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002561 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002562 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002563 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002564 options::OPT_fno_math_errno)) {
2565 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2566 // However, turning *off* -ffast_math merely restores the toolchain default
2567 // (which may be false).
2568 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2569 A->getOption().getID() == options::OPT_ffast_math ||
2570 A->getOption().getID() == options::OPT_Ofast)
2571 MathErrno = false;
2572 else if (A->getOption().getID() == options::OPT_fmath_errno)
2573 MathErrno = true;
2574 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002575 if (MathErrno)
2576 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002577
2578 // There are several flags which require disabling very specific
2579 // optimizations. Any of these being disabled forces us to turn off the
2580 // entire set of LLVM optimizations, so collect them through all the flag
2581 // madness.
2582 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002583 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002584 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002585 options::OPT_funsafe_math_optimizations,
2586 options::OPT_fno_unsafe_math_optimizations,
2587 options::OPT_fassociative_math,
2588 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002589 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2590 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002591 A->getOption().getID() != options::OPT_fno_associative_math)
2592 AssociativeMath = true;
2593 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002594 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002595 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002596 options::OPT_funsafe_math_optimizations,
2597 options::OPT_fno_unsafe_math_optimizations,
2598 options::OPT_freciprocal_math,
2599 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002600 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2601 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002602 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2603 ReciprocalMath = true;
2604 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002605 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002606 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002607 options::OPT_funsafe_math_optimizations,
2608 options::OPT_fno_unsafe_math_optimizations,
2609 options::OPT_fsigned_zeros,
2610 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002611 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2612 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002613 A->getOption().getID() != options::OPT_fsigned_zeros)
2614 SignedZeros = false;
2615 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002616 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002617 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002618 options::OPT_funsafe_math_optimizations,
2619 options::OPT_fno_unsafe_math_optimizations,
2620 options::OPT_ftrapping_math,
2621 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002622 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2623 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002624 A->getOption().getID() != options::OPT_ftrapping_math)
2625 TrappingMath = false;
2626 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2627 !TrappingMath)
2628 CmdArgs.push_back("-menable-unsafe-fp-math");
2629
Lang Hamesaa53b932012-07-06 00:59:19 +00002630
2631 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002632 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002633 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002634 options::OPT_ffp_contract)) {
2635 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002636 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002637 if (Val == "fast" || Val == "on" || Val == "off") {
2638 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2639 } else {
2640 D.Diag(diag::err_drv_unsupported_option_argument)
2641 << A->getOption().getName() << Val;
2642 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002643 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2644 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002645 // If fast-math is set then set the fp-contract mode to fast.
2646 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2647 }
2648 }
2649
Bob Wilson6a039162012-07-19 03:52:53 +00002650 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2651 // and if we find them, tell the frontend to provide the appropriate
2652 // preprocessor macros. This is distinct from enabling any optimizations as
2653 // these options induce language changes which must survive serialization
2654 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002655 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2656 options::OPT_fno_fast_math))
2657 if (!A->getOption().matches(options::OPT_fno_fast_math))
2658 CmdArgs.push_back("-ffast-math");
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002659 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2660 if (A->getOption().matches(options::OPT_ffinite_math_only))
2661 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002662
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002663 // Decide whether to use verbose asm. Verbose assembly is the default on
2664 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002665 bool IsIntegratedAssemblerDefault =
2666 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002667 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002668 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002669 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002670 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002671
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00002672 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002673 IsIntegratedAssemblerDefault))
2674 CmdArgs.push_back("-no-integrated-as");
2675
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002676 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2677 CmdArgs.push_back("-mdebug-pass");
2678 CmdArgs.push_back("Structure");
2679 }
2680 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2681 CmdArgs.push_back("-mdebug-pass");
2682 CmdArgs.push_back("Arguments");
2683 }
2684
John McCall8517abc2010-02-19 02:45:38 +00002685 // Enable -mconstructor-aliases except on darwin, where we have to
2686 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002687 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002688 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002689
John McCall7ef5cb32011-03-18 02:56:14 +00002690 // Darwin's kernel doesn't support guard variables; just die if we
2691 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002692 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002693 CmdArgs.push_back("-fforbid-guard-variables");
2694
Douglas Gregordbe39272011-02-01 15:15:22 +00002695 if (Args.hasArg(options::OPT_mms_bitfields)) {
2696 CmdArgs.push_back("-mms-bitfields");
2697 }
John McCall8517abc2010-02-19 02:45:38 +00002698
Daniel Dunbar306945d2009-09-16 06:17:29 +00002699 // This is a coarse approximation of what llvm-gcc actually does, both
2700 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2701 // complicated ways.
2702 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00002703 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2704 options::OPT_fno_asynchronous_unwind_tables,
2705 (getToolChain().IsUnwindTablesDefault() ||
2706 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
2707 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002708 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2709 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002710 CmdArgs.push_back("-munwind-tables");
2711
Chandler Carruth05fb5852012-11-21 23:40:23 +00002712 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002713
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002714 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2715 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002716 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002717 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002718
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002719 // FIXME: Handle -mtune=.
2720 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002721
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002722 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002723 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002724 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002725 }
2726
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002727 // Add the target cpu
2728 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2729 llvm::Triple ETriple(ETripleStr);
2730 std::string CPU = getCPUName(Args, ETriple);
2731 if (!CPU.empty()) {
2732 CmdArgs.push_back("-target-cpu");
2733 CmdArgs.push_back(Args.MakeArgString(CPU));
2734 }
2735
Rafael Espindolaeb265472013-08-21 21:59:03 +00002736 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2737 CmdArgs.push_back("-mfpmath");
2738 CmdArgs.push_back(A->getValue());
2739 }
2740
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002741 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002742 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002743
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002744 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002745 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002746 default:
2747 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002748
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002749 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002750 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002751 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002752 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002753 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002754 break;
2755
Tim Northovera2ee4332014-03-29 15:09:45 +00002756 case llvm::Triple::arm64:
2757 AddARM64TargetArgs(Args, CmdArgs);
2758 break;
2759
Eric Christopher0b26a612010-03-02 02:41:08 +00002760 case llvm::Triple::mips:
2761 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002762 case llvm::Triple::mips64:
2763 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002764 AddMIPSTargetArgs(Args, CmdArgs);
2765 break;
2766
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002767 case llvm::Triple::sparc:
2768 AddSparcTargetArgs(Args, CmdArgs);
2769 break;
2770
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002771 case llvm::Triple::x86:
2772 case llvm::Triple::x86_64:
2773 AddX86TargetArgs(Args, CmdArgs);
2774 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002775
2776 case llvm::Triple::hexagon:
2777 AddHexagonTargetArgs(Args, CmdArgs);
2778 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002779 }
2780
Hans Wennborg75958c42013-08-08 00:17:41 +00002781 // Add clang-cl arguments.
2782 if (getToolChain().getDriver().IsCLMode())
2783 AddClangCLArgs(Args, CmdArgs);
2784
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002785 // Pass the linker version in use.
2786 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2787 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002788 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002789 }
2790
Eric Christopherb7d97e92013-04-03 01:58:53 +00002791 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002792 CmdArgs.push_back("-momit-leaf-frame-pointer");
2793
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002794 // Explicitly error on some things we know we don't support and can't just
2795 // ignore.
2796 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002797 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2798 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002799 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002800 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002801 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002802 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2803 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002804 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002805 << Unsupported->getOption().getName();
2806 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002807 }
2808
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002809 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002810 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002811 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002812 CmdArgs.push_back("-header-include-file");
2813 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2814 D.CCPrintHeadersFilename : "-");
2815 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002816 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002817 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002818
Chad Rosierbe10f982011-08-02 17:58:04 +00002819 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002820 CmdArgs.push_back("-diagnostic-log-file");
2821 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2822 D.CCLogDiagnosticsFilename : "-");
2823 }
2824
Manman Ren17bdb0f2013-11-20 20:22:14 +00002825 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
2826 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002827 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002828 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
David Blaikief5961452014-03-25 20:42:27 +00002829 if (A->getOption().matches(options::OPT_gline_tables_only)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00002830 // FIXME: we should support specifying dwarf version with
2831 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002832 CmdArgs.push_back("-gline-tables-only");
Adrian Prantl549c5142014-02-17 17:40:52 +00002833 // Default is dwarf-2 for darwin.
2834 if (getToolChain().getTriple().isOSDarwin())
2835 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00002836 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00002837 CmdArgs.push_back("-gdwarf-2");
2838 else if (A->getOption().matches(options::OPT_gdwarf_3))
2839 CmdArgs.push_back("-gdwarf-3");
2840 else if (A->getOption().matches(options::OPT_gdwarf_4))
2841 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002842 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00002843 !A->getOption().matches(options::OPT_ggdb0)) {
2844 // Default is dwarf-2 for darwin.
2845 if (getToolChain().getTriple().isOSDarwin())
2846 CmdArgs.push_back("-gdwarf-2");
2847 else
2848 CmdArgs.push_back("-g");
2849 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002850 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002851
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002852 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2853 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002854 if (Args.hasArg(options::OPT_gcolumn_info))
2855 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002856
Eric Christopher138c32b2013-09-13 22:37:55 +00002857 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002858 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2859 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00002860 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002861 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00002862 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002863 CmdArgs.push_back("-g");
2864 CmdArgs.push_back("-backend-option");
2865 CmdArgs.push_back("-split-dwarf=Enable");
2866 }
2867
Eric Christopher138c32b2013-09-13 22:37:55 +00002868 // -ggnu-pubnames turns on gnu style pubnames in the backend.
2869 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2870 CmdArgs.push_back("-backend-option");
2871 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2872 }
Eric Christophereec89c22013-06-18 00:03:50 +00002873
Eric Christopher0d403d22014-02-14 01:27:03 +00002874 // -gdwarf-aranges turns on the emission of the aranges section in the
2875 // backend.
2876 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
2877 CmdArgs.push_back("-backend-option");
2878 CmdArgs.push_back("-generate-arange-section");
2879 }
2880
David Blaikief36d9ba2014-01-27 18:52:43 +00002881 if (Args.hasFlag(options::OPT_fdebug_types_section,
2882 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00002883 CmdArgs.push_back("-backend-option");
2884 CmdArgs.push_back("-generate-type-units");
2885 }
Eric Christophereec89c22013-06-18 00:03:50 +00002886
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00002887 if (Args.hasFlag(options::OPT_ffunction_sections,
2888 options::OPT_fno_function_sections, false)) {
2889 CmdArgs.push_back("-ffunction-sections");
2890 }
2891
2892 if (Args.hasFlag(options::OPT_fdata_sections,
2893 options::OPT_fno_data_sections, false)) {
2894 CmdArgs.push_back("-fdata-sections");
2895 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002896
Chris Lattner3c77a352010-06-22 00:03:40 +00002897 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2898
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002899 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
2900 (Args.hasArg(options::OPT_fprofile_instr_use) ||
2901 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
2902 D.Diag(diag::err_drv_argument_not_allowed_with)
2903 << "-fprofile-instr-generate" << "-fprofile-instr-use";
2904
2905 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
2906
2907 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
2908 A->render(Args, CmdArgs);
2909 else if (Args.hasArg(options::OPT_fprofile_instr_use))
2910 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
2911
Nick Lewycky207bce32011-04-21 23:44:07 +00002912 if (Args.hasArg(options::OPT_ftest_coverage) ||
2913 Args.hasArg(options::OPT_coverage))
2914 CmdArgs.push_back("-femit-coverage-notes");
2915 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2916 Args.hasArg(options::OPT_coverage))
2917 CmdArgs.push_back("-femit-coverage-data");
2918
Nick Lewycky480cb992011-05-04 20:46:58 +00002919 if (C.getArgs().hasArg(options::OPT_c) ||
2920 C.getArgs().hasArg(options::OPT_S)) {
2921 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002922 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00002923 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00002924 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002925 SmallString<128> Pwd;
2926 if (!llvm::sys::fs::current_path(Pwd)) {
2927 llvm::sys::path::append(Pwd, CoverageFilename.str());
2928 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00002929 }
2930 }
Eric Christophere30f61c2013-02-22 00:24:40 +00002931 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002932 }
2933 }
2934
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002935 // Pass options for controlling the default header search paths.
2936 if (Args.hasArg(options::OPT_nostdinc)) {
2937 CmdArgs.push_back("-nostdsysteminc");
2938 CmdArgs.push_back("-nobuiltininc");
2939 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002940 if (Args.hasArg(options::OPT_nostdlibinc))
2941 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002942 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2943 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2944 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002945
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002946 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002947 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002948 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002949
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002950 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2951
Ted Kremenekf7639e12012-03-06 20:06:33 +00002952 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00002953 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002954 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002955 options::OPT_ccc_arcmt_modify,
2956 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002957 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002958 switch (A->getOption().getID()) {
2959 default:
2960 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002961 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002962 CmdArgs.push_back("-arcmt-check");
2963 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002964 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002965 CmdArgs.push_back("-arcmt-modify");
2966 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002967 case options::OPT_ccc_arcmt_migrate:
2968 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002969 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002970 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002971
2972 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2973 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002974 break;
John McCalld70fb982011-06-15 23:25:17 +00002975 }
2976 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00002977 } else {
2978 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2979 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2980 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00002981 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002982
Ted Kremenekf7639e12012-03-06 20:06:33 +00002983 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2984 if (ARCMTEnabled) {
2985 D.Diag(diag::err_drv_argument_not_allowed_with)
2986 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2987 }
2988 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002989 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002990
2991 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002992 options::OPT_objcmt_migrate_subscripting,
2993 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002994 // None specified, means enable them all.
2995 CmdArgs.push_back("-objcmt-migrate-literals");
2996 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002997 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002998 } else {
2999 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3000 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003001 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003002 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003003 } else {
3004 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3005 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3006 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3007 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3008 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3009 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
3010 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3011 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3012 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3013 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3014 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3015 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3016 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003017 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003018 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003019 }
3020
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003021 // Add preprocessing options like -I, -D, etc. if we are using the
3022 // preprocessor.
3023 //
3024 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003025 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003026 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003027
Rafael Espindolaa7431922011-07-21 23:40:37 +00003028 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3029 // that "The compiler can only warn and ignore the option if not recognized".
3030 // When building with ccache, it will pass -D options to clang even on
3031 // preprocessed inputs and configure concludes that -fPIC is not supported.
3032 Args.ClaimAllArgs(options::OPT_D);
3033
Alp Toker7874bdc2013-11-15 20:40:58 +00003034 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003035 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3036 if (A->getOption().matches(options::OPT_O4)) {
3037 CmdArgs.push_back("-O3");
3038 D.Diag(diag::warn_O4_is_O3);
3039 } else {
3040 A->render(Args, CmdArgs);
3041 }
3042 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003043
Chad Rosier86b82082012-12-12 20:06:31 +00003044 // Don't warn about unused -flto. This can happen when we're preprocessing or
3045 // precompiling.
3046 Args.ClaimAllArgs(options::OPT_flto);
3047
Daniel Dunbar945577c2009-10-29 02:24:45 +00003048 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003049 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3050 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003051 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003052 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003053
3054 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003055 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003056 //
3057 // If a std is supplied, only add -trigraphs if it follows the
3058 // option.
3059 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3060 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003061 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003062 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003063 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003064 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003065 else
3066 Std->render(Args, CmdArgs);
3067
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003068 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
3069 options::OPT_trigraphs))
3070 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003071 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003072 } else {
3073 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003074 //
3075 // FIXME: Clang doesn't correctly handle -std= when the input language
3076 // doesn't match. For the time being just ignore this for C++ inputs;
3077 // eventually we want to do all the standard defaulting here instead of
3078 // splitting it between the driver and clang -cc1.
3079 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003080 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3081 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003082 else if (IsWindowsMSVC)
Nico Weber723b4f02012-08-30 02:08:31 +00003083 CmdArgs.push_back("-std=c++11");
3084
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003085 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003086 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003087
Richard Smith282b4492013-09-04 22:50:31 +00003088 // GCC's behavior for -Wwrite-strings is a bit strange:
3089 // * In C, this "warning flag" changes the types of string literals from
3090 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3091 // for the discarded qualifier.
3092 // * In C++, this is just a normal warning flag.
3093 //
3094 // Implementing this warning correctly in C is hard, so we follow GCC's
3095 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3096 // a non-const char* in C, rather than using this crude hack.
3097 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003098 // FIXME: This should behave just like a warning flag, and thus should also
3099 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3100 Arg *WriteStrings =
3101 Args.getLastArg(options::OPT_Wwrite_strings,
3102 options::OPT_Wno_write_strings, options::OPT_w);
3103 if (WriteStrings &&
3104 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003105 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003106 }
3107
Chandler Carruth61fbf622011-04-23 09:27:53 +00003108 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003109 // during C++ compilation, which it is by default. GCC keeps this define even
3110 // in the presence of '-w', match this behavior bug-for-bug.
3111 if (types::isCXX(InputType) &&
3112 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3113 true)) {
3114 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003115 }
3116
Chandler Carruthe0391482010-05-22 02:21:53 +00003117 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3118 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3119 if (Asm->getOption().matches(options::OPT_fasm))
3120 CmdArgs.push_back("-fgnu-keywords");
3121 else
3122 CmdArgs.push_back("-fno-gnu-keywords");
3123 }
3124
Rafael Espindola4cfa7972011-05-02 17:43:32 +00003125 if (ShouldDisableCFI(Args, getToolChain()))
3126 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00003127
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003128 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3129 CmdArgs.push_back("-fno-dwarf-directory-asm");
3130
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003131 if (ShouldDisableAutolink(Args, getToolChain()))
3132 CmdArgs.push_back("-fno-autolink");
3133
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003134 // Add in -fdebug-compilation-dir if necessary.
3135 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003136
Richard Smith9a568822011-11-21 19:36:32 +00003137 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3138 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003139 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003140 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003141 }
3142
Richard Smith79c927b2013-11-06 19:31:51 +00003143 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3144 CmdArgs.push_back("-foperator-arrow-depth");
3145 CmdArgs.push_back(A->getValue());
3146 }
3147
Richard Smith9a568822011-11-21 19:36:32 +00003148 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3149 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003150 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003151 }
3152
Richard Smitha3d3bd22013-05-08 02:12:03 +00003153 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3154 CmdArgs.push_back("-fconstexpr-steps");
3155 CmdArgs.push_back(A->getValue());
3156 }
3157
Richard Smithb3a14522013-02-22 01:59:51 +00003158 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3159 CmdArgs.push_back("-fbracket-depth");
3160 CmdArgs.push_back(A->getValue());
3161 }
3162
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003163 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3164 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003165 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003166 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003167 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3168 } else
3169 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003170 }
3171
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003172
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003173 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003174 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003175
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003176 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3177 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003178 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003179 }
David Chisnall5778fce2009-08-31 16:41:57 +00003180
Chris Lattnere23003d2010-01-09 21:54:33 +00003181 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3182 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003183 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003184 }
3185
Chris Lattnerb35583d2010-04-07 20:49:23 +00003186 CmdArgs.push_back("-ferror-limit");
3187 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003188 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003189 else
3190 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003191
Chandler Carrutha77a7272010-05-06 04:55:18 +00003192 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3193 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003194 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003195 }
3196
3197 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3198 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003199 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003200 }
3201
Richard Smithf6f003a2011-12-16 19:06:07 +00003202 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3203 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003204 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003205 }
3206
Daniel Dunbar2c978472009-11-04 06:24:47 +00003207 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003208 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003209 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003210 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003211 } else {
3212 // If -fmessage-length=N was not specified, determine whether this is a
3213 // terminal and, if so, implicitly define -fmessage-length appropriately.
3214 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003215 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003216 }
3217
John McCallb4a99d32013-02-19 01:57:35 +00003218 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3219 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3220 options::OPT_fvisibility_ms_compat)) {
3221 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3222 CmdArgs.push_back("-fvisibility");
3223 CmdArgs.push_back(A->getValue());
3224 } else {
3225 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3226 CmdArgs.push_back("-fvisibility");
3227 CmdArgs.push_back("hidden");
3228 CmdArgs.push_back("-ftype-visibility");
3229 CmdArgs.push_back("default");
3230 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003231 }
3232
Douglas Gregor08329632010-06-15 17:05:35 +00003233 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003234
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003235 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3236
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003237 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003238 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3239 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003240 CmdArgs.push_back("-ffreestanding");
3241
Daniel Dunbare357d562009-12-03 18:42:11 +00003242 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003243 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003244 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003245 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3246 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003247 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003248 // AltiVec language extensions aren't relevant for assembling.
3249 if (!isa<PreprocessJobAction>(JA) ||
3250 Output.getType() != types::TY_PP_Asm)
3251 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003252 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3253 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003254
Peter Collingbourne32701642013-11-01 18:16:25 +00003255 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3256 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003257
Will Dietz3676d562012-12-30 20:53:28 +00003258 if (!Args.hasFlag(options::OPT_fsanitize_recover,
3259 options::OPT_fno_sanitize_recover,
3260 true))
3261 CmdArgs.push_back("-fno-sanitize-recover");
3262
Alexey Samsonovcb3f8122014-03-20 10:48:29 +00003263 if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
Chad Rosierae229d52013-01-29 23:31:22 +00003264 options::OPT_fno_sanitize_undefined_trap_on_error, false))
3265 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
3266
Eric Christopher459d2712013-02-19 06:16:53 +00003267 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003268 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003269 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003270 getToolChain().getArch() == llvm::Triple::ppc64 ||
3271 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003272 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003273 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003274
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003275 if (getToolChain().SupportsProfiling())
3276 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003277
3278 // -flax-vector-conversions is default.
3279 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3280 options::OPT_fno_lax_vector_conversions))
3281 CmdArgs.push_back("-fno-lax-vector-conversions");
3282
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003283 if (Args.getLastArg(options::OPT_fapple_kext))
3284 CmdArgs.push_back("-fapple-kext");
3285
David Blaikie690f21e2012-06-14 18:55:27 +00003286 if (Args.hasFlag(options::OPT_frewrite_includes,
3287 options::OPT_fno_rewrite_includes, false))
3288 CmdArgs.push_back("-frewrite-includes");
3289
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003290 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003291 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003292 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003293 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3294 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003295
3296 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3297 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003298 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003299 }
3300
Bob Wilson14adb362012-02-03 06:27:22 +00003301 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003302
Chandler Carruth6e501032011-03-27 00:04:55 +00003303 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3304 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3305 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3306 options::OPT_fno_wrapv)) {
3307 if (A->getOption().matches(options::OPT_fwrapv))
3308 CmdArgs.push_back("-fwrapv");
3309 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3310 options::OPT_fno_strict_overflow)) {
3311 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3312 CmdArgs.push_back("-fwrapv");
3313 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003314
3315 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3316 options::OPT_fno_reroll_loops))
3317 if (A->getOption().matches(options::OPT_freroll_loops))
3318 CmdArgs.push_back("-freroll-loops");
3319
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003320 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003321 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3322 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003323
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003324 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3325
Mahesha S6a682be42012-10-27 07:47:56 +00003326
Daniel Dunbar4930e332009-11-17 08:07:36 +00003327 // -stack-protector=0 is default.
3328 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003329 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3330 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003331 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003332 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003333 if (A->getOption().matches(options::OPT_fstack_protector))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003334 StackProtectorLevel = LangOptions::SSPOn;
3335 else if (A->getOption().matches(options::OPT_fstack_protector_strong))
3336 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003337 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003338 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003339 } else {
3340 StackProtectorLevel =
3341 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3342 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003343 if (StackProtectorLevel) {
3344 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003345 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003346 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003347
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003348 // --param ssp-buffer-size=
3349 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3350 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003351 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003352 if (Str.startswith("ssp-buffer-size=")) {
3353 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003354 CmdArgs.push_back("-stack-protector-buffer-size");
3355 // FIXME: Verify the argument is a valid integer.
3356 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003357 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003358 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003359 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003360 }
3361
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003362 // Translate -mstackrealign
3363 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3364 false)) {
3365 CmdArgs.push_back("-backend-option");
3366 CmdArgs.push_back("-force-align-stack");
3367 }
3368 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3369 false)) {
3370 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3371 }
3372
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003373 if (Args.hasArg(options::OPT_mstack_alignment)) {
3374 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3375 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003376 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00003377 // -mkernel implies -mstrict-align; don't add the redundant option.
Renato Golina146a482013-08-24 14:44:41 +00003378 if (!KernelOrKext) {
Renato Golin8d5f3142013-08-28 23:56:07 +00003379 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3380 options::OPT_munaligned_access)) {
3381 if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3382 CmdArgs.push_back("-backend-option");
3383 CmdArgs.push_back("-arm-strict-align");
3384 } else {
3385 CmdArgs.push_back("-backend-option");
3386 CmdArgs.push_back("-arm-no-strict-align");
3387 }
Renato Golina146a482013-08-24 14:44:41 +00003388 }
Chad Rosier60027022012-11-09 17:29:19 +00003389 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003390
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003391 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3392 options::OPT_mno_restrict_it)) {
3393 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3394 CmdArgs.push_back("-backend-option");
3395 CmdArgs.push_back("-arm-restrict-it");
3396 } else {
3397 CmdArgs.push_back("-backend-option");
3398 CmdArgs.push_back("-arm-no-restrict-it");
3399 }
3400 }
3401
Daniel Dunbard18049a2009-04-07 21:16:11 +00003402 // Forward -f options with positive and negative forms; we translate
3403 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003404 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3405 StringRef fname = A->getValue();
3406 if (!llvm::sys::fs::exists(fname))
3407 D.Diag(diag::err_drv_no_such_file) << fname;
3408 else
3409 A->render(Args, CmdArgs);
3410 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003411
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003412 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003413 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003414 CmdArgs.push_back("-fapple-kext");
3415 if (!Args.hasArg(options::OPT_fbuiltin))
3416 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003417 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003418 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003419 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003420 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003421 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003422
Nuno Lopes13c88c72009-12-16 16:59:22 +00003423 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3424 options::OPT_fno_assume_sane_operator_new))
3425 CmdArgs.push_back("-fno-assume-sane-operator-new");
3426
Daniel Dunbar4930e332009-11-17 08:07:36 +00003427 // -fblocks=0 is default.
3428 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003429 getToolChain().IsBlocksDefault()) ||
3430 (Args.hasArg(options::OPT_fgnu_runtime) &&
3431 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3432 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003433 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003434
3435 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3436 !getToolChain().hasBlocksRuntime())
3437 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003438 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003439
Douglas Gregor226173a2012-01-18 15:19:58 +00003440 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3441 // users must also pass -fcxx-modules. The latter flag will disappear once the
3442 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003443 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003444 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3445 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3446 options::OPT_fno_cxx_modules,
3447 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003448 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003449 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003450 HaveModules = true;
3451 }
3452 }
3453
Daniel Jasper07e6c402013-08-05 20:26:17 +00003454 // -fmodule-maps enables module map processing (off by default) for header
3455 // checking. It is implied by -fmodules.
3456 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3457 false)) {
3458 CmdArgs.push_back("-fmodule-maps");
3459 }
3460
Daniel Jasperac42b752013-10-21 06:34:34 +00003461 // -fmodules-decluse checks that modules used are declared so (off by
3462 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003463 if (Args.hasFlag(options::OPT_fmodules_decluse,
3464 options::OPT_fno_modules_decluse,
3465 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003466 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003467 }
3468
Daniel Jasperac42b752013-10-21 06:34:34 +00003469 // -fmodule-name specifies the module that is currently being built (or
3470 // used for header checking by -fmodule-maps).
3471 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name)) {
3472 A->claim();
3473 A->render(Args, CmdArgs);
3474 }
3475
3476 // -fmodule-map-file can be used to specify a file containing module
3477 // definitions.
3478 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file)) {
3479 A->claim();
3480 A->render(Args, CmdArgs);
3481 }
3482
Douglas Gregor35b04d62013-02-07 19:01:24 +00003483 // If a module path was provided, pass it along. Otherwise, use a temporary
3484 // directory.
3485 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3486 A->claim();
3487 if (HaveModules) {
3488 A->render(Args, CmdArgs);
3489 }
3490 } else if (HaveModules) {
3491 SmallString<128> DefaultModuleCache;
3492 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3493 DefaultModuleCache);
Douglas Gregor23c7d672013-03-21 21:48:48 +00003494 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3495 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor4bedb492013-02-07 22:59:12 +00003496 const char Arg[] = "-fmodules-cache-path=";
3497 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3498 Arg, Arg + strlen(Arg));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003499 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3500 }
3501
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00003502 if (Arg *A = Args.getLastArg(options::OPT_fmodules_user_build_path)) {
3503 A->claim();
3504 if (HaveModules) {
3505 A->render(Args, CmdArgs);
3506 }
3507 }
3508
Douglas Gregor35b04d62013-02-07 19:01:24 +00003509 // Pass through all -fmodules-ignore-macro arguments.
3510 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003511 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3512 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003513
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003514 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
3515
3516 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
3517 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp))
3518 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
3519
3520 Args.AddLastArg(CmdArgs,
3521 options::OPT_fmodules_validate_once_per_build_session);
3522 }
3523
Ben Langmuirdcf73862014-03-12 00:06:17 +00003524 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
3525
John McCalldfea9982010-04-09 19:12:06 +00003526 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003527 if (Args.hasFlag(options::OPT_fno_access_control,
3528 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003529 false))
John McCall3155f572010-04-09 19:03:51 +00003530 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003531
Anders Carlssond470fef2010-11-21 00:09:52 +00003532 // -felide-constructors is the default.
3533 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3534 options::OPT_felide_constructors,
3535 false))
3536 CmdArgs.push_back("-fno-elide-constructors");
3537
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003538 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003539 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00003540 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00003541 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00003542
Richard Smith52be6192012-11-05 22:04:41 +00003543 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003544 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00003545 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00003546 Args.getLastArg(options::OPT_mkernel,
3547 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00003548 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00003549 D.Diag(diag::err_drv_argument_not_allowed_with)
3550 << "-fsanitize=vptr" << NoRttiArg;
3551 }
3552 }
3553
Tony Linthicum76329bf2011-12-12 21:14:55 +00003554 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003555 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003556 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003557 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00003558 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003559 CmdArgs.push_back("-fshort-enums");
3560
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003561 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003562 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003563 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00003564 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00003565
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003566 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003567 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003568 options::OPT_fno_threadsafe_statics))
3569 CmdArgs.push_back("-fno-threadsafe-statics");
3570
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003571 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003572 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3573 options::OPT_fno_use_cxa_atexit,
3574 !IsWindowsCygnus && !IsWindowsGNU &&
3575 getToolChain().getArch() != llvm::Triple::hexagon &&
3576 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00003577 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003578 CmdArgs.push_back("-fno-use-cxa-atexit");
3579
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003580 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003581 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003582 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003583 CmdArgs.push_back("-fms-extensions");
3584
Francois Pichet1b4f1632011-09-17 04:32:15 +00003585 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003586 if (Args.hasFlag(options::OPT_fms_compatibility,
3587 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003588 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
3589 options::OPT_fno_ms_extensions,
3590 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003591 CmdArgs.push_back("-fms-compatibility");
3592
Reid Klecknerc106fda2013-09-18 00:33:59 +00003593 // -fmsc-version=1700 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003594 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003595 IsWindowsMSVC) || Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003596 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003597 if (msc_ver.empty())
Reid Klecknerc106fda2013-09-18 00:33:59 +00003598 CmdArgs.push_back("-fmsc-version=1700");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003599 else
3600 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3601 }
3602
3603
Eric Christopher5ecce122013-02-18 00:38:31 +00003604 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00003605 if (Args.hasFlag(options::OPT_fborland_extensions,
3606 options::OPT_fno_borland_extensions, false))
3607 CmdArgs.push_back("-fborland-extensions");
3608
Francois Pichet02744872011-09-01 16:38:08 +00003609 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3610 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003611 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003612 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003613 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003614
Chandler Carruthe03aa552010-04-17 20:17:31 +00003615 // -fgnu-keywords default varies depending on language; only pass if
3616 // specified.
3617 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003618 options::OPT_fno_gnu_keywords))
3619 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00003620
Rafael Espindola922a6242011-06-02 17:30:53 +00003621 if (Args.hasFlag(options::OPT_fgnu89_inline,
3622 options::OPT_fno_gnu89_inline,
3623 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00003624 CmdArgs.push_back("-fgnu89-inline");
3625
Chad Rosier9c76d242012-03-15 22:31:42 +00003626 if (Args.hasArg(options::OPT_fno_inline))
3627 CmdArgs.push_back("-fno-inline");
3628
Chad Rosier64d6be92012-03-06 21:17:19 +00003629 if (Args.hasArg(options::OPT_fno_inline_functions))
3630 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00003631
John McCall5fb5df92012-06-20 06:18:46 +00003632 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00003633
John McCall5fb5df92012-06-20 06:18:46 +00003634 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00003635 // legacy is the default. Except for deployment taget of 10.5,
3636 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
3637 // gets ignored silently.
3638 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00003639 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3640 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00003641 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003642 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00003643 if (getToolChain().UseObjCMixedDispatch())
3644 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3645 else
3646 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3647 }
3648 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00003649
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00003650 // When ObjectiveC legacy runtime is in effect on MacOSX,
3651 // turn on the option to do Array/Dictionary subscripting
3652 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00003653 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
3654 getToolChain().getTriple().isMacOSX() &&
3655 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
3656 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00003657 objcRuntime.isNeXTFamily())
3658 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
3659
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00003660 // -fencode-extended-block-signature=1 is default.
3661 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3662 CmdArgs.push_back("-fencode-extended-block-signature");
3663 }
3664
John McCall24fc0de2011-07-06 00:26:06 +00003665 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3666 // NOTE: This logic is duplicated in ToolChains.cpp.
3667 bool ARC = isObjCAutoRefCount(Args);
3668 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00003669 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00003670
John McCall24fc0de2011-07-06 00:26:06 +00003671 CmdArgs.push_back("-fobjc-arc");
3672
Chandler Carruth491db322011-11-04 07:34:47 +00003673 // FIXME: It seems like this entire block, and several around it should be
3674 // wrapped in isObjC, but for now we just use it here as this is where it
3675 // was being used previously.
3676 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3677 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3678 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3679 else
3680 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3681 }
3682
John McCall24fc0de2011-07-06 00:26:06 +00003683 // Allow the user to enable full exceptions code emission.
3684 // We define off for Objective-CC, on for Objective-C++.
3685 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3686 options::OPT_fno_objc_arc_exceptions,
3687 /*default*/ types::isCXX(InputType)))
3688 CmdArgs.push_back("-fobjc-arc-exceptions");
3689 }
3690
3691 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3692 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00003693 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00003694 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003695
John McCall24fc0de2011-07-06 00:26:06 +00003696 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3697 // takes precedence.
3698 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3699 if (!GCArg)
3700 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3701 if (GCArg) {
3702 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003703 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00003704 << GCArg->getAsString(Args);
3705 } else if (getToolChain().SupportsObjCGC()) {
3706 GCArg->render(Args, CmdArgs);
3707 } else {
3708 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003709 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00003710 << GCArg->getAsString(Args);
3711 }
3712 }
3713
John McCallb5f652e2011-06-22 00:53:57 +00003714 // Add exception args.
3715 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00003716 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00003717
3718 if (getToolChain().UseSjLjExceptions())
3719 CmdArgs.push_back("-fsjlj-exceptions");
3720
3721 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00003722 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3723 options::OPT_fno_assume_sane_operator_new))
3724 CmdArgs.push_back("-fno-assume-sane-operator-new");
3725
Daniel Dunbar34d7a992010-04-27 15:34:57 +00003726 // -fconstant-cfstrings is default, and may be subject to argument translation
3727 // on Darwin.
3728 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3729 options::OPT_fno_constant_cfstrings) ||
3730 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3731 options::OPT_mno_constant_cfstrings))
3732 CmdArgs.push_back("-fno-constant-cfstrings");
3733
John Thompsoned4e2952009-11-05 20:14:16 +00003734 // -fshort-wchar default varies depending on platform; only
3735 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00003736 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
3737 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00003738 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00003739
Hans Wennborg28c96312013-07-31 23:39:13 +00003740 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003741 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003742 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003743 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003744 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003745
Daniel Dunbar096ed292011-10-05 21:04:55 +00003746 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3747 // -fno-pack-struct doesn't apply to -fpack-struct=.
3748 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00003749 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00003750 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00003751 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00003752 } else if (Args.hasFlag(options::OPT_fpack_struct,
3753 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00003754 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00003755 }
3756
Robert Lytton0e076492013-08-13 09:43:10 +00003757 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003758 if (!Args.hasArg(options::OPT_fcommon))
3759 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00003760 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003761 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00003762
Daniel Dunbard18049a2009-04-07 21:16:11 +00003763 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003764 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003765 CmdArgs.push_back("-fno-common");
3766
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003767 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00003768 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00003769 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003770 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003771 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003772 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3773
Daniel Dunbar6358d682010-10-15 22:30:42 +00003774 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3775 if (!Args.hasFlag(options::OPT_ffor_scope,
3776 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003777 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00003778 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3779
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00003780 // -fcaret-diagnostics is default.
3781 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3782 options::OPT_fno_caret_diagnostics, true))
3783 CmdArgs.push_back("-fno-caret-diagnostics");
3784
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003785 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00003786 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003787 options::OPT_fno_diagnostics_fixit_info))
3788 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003789
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003790 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00003791 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003792 options::OPT_fno_diagnostics_show_option))
3793 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003794
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003795 if (const Arg *A =
3796 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3797 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00003798 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003799 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003800
Douglas Gregor643c9222011-05-21 17:07:29 +00003801 if (const Arg *A =
3802 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3803 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003804 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003805 }
3806
Chandler Carruthb6766f02011-03-27 01:50:55 +00003807 if (Arg *A = Args.getLastArg(
3808 options::OPT_fdiagnostics_show_note_include_stack,
3809 options::OPT_fno_diagnostics_show_note_include_stack)) {
3810 if (A->getOption().matches(
3811 options::OPT_fdiagnostics_show_note_include_stack))
3812 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3813 else
3814 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3815 }
3816
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003817 // Color diagnostics are the default, unless the terminal doesn't support
3818 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00003819 // Support both clang's -f[no-]color-diagnostics and gcc's
3820 // -f[no-]diagnostics-colors[=never|always|auto].
3821 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3822 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3823 it != ie; ++it) {
3824 const Option &O = (*it)->getOption();
3825 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3826 !O.matches(options::OPT_fdiagnostics_color) &&
3827 !O.matches(options::OPT_fno_color_diagnostics) &&
3828 !O.matches(options::OPT_fno_diagnostics_color) &&
3829 !O.matches(options::OPT_fdiagnostics_color_EQ))
3830 continue;
3831
3832 (*it)->claim();
3833 if (O.matches(options::OPT_fcolor_diagnostics) ||
3834 O.matches(options::OPT_fdiagnostics_color)) {
3835 ShowColors = Colors_On;
3836 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3837 O.matches(options::OPT_fno_diagnostics_color)) {
3838 ShowColors = Colors_Off;
3839 } else {
3840 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3841 StringRef value((*it)->getValue());
3842 if (value == "always")
3843 ShowColors = Colors_On;
3844 else if (value == "never")
3845 ShowColors = Colors_Off;
3846 else if (value == "auto")
3847 ShowColors = Colors_Auto;
3848 else
3849 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3850 << ("-fdiagnostics-color=" + value).str();
3851 }
3852 }
3853 if (ShowColors == Colors_On ||
3854 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003855 CmdArgs.push_back("-fcolor-diagnostics");
3856
Nico Rieck7857d462013-09-11 00:38:02 +00003857 if (Args.hasArg(options::OPT_fansi_escape_codes))
3858 CmdArgs.push_back("-fansi-escape-codes");
3859
Daniel Dunbardb097022009-06-08 21:13:54 +00003860 if (!Args.hasFlag(options::OPT_fshow_source_location,
3861 options::OPT_fno_show_source_location))
3862 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003863
Douglas Gregor643c9222011-05-21 17:07:29 +00003864 if (!Args.hasFlag(options::OPT_fshow_column,
3865 options::OPT_fno_show_column,
3866 true))
3867 CmdArgs.push_back("-fno-show-column");
3868
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00003869 if (!Args.hasFlag(options::OPT_fspell_checking,
3870 options::OPT_fno_spell_checking))
3871 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003872
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003873
Chad Rosierc8e56e82012-12-05 21:08:21 +00003874 // -fno-asm-blocks is default.
3875 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3876 false))
3877 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003878
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003879 // Enable vectorization per default according to the optimization level
3880 // selected. For optimization levels that want vectorization we use the alias
3881 // option to simplify the hasFlag logic.
3882 bool EnableVec = shouldEnableVectorizerAtOLevel(Args);
3883 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00003884 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00003885 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00003886 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003887 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003888
Rafael Espindolaf818ef42013-08-01 23:56:42 +00003889 // -fslp-vectorize is default.
3890 if (Args.hasFlag(options::OPT_fslp_vectorize,
3891 options::OPT_fno_slp_vectorize, true))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00003892 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00003893
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003894 // -fno-slp-vectorize-aggressive is default.
3895 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003896 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003897 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003898
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00003899 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3900 A->render(Args, CmdArgs);
3901
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003902 // -fdollars-in-identifiers default varies depending on platform and
3903 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00003904 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003905 options::OPT_fno_dollars_in_identifiers)) {
3906 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003907 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003908 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003909 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003910 }
3911
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003912 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3913 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00003914 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003915 options::OPT_fno_unit_at_a_time)) {
3916 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003917 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003918 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003919
Eli Friedman055c9702011-11-02 01:53:16 +00003920 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3921 options::OPT_fno_apple_pragma_pack, false))
3922 CmdArgs.push_back("-fapple-pragma-pack");
3923
Eli Benderskyc95cfe82013-07-24 18:20:14 +00003924 // le32-specific flags:
3925 // -fno-math-builtin: clang should not convert math builtins to intrinsics
3926 // by default.
3927 if (getToolChain().getArch() == llvm::Triple::le32) {
3928 CmdArgs.push_back("-fno-math-builtin");
3929 }
3930
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003931 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003932 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003933 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003934#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003935 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003936 (getToolChain().getArch() == llvm::Triple::arm ||
3937 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003938 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3939 CmdArgs.push_back("-fno-builtin-strcat");
3940 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3941 CmdArgs.push_back("-fno-builtin-strcpy");
3942 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003943#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003944
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003945 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003946 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003947 options::OPT_traditional_cpp)) {
3948 if (isa<PreprocessJobAction>(JA))
3949 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003950 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003951 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003952 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003953
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003954 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003955 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003956
3957 // Handle serialized diagnostics.
3958 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3959 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003960 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003961 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003962
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003963 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3964 CmdArgs.push_back("-fretain-comments-from-system-headers");
3965
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003966 // Forward -fcomment-block-commands to -cc1.
3967 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00003968 // Forward -fparse-all-comments to -cc1.
3969 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003970
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003971 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3972 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003973 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003974 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3975 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003976 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003977
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003978 // We translate this by hand to the -cc1 argument, since nightly test uses
3979 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003980 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003981 CmdArgs.push_back("-disable-llvm-optzns");
3982 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003983 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003984 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003985
Daniel Dunbard67a3222009-03-30 06:36:42 +00003986 if (Output.getType() == types::TY_Dependencies) {
3987 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003988 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003989 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003990 CmdArgs.push_back(Output.getFilename());
3991 } else {
3992 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003993 }
3994
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003995 for (InputInfoList::const_iterator
3996 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3997 const InputInfo &II = *it;
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003998
3999 addDashXForInput(Args, II, CmdArgs);
4000
Daniel Dunbarb440f562010-08-02 02:38:21 +00004001 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004002 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004003 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004004 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004005 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004006
Chris Lattnere9d7d782009-11-03 19:50:27 +00004007 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4008
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004009 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004010
4011 // Optionally embed the -cc1 level arguments into the debug info, for build
4012 // analysis.
4013 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004014 ArgStringList OriginalArgs;
4015 for (ArgList::const_iterator it = Args.begin(),
4016 ie = Args.end(); it != ie; ++it)
4017 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004018
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004019 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004020 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004021 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004022 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004023 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004024 }
4025 CmdArgs.push_back("-dwarf-debug-flags");
4026 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4027 }
4028
Eric Christopherd3804002013-02-22 20:12:52 +00004029 // Add the split debug info name to the command lines here so we
4030 // can propagate it to the backend.
4031 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004032 getToolChain().getTriple().isOSLinux() &&
Eric Christopherf1545832013-02-22 23:50:16 +00004033 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004034 const char *SplitDwarfOut;
4035 if (SplitDwarf) {
4036 CmdArgs.push_back("-split-dwarf-file");
4037 SplitDwarfOut = SplitDebugName(Args, Inputs);
4038 CmdArgs.push_back(SplitDwarfOut);
4039 }
4040
4041 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004042 if (Args.hasArg(options::OPT__SLASH_fallback) &&
4043 Output.getType() == types::TY_Object) {
Hans Wennborg87cfa712013-09-19 20:32:16 +00004044 tools::visualstudio::Compile CL(getToolChain());
4045 Command *CLCommand = CL.GetCommand(C, JA, Output, Inputs, Args,
4046 LinkingOutput);
4047 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
4048 } else {
4049 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4050 }
4051
Daniel Dunbar17731772009-03-23 19:03:36 +00004052
Eric Christopherf1545832013-02-22 23:50:16 +00004053 // Handle the debug info splitting at object creation time if we're
4054 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004055 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00004056 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004057 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004058
Roman Divacky178e01602011-02-10 16:52:03 +00004059 if (Arg *A = Args.getLastArg(options::OPT_pg))
4060 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004061 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004062 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004063
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004064 // Claim some arguments which clang supports automatically.
4065
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004066 // -fpch-preprocess is used with gcc to add a special marker in the output to
4067 // include the PCH file. Clang's PTH solution is completely transparent, so we
4068 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004069 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004070
Daniel Dunbar17731772009-03-23 19:03:36 +00004071 // Claim some arguments which clang doesn't support, but we don't
4072 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004073 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4074 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004075
Rafael Espindolab0092d72013-09-04 19:37:35 +00004076 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004077 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004078}
4079
John McCall5fb5df92012-06-20 06:18:46 +00004080/// Add options related to the Objective-C runtime/ABI.
4081///
4082/// Returns true if the runtime is non-fragile.
4083ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4084 ArgStringList &cmdArgs,
4085 RewriteKind rewriteKind) const {
4086 // Look for the controlling runtime option.
4087 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4088 options::OPT_fgnu_runtime,
4089 options::OPT_fobjc_runtime_EQ);
4090
4091 // Just forward -fobjc-runtime= to the frontend. This supercedes
4092 // options about fragility.
4093 if (runtimeArg &&
4094 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4095 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004096 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004097 if (runtime.tryParse(value)) {
4098 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4099 << value;
4100 }
4101
4102 runtimeArg->render(args, cmdArgs);
4103 return runtime;
4104 }
4105
4106 // Otherwise, we'll need the ABI "version". Version numbers are
4107 // slightly confusing for historical reasons:
4108 // 1 - Traditional "fragile" ABI
4109 // 2 - Non-fragile ABI, version 1
4110 // 3 - Non-fragile ABI, version 2
4111 unsigned objcABIVersion = 1;
4112 // If -fobjc-abi-version= is present, use that to set the version.
4113 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004114 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004115 if (value == "1")
4116 objcABIVersion = 1;
4117 else if (value == "2")
4118 objcABIVersion = 2;
4119 else if (value == "3")
4120 objcABIVersion = 3;
4121 else
4122 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4123 << value;
4124 } else {
4125 // Otherwise, determine if we are using the non-fragile ABI.
4126 bool nonFragileABIIsDefault =
4127 (rewriteKind == RK_NonFragile ||
4128 (rewriteKind == RK_None &&
4129 getToolChain().IsObjCNonFragileABIDefault()));
4130 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4131 options::OPT_fno_objc_nonfragile_abi,
4132 nonFragileABIIsDefault)) {
4133 // Determine the non-fragile ABI version to use.
4134#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4135 unsigned nonFragileABIVersion = 1;
4136#else
4137 unsigned nonFragileABIVersion = 2;
4138#endif
4139
4140 if (Arg *abiArg = args.getLastArg(
4141 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004142 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004143 if (value == "1")
4144 nonFragileABIVersion = 1;
4145 else if (value == "2")
4146 nonFragileABIVersion = 2;
4147 else
4148 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4149 << value;
4150 }
4151
4152 objcABIVersion = 1 + nonFragileABIVersion;
4153 } else {
4154 objcABIVersion = 1;
4155 }
4156 }
4157
4158 // We don't actually care about the ABI version other than whether
4159 // it's non-fragile.
4160 bool isNonFragile = objcABIVersion != 1;
4161
4162 // If we have no runtime argument, ask the toolchain for its default runtime.
4163 // However, the rewriter only really supports the Mac runtime, so assume that.
4164 ObjCRuntime runtime;
4165 if (!runtimeArg) {
4166 switch (rewriteKind) {
4167 case RK_None:
4168 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4169 break;
4170 case RK_Fragile:
4171 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4172 break;
4173 case RK_NonFragile:
4174 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4175 break;
4176 }
4177
4178 // -fnext-runtime
4179 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4180 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004181 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004182 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4183
4184 // Otherwise, build for a generic macosx port.
4185 } else {
4186 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4187 }
4188
4189 // -fgnu-runtime
4190 } else {
4191 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004192 // Legacy behaviour is to target the gnustep runtime if we are i
4193 // non-fragile mode or the GCC runtime in fragile mode.
4194 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004195 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004196 else
4197 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004198 }
4199
4200 cmdArgs.push_back(args.MakeArgString(
4201 "-fobjc-runtime=" + runtime.getAsString()));
4202 return runtime;
4203}
4204
Hans Wennborg75958c42013-08-08 00:17:41 +00004205void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4206 unsigned RTOptionID = options::OPT__SLASH_MT;
4207
Hans Wennborgf1a74252013-09-10 20:18:04 +00004208 if (Args.hasArg(options::OPT__SLASH_LDd))
4209 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4210 // but defining _DEBUG is sticky.
4211 RTOptionID = options::OPT__SLASH_MTd;
4212
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004213 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004214 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004215
Hans Wennborg75958c42013-08-08 00:17:41 +00004216 switch(RTOptionID) {
4217 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004218 if (Args.hasArg(options::OPT__SLASH_LDd))
4219 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004220 CmdArgs.push_back("-D_MT");
4221 CmdArgs.push_back("-D_DLL");
4222 CmdArgs.push_back("--dependent-lib=msvcrt");
4223 break;
4224 case options::OPT__SLASH_MDd:
4225 CmdArgs.push_back("-D_DEBUG");
4226 CmdArgs.push_back("-D_MT");
4227 CmdArgs.push_back("-D_DLL");
4228 CmdArgs.push_back("--dependent-lib=msvcrtd");
4229 break;
4230 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004231 if (Args.hasArg(options::OPT__SLASH_LDd))
4232 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004233 CmdArgs.push_back("-D_MT");
4234 CmdArgs.push_back("--dependent-lib=libcmt");
4235 break;
4236 case options::OPT__SLASH_MTd:
4237 CmdArgs.push_back("-D_DEBUG");
4238 CmdArgs.push_back("-D_MT");
4239 CmdArgs.push_back("--dependent-lib=libcmtd");
4240 break;
4241 default:
4242 llvm_unreachable("Unexpected option ID.");
4243 }
4244
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004245 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4246 // users want. The /Za flag to cl.exe turns this off, but it's not
4247 // implemented in clang.
4248 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004249
Hans Wennborg0fd62072013-08-09 00:32:23 +00004250 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4251 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004252
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004253 // RTTI is currently not supported, so disable it by default.
4254 if (!Args.hasArg(options::OPT_frtti, options::OPT_fno_rtti))
4255 CmdArgs.push_back("-fno-rtti");
4256
Hans Wennborgd8d49ba2014-03-25 17:50:25 +00004257 // Let -ffunction-sections imply -fdata-sections.
4258 if (Arg * A = Args.getLastArg(options::OPT_ffunction_sections,
4259 options::OPT_fno_function_sections))
4260 if (A->getOption().matches(options::OPT_ffunction_sections))
4261 CmdArgs.push_back("-fdata-sections");
4262
David Majnemer86c318f2014-02-11 21:05:00 +00004263 const Driver &D = getToolChain().getDriver();
4264 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
4265 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
4266 if (MostGeneralArg && BestCaseArg)
4267 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4268 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
4269
4270 if (MostGeneralArg) {
4271 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
4272 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
4273 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
4274
4275 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
4276 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
4277 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
4278 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4279 << FirstConflict->getAsString(Args)
4280 << SecondConflict->getAsString(Args);
4281
4282 if (SingleArg)
4283 CmdArgs.push_back("-fms-memptr-rep=single");
4284 else if (MultipleArg)
4285 CmdArgs.push_back("-fms-memptr-rep=multiple");
4286 else
4287 CmdArgs.push_back("-fms-memptr-rep=virtual");
4288 }
4289
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00004290 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
4291 A->render(Args, CmdArgs);
4292
Hans Wennborg81f74482013-09-10 01:07:07 +00004293 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
4294 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00004295 if (Args.hasArg(options::OPT__SLASH_fallback))
4296 CmdArgs.push_back("msvc-fallback");
4297 else
4298 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00004299 }
Hans Wennborg75958c42013-08-08 00:17:41 +00004300}
4301
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004302void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004303 const InputInfo &Output,
4304 const InputInfoList &Inputs,
4305 const ArgList &Args,
4306 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004307 ArgStringList CmdArgs;
4308
4309 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4310 const InputInfo &Input = Inputs[0];
4311
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004312 // Don't warn about "clang -w -c foo.s"
4313 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00004314 // and "clang -emit-llvm -c foo.s"
4315 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004316
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004317 // Invoke ourselves in -cc1as mode.
4318 //
4319 // FIXME: Implement custom jobs for internal actions.
4320 CmdArgs.push_back("-cc1as");
4321
4322 // Add the "effective" target triple.
4323 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00004324 std::string TripleStr =
4325 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004326 CmdArgs.push_back(Args.MakeArgString(TripleStr));
4327
4328 // Set the output mode, we currently only expect to be used as a real
4329 // assembler.
4330 CmdArgs.push_back("-filetype");
4331 CmdArgs.push_back("obj");
4332
Eric Christopher45f2e712012-12-18 00:31:10 +00004333 // Set the main file name, so that debug info works even with
4334 // -save-temps or preprocessed assembly.
4335 CmdArgs.push_back("-main-file-name");
4336 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
4337
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004338 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004339 const llvm::Triple &Triple = getToolChain().getTriple();
4340 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004341 if (!CPU.empty()) {
4342 CmdArgs.push_back("-target-cpu");
4343 CmdArgs.push_back(Args.MakeArgString(CPU));
4344 }
4345
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004346 // Add the target features
4347 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00004348 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00004349
Daniel Dunbar1d733e22011-03-17 17:37:29 +00004350 // Ignore explicit -force_cpusubtype_ALL option.
4351 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004352
Eric Christopherfc3ee562012-01-10 00:38:01 +00004353 // Determine the original source input.
4354 const Action *SourceAction = &JA;
4355 while (SourceAction->getKind() != Action::InputClass) {
4356 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4357 SourceAction = SourceAction->getInputs()[0];
4358 }
4359
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004360 // Forward -g and handle debug info related flags, assuming we are dealing
4361 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00004362 if (SourceAction->getType() == types::TY_Asm ||
4363 SourceAction->getType() == types::TY_PP_Asm) {
4364 Args.ClaimAllArgs(options::OPT_g_Group);
4365 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
4366 if (!A->getOption().matches(options::OPT_g0))
4367 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004368
4369 // Add the -fdebug-compilation-dir flag if needed.
4370 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00004371
4372 // Set the AT_producer to the clang version when using the integrated
4373 // assembler on assembly source files.
4374 CmdArgs.push_back("-dwarf-debug-producer");
4375 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00004376 }
Kevin Enderby292dc082011-12-22 19:31:58 +00004377
4378 // Optionally embed the -cc1as level arguments into the debug info, for build
4379 // analysis.
4380 if (getToolChain().UseDwarfDebugFlags()) {
4381 ArgStringList OriginalArgs;
4382 for (ArgList::const_iterator it = Args.begin(),
4383 ie = Args.end(); it != ie; ++it)
4384 (*it)->render(Args, OriginalArgs);
4385
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004386 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00004387 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4388 Flags += Exec;
4389 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
4390 Flags += " ";
4391 Flags += OriginalArgs[i];
4392 }
4393 CmdArgs.push_back("-dwarf-debug-flags");
4394 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4395 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004396
4397 // FIXME: Add -static support, once we have it.
4398
David Blaikie372d9502014-01-17 03:17:40 +00004399 // Consume all the warning flags. Usually this would be handled more
4400 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
4401 // doesn't handle that so rather than warning about unused flags that are
4402 // actually used, we'll lie by omission instead.
4403 // FIXME: Stop lying and consume only the appropriate driver flags
4404 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
4405 ie = Args.filtered_end();
4406 it != ie; ++it)
4407 (*it)->claim();
4408
David Blaikie9260ed62013-07-25 21:19:01 +00004409 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
4410 getToolChain().getDriver());
4411
Daniel Dunbar252e8f92011-04-29 17:53:18 +00004412 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004413
4414 assert(Output.isFilename() && "Unexpected lipo output.");
4415 CmdArgs.push_back("-o");
4416 CmdArgs.push_back(Output.getFilename());
4417
Daniel Dunbarb440f562010-08-02 02:38:21 +00004418 assert(Input.isFilename() && "Invalid input.");
4419 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004420
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004421 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004422 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00004423
4424 // Handle the debug info splitting at object creation time if we're
4425 // creating an object.
4426 // TODO: Currently only works on linux with newer objcopy.
4427 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004428 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00004429 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
4430 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004431}
4432
Daniel Dunbara3246a02009-03-18 08:07:30 +00004433void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004434 const InputInfo &Output,
4435 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004436 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004437 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004438 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00004439 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004440
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004441 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004442 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004443 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00004444 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00004445 // Don't forward any -g arguments to assembly steps.
4446 if (isa<AssembleJobAction>(JA) &&
4447 A->getOption().matches(options::OPT_g_Group))
4448 continue;
4449
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00004450 // Don't forward any -W arguments to assembly and link steps.
4451 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4452 A->getOption().matches(options::OPT_W_Group))
4453 continue;
4454
Daniel Dunbar2da02722009-03-19 07:55:12 +00004455 // It is unfortunate that we have to claim here, as this means
4456 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00004457 // platforms using a generic gcc, even if we are just using gcc
4458 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00004459 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004460 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00004461 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004462 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004463
Daniel Dunbar4e295052010-01-25 22:35:08 +00004464 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004465
4466 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004467 llvm::Triple::ArchType Arch = getToolChain().getArch();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004468 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004469 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00004470
4471 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004472 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004473 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004474 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004475 CmdArgs.push_back("ppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00004476 else if (Arch == llvm::Triple::ppc64le)
4477 CmdArgs.push_back("ppc64le");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004478 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004479 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00004480 }
4481
Daniel Dunbar5716d872009-05-02 21:41:52 +00004482 // Try to force gcc to match the tool chain we want, if we recognize
4483 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004484 //
4485 // FIXME: The triple class should directly provide the information we want
4486 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004487 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004488 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00004489 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4490 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004491 CmdArgs.push_back("-m64");
4492
Daniel Dunbarb440f562010-08-02 02:38:21 +00004493 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004494 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004495 CmdArgs.push_back(Output.getFilename());
4496 } else {
4497 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004498 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004499 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004500
Tony Linthicum76329bf2011-12-12 21:14:55 +00004501 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4502 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004503
4504 // Only pass -x if gcc will understand it; otherwise hope gcc
4505 // understands the suffix correctly. The main use case this would go
4506 // wrong in is for linker inputs if they happened to have an odd
4507 // suffix; really the only way to get this to happen is a command
4508 // like '-x foobar a.c' which will treat a.c like a linker input.
4509 //
4510 // FIXME: For the linker case specifically, can we safely convert
4511 // inputs into '-Wl,' options?
4512 for (InputInfoList::const_iterator
4513 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4514 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004515
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004516 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004517 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4518 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004519 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004520 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004521 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004522 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004523 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004524 else if (II.getType() == types::TY_ModuleFile)
4525 D.Diag(diag::err_drv_no_module_support)
4526 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004527
Daniel Dunbara3246a02009-03-18 08:07:30 +00004528 if (types::canTypeBeUserSpecified(II.getType())) {
4529 CmdArgs.push_back("-x");
4530 CmdArgs.push_back(types::getTypeName(II.getType()));
4531 }
4532
Daniel Dunbarb440f562010-08-02 02:38:21 +00004533 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004534 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00004535 else {
4536 const Arg &A = II.getInputArg();
4537
4538 // Reverse translate some rewritten options.
4539 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4540 CmdArgs.push_back("-lstdc++");
4541 continue;
4542 }
4543
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004544 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00004545 A.render(Args, CmdArgs);
4546 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004547 }
4548
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004549 const std::string customGCCName = D.getCCCGenericGCCName();
4550 const char *GCCName;
4551 if (!customGCCName.empty())
4552 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00004553 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004554 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004555 } else
4556 GCCName = "gcc";
4557
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004558 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004559 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004560 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004561}
4562
Daniel Dunbar4e295052010-01-25 22:35:08 +00004563void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4564 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004565 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004566}
4567
Daniel Dunbar4e295052010-01-25 22:35:08 +00004568void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4569 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004570 const Driver &D = getToolChain().getDriver();
4571
Daniel Dunbar4e295052010-01-25 22:35:08 +00004572 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004573 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4574 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00004575 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004576 else {
4577 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004578 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004579 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004580
Daniel Dunbar4e295052010-01-25 22:35:08 +00004581 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004582 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004583}
4584
Daniel Dunbar4e295052010-01-25 22:35:08 +00004585void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4586 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004587 // The types are (hopefully) good enough.
4588}
4589
Tony Linthicum76329bf2011-12-12 21:14:55 +00004590// Hexagon tools start.
4591void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4592 ArgStringList &CmdArgs) const {
4593
4594}
4595void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4596 const InputInfo &Output,
4597 const InputInfoList &Inputs,
4598 const ArgList &Args,
4599 const char *LinkingOutput) const {
4600
4601 const Driver &D = getToolChain().getDriver();
4602 ArgStringList CmdArgs;
4603
4604 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00004605 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00004606 CmdArgs.push_back(Args.MakeArgString(MarchString));
4607
4608 RenderExtraToolArgs(JA, CmdArgs);
4609
4610 if (Output.isFilename()) {
4611 CmdArgs.push_back("-o");
4612 CmdArgs.push_back(Output.getFilename());
4613 } else {
4614 assert(Output.isNothing() && "Unexpected output");
4615 CmdArgs.push_back("-fsyntax-only");
4616 }
4617
Matthew Curtise8f80a12012-12-06 17:49:03 +00004618 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4619 if (!SmallDataThreshold.empty())
4620 CmdArgs.push_back(
4621 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004622
Matthew Curtise5df3812012-12-07 17:23:04 +00004623 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4624 options::OPT_Xassembler);
4625
Tony Linthicum76329bf2011-12-12 21:14:55 +00004626 // Only pass -x if gcc will understand it; otherwise hope gcc
4627 // understands the suffix correctly. The main use case this would go
4628 // wrong in is for linker inputs if they happened to have an odd
4629 // suffix; really the only way to get this to happen is a command
4630 // like '-x foobar a.c' which will treat a.c like a linker input.
4631 //
4632 // FIXME: For the linker case specifically, can we safely convert
4633 // inputs into '-Wl,' options?
4634 for (InputInfoList::const_iterator
4635 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4636 const InputInfo &II = *it;
4637
4638 // Don't try to pass LLVM or AST inputs to a generic gcc.
4639 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4640 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4641 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4642 << getToolChain().getTripleString();
4643 else if (II.getType() == types::TY_AST)
4644 D.Diag(clang::diag::err_drv_no_ast_support)
4645 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004646 else if (II.getType() == types::TY_ModuleFile)
4647 D.Diag(diag::err_drv_no_module_support)
4648 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00004649
4650 if (II.isFilename())
4651 CmdArgs.push_back(II.getFilename());
4652 else
4653 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4654 II.getInputArg().render(Args, CmdArgs);
4655 }
4656
4657 const char *GCCName = "hexagon-as";
4658 const char *Exec =
4659 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4660 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4661
4662}
4663void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4664 ArgStringList &CmdArgs) const {
4665 // The types are (hopefully) good enough.
4666}
4667
4668void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4669 const InputInfo &Output,
4670 const InputInfoList &Inputs,
4671 const ArgList &Args,
4672 const char *LinkingOutput) const {
4673
Matthew Curtise689b052012-12-06 15:46:07 +00004674 const toolchains::Hexagon_TC& ToolChain =
4675 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4676 const Driver &D = ToolChain.getDriver();
4677
Tony Linthicum76329bf2011-12-12 21:14:55 +00004678 ArgStringList CmdArgs;
4679
Matthew Curtise689b052012-12-06 15:46:07 +00004680 //----------------------------------------------------------------------------
4681 //
4682 //----------------------------------------------------------------------------
4683 bool hasStaticArg = Args.hasArg(options::OPT_static);
4684 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00004685 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00004686 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4687 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4688 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4689 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004690
Matthew Curtise689b052012-12-06 15:46:07 +00004691 //----------------------------------------------------------------------------
4692 // Silence warnings for various options
4693 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00004694
Matthew Curtise689b052012-12-06 15:46:07 +00004695 Args.ClaimAllArgs(options::OPT_g_Group);
4696 Args.ClaimAllArgs(options::OPT_emit_llvm);
4697 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4698 // handled somewhere else.
4699 Args.ClaimAllArgs(options::OPT_static_libgcc);
4700
4701 //----------------------------------------------------------------------------
4702 //
4703 //----------------------------------------------------------------------------
4704 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4705 e = ToolChain.ExtraOpts.end();
4706 i != e; ++i)
4707 CmdArgs.push_back(i->c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004708
Matthew Curtisf10a5952012-12-06 14:16:43 +00004709 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4710 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00004711
Matthew Curtise689b052012-12-06 15:46:07 +00004712 if (buildingLib) {
4713 CmdArgs.push_back("-shared");
4714 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4715 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00004716 }
4717
Matthew Curtise689b052012-12-06 15:46:07 +00004718 if (hasStaticArg)
4719 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004720
Matthew Curtise8f80a12012-12-06 17:49:03 +00004721 if (buildPIE && !buildingLib)
4722 CmdArgs.push_back("-pie");
4723
4724 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4725 if (!SmallDataThreshold.empty()) {
4726 CmdArgs.push_back(
4727 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4728 }
4729
Matthew Curtise689b052012-12-06 15:46:07 +00004730 //----------------------------------------------------------------------------
4731 //
4732 //----------------------------------------------------------------------------
4733 CmdArgs.push_back("-o");
4734 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004735
Matthew Curtise689b052012-12-06 15:46:07 +00004736 const std::string MarchSuffix = "/" + MarchString;
4737 const std::string G0Suffix = "/G0";
4738 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4739 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4740 + "/";
4741 const std::string StartFilesDir = RootDir
4742 + "hexagon/lib"
4743 + (buildingLib
4744 ? MarchG0Suffix : MarchSuffix);
4745
4746 //----------------------------------------------------------------------------
4747 // moslib
4748 //----------------------------------------------------------------------------
4749 std::vector<std::string> oslibs;
4750 bool hasStandalone= false;
4751
4752 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4753 ie = Args.filtered_end(); it != ie; ++it) {
4754 (*it)->claim();
4755 oslibs.push_back((*it)->getValue());
4756 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004757 }
Matthew Curtise689b052012-12-06 15:46:07 +00004758 if (oslibs.empty()) {
4759 oslibs.push_back("standalone");
4760 hasStandalone = true;
4761 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004762
Matthew Curtise689b052012-12-06 15:46:07 +00004763 //----------------------------------------------------------------------------
4764 // Start Files
4765 //----------------------------------------------------------------------------
4766 if (incStdLib && incStartFiles) {
4767
4768 if (!buildingLib) {
4769 if (hasStandalone) {
4770 CmdArgs.push_back(
4771 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4772 }
4773 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4774 }
4775 std::string initObj = useShared ? "/initS.o" : "/init.o";
4776 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4777 }
4778
4779 //----------------------------------------------------------------------------
4780 // Library Search Paths
4781 //----------------------------------------------------------------------------
4782 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4783 for (ToolChain::path_list::const_iterator
4784 i = LibPaths.begin(),
4785 e = LibPaths.end();
4786 i != e;
4787 ++i)
4788 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4789
4790 //----------------------------------------------------------------------------
4791 //
4792 //----------------------------------------------------------------------------
4793 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4794 Args.AddAllArgs(CmdArgs, options::OPT_e);
4795 Args.AddAllArgs(CmdArgs, options::OPT_s);
4796 Args.AddAllArgs(CmdArgs, options::OPT_t);
4797 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4798
4799 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4800
4801 //----------------------------------------------------------------------------
4802 // Libraries
4803 //----------------------------------------------------------------------------
4804 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00004805 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00004806 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4807 CmdArgs.push_back("-lm");
4808 }
4809
4810 CmdArgs.push_back("--start-group");
4811
4812 if (!buildingLib) {
4813 for(std::vector<std::string>::iterator i = oslibs.begin(),
4814 e = oslibs.end(); i != e; ++i)
4815 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4816 CmdArgs.push_back("-lc");
4817 }
4818 CmdArgs.push_back("-lgcc");
4819
4820 CmdArgs.push_back("--end-group");
4821 }
4822
4823 //----------------------------------------------------------------------------
4824 // End files
4825 //----------------------------------------------------------------------------
4826 if (incStdLib && incStartFiles) {
4827 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4828 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4829 }
4830
4831 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00004832 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004833}
4834// Hexagon tools end.
4835
Bernard Ogden31561762013-12-12 13:27:11 +00004836/// getARMCPUForMArch - Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting
4837//
4838// FIXME: tblgen this.
4839const char *arm::getARMCPUForMArch(const ArgList &Args,
4840 const llvm::Triple &Triple) {
4841 StringRef MArch;
4842 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
4843 // Otherwise, if we have -march= choose the base CPU for that arch.
4844 MArch = A->getValue();
4845 } else {
4846 // Otherwise, use the Arch from the triple.
4847 MArch = Triple.getArchName();
4848 }
4849
4850 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00004851 if (MArch == "native") {
4852 std::string CPU = llvm::sys::getHostCPUName();
4853 if (CPU != "generic") {
4854 // Translate the native cpu into the architecture. The switch below will
4855 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00004856 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00004857 }
4858 }
4859
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004860 switch (Triple.getOS()) {
4861 case llvm::Triple::NetBSD:
Bernard Ogden31561762013-12-12 13:27:11 +00004862 if (MArch == "armv6")
4863 return "arm1176jzf-s";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004864 break;
4865 case llvm::Triple::Win32:
4866 // FIXME: this is invalid for WindowsCE
4867 return "cortex-a9";
4868 default:
4869 break;
Bernard Ogden31561762013-12-12 13:27:11 +00004870 }
4871
4872 const char *result = llvm::StringSwitch<const char *>(MArch)
4873 .Cases("armv2", "armv2a","arm2")
4874 .Case("armv3", "arm6")
4875 .Case("armv3m", "arm7m")
4876 .Case("armv4", "strongarm")
4877 .Case("armv4t", "arm7tdmi")
4878 .Case("thumbv4t", "arm7tdmi")
4879 .Cases("armv5", "armv5t", "arm10tdmi")
4880 .Cases("thumbv5", "thumbv5t", "arm10tdmi")
4881 .Cases("armv5e", "armv5te", "arm1022e")
4882 .Cases("thumbv5e", "thumbv5te", "arm1022e")
4883 .Case("armv5tej", "arm926ej-s")
4884 .Case("thumbv5tej", "arm926ej-s")
4885 .Cases("armv6", "armv6k", "arm1136jf-s")
4886 .Cases("thumbv6", "thumbv6k", "arm1136jf-s")
4887 .Case("armv6j", "arm1136j-s")
4888 .Case("thumbv6j", "arm1136j-s")
4889 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
4890 .Cases("thumbv6z", "thumbv6zk", "arm1176jzf-s")
4891 .Case("armv6t2", "arm1156t2-s")
4892 .Case("thumbv6t2", "arm1156t2-s")
4893 .Cases("armv6m", "armv6-m", "cortex-m0")
4894 .Case("thumbv6m", "cortex-m0")
4895 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004896 .Cases("armebv7", "armebv7a", "armebv7-a", "cortex-a8")
Bernard Ogden31561762013-12-12 13:27:11 +00004897 .Cases("thumbv7", "thumbv7a", "cortex-a8")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004898 .Cases("thumbebv7", "thumbebv7a", "cortex-a8")
Bernard Ogden31561762013-12-12 13:27:11 +00004899 .Cases("armv7l", "armv7-l", "cortex-a8")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004900 .Cases("armebv7l", "armebv7-l", "cortex-a8")
Bernard Ogden31561762013-12-12 13:27:11 +00004901 .Cases("armv7s", "armv7-s", "swift")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004902 .Cases("armebv7s", "armebv7-s", "swift")
Bernard Ogden31561762013-12-12 13:27:11 +00004903 .Cases("armv7r", "armv7-r", "cortex-r4")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004904 .Cases("armebv7r", "armebv7-r", "cortex-r4")
Bernard Ogden31561762013-12-12 13:27:11 +00004905 .Case("thumbv7r", "cortex-r4")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004906 .Case("thumbebv7r", "cortex-r4")
Bernard Ogden31561762013-12-12 13:27:11 +00004907 .Cases("armv7m", "armv7-m", "cortex-m3")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004908 .Cases("armebv7m", "armebv7-m", "cortex-m3")
Bernard Ogden31561762013-12-12 13:27:11 +00004909 .Case("thumbv7m", "cortex-m3")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004910 .Case("thumbebv7m", "cortex-m3")
Bernard Ogden31561762013-12-12 13:27:11 +00004911 .Cases("armv7em", "armv7e-m", "cortex-m4")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004912 .Cases("armebv7em", "armebv7e-m", "cortex-m4")
Bernard Ogden31561762013-12-12 13:27:11 +00004913 .Cases("thumbv7em", "thumbv7e-m", "cortex-m4")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004914 .Cases("thumbebv7em", "thumbebv7e-m", "cortex-m4")
Bernard Ogden31561762013-12-12 13:27:11 +00004915 .Cases("armv8", "armv8a", "armv8-a", "cortex-a53")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004916 .Cases("armebv8", "armebv8a", "armebv8-a", "cortex-a53")
Bernard Ogden31561762013-12-12 13:27:11 +00004917 .Cases("thumbv8", "thumbv8a", "cortex-a53")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004918 .Cases("thumbebv8", "thumbebv8a", "cortex-a53")
Bernard Ogden31561762013-12-12 13:27:11 +00004919 .Case("ep9312", "ep9312")
4920 .Case("iwmmxt", "iwmmxt")
4921 .Case("xscale", "xscale")
4922 // If all else failed, return the most base CPU with thumb interworking
4923 // supported by LLVM.
4924 .Default(0);
4925
4926 if (result)
4927 return result;
4928
Joerg Sonnenberger695fdb32014-02-21 21:53:33 +00004929 switch (Triple.getOS()) {
4930 case llvm::Triple::NetBSD:
4931 switch (Triple.getEnvironment()) {
4932 case llvm::Triple::GNUEABIHF:
4933 case llvm::Triple::GNUEABI:
4934 case llvm::Triple::EABIHF:
4935 case llvm::Triple::EABI:
4936 return "arm926ej-s";
4937 default:
4938 return "strongarm";
4939 }
4940 default:
4941 switch (Triple.getEnvironment()) {
4942 case llvm::Triple::EABIHF:
4943 case llvm::Triple::GNUEABIHF:
4944 return "arm1176jzf-s";
4945 default:
4946 return "arm7tdmi";
4947 }
4948 }
Bernard Ogden31561762013-12-12 13:27:11 +00004949}
4950
4951/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00004952StringRef arm::getARMTargetCPU(const ArgList &Args,
4953 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00004954 // FIXME: Warn on inconsistent use of -mcpu and -march.
4955 // If we have -mcpu=, use that.
4956 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
4957 StringRef MCPU = A->getValue();
4958 // Handle -mcpu=native.
4959 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00004960 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00004961 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00004962 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00004963 }
4964
4965 return getARMCPUForMArch(Args, Triple);
4966}
4967
4968/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
4969/// CPU.
4970//
4971// FIXME: This is redundant with -mcpu, why does LLVM use this.
4972// FIXME: tblgen this, or kill it!
4973const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
4974 return llvm::StringSwitch<const char *>(CPU)
4975 .Case("strongarm", "v4")
4976 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
4977 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
4978 .Cases("arm920", "arm920t", "arm922t", "v4t")
4979 .Cases("arm940t", "ep9312","v4t")
4980 .Cases("arm10tdmi", "arm1020t", "v5")
4981 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
4982 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
4983 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
4984 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
4985 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
4986 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Bob Wilsonb767d152014-01-15 21:43:40 +00004987 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "v7")
Bernard Ogden31561762013-12-12 13:27:11 +00004988 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "v7")
4989 .Cases("cortex-r4", "cortex-r5", "v7r")
4990 .Case("cortex-m0", "v6m")
4991 .Case("cortex-m3", "v7m")
4992 .Case("cortex-m4", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00004993 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00004994 .Case("cyclone", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00004995 .Cases("cortex-a53", "cortex-a57", "v8")
4996 .Default("");
4997}
4998
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004999bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5000 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5001 return A && (A->getValue() == StringRef(Value));
5002}
5003
Tim Northover157d9112014-01-16 08:48:16 +00005004llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005005 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5006 // archs which Darwin doesn't use.
5007
5008 // The matching this routine does is fairly pointless, since it is neither the
5009 // complete architecture list, nor a reasonable subset. The problem is that
5010 // historically the driver driver accepts this and also ties its -march=
5011 // handling to the architecture name, so we need to be careful before removing
5012 // support for it.
5013
5014 // This code must be kept in sync with Clang's Darwin specific argument
5015 // translation.
5016
5017 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5018 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5019 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5020 .Case("ppc64", llvm::Triple::ppc64)
5021 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5022 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5023 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005024 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005025 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005026 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005027 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005028 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northovera2ee4332014-03-29 15:09:45 +00005029 .Case("arm64", llvm::Triple::arm64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005030 .Case("r600", llvm::Triple::r600)
5031 .Case("nvptx", llvm::Triple::nvptx)
5032 .Case("nvptx64", llvm::Triple::nvptx64)
5033 .Case("amdil", llvm::Triple::amdil)
5034 .Case("spir", llvm::Triple::spir)
5035 .Default(llvm::Triple::UnknownArch);
5036}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005037
Tim Northover157d9112014-01-16 08:48:16 +00005038void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5039 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5040 T.setArch(Arch);
5041
5042 if (Str == "x86_64h")
5043 T.setArchName(Str);
5044 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5045 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005046 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005047 }
5048}
5049
Bob Wilsondecc03e2012-11-23 06:14:39 +00005050const char *Clang::getBaseInputName(const ArgList &Args,
5051 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00005052 return Args.MakeArgString(
5053 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005054}
5055
Bob Wilsondecc03e2012-11-23 06:14:39 +00005056const char *Clang::getBaseInputStem(const ArgList &Args,
5057 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005058 const char *Str = getBaseInputName(Args, Inputs);
5059
Chris Lattner906bb902011-01-16 08:14:11 +00005060 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005061 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005062
5063 return Str;
5064}
5065
Bob Wilsondecc03e2012-11-23 06:14:39 +00005066const char *Clang::getDependencyFileName(const ArgList &Args,
5067 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005068 // FIXME: Think about this more.
5069 std::string Res;
5070
5071 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005072 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005073 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005074 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005075 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005076 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005077 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005078}
5079
Daniel Dunbarbe220842009-03-20 16:06:39 +00005080void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005081 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005082 const InputInfoList &Inputs,
5083 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005084 const char *LinkingOutput) const {
5085 ArgStringList CmdArgs;
5086
5087 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5088 const InputInfo &Input = Inputs[0];
5089
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005090 // Determine the original source input.
5091 const Action *SourceAction = &JA;
5092 while (SourceAction->getKind() != Action::InputClass) {
5093 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5094 SourceAction = SourceAction->getInputs()[0];
5095 }
5096
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005097 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005098 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005099 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5100 // FIXME: at run-time detect assembler capabilities or rely on version
5101 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005102 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005103 const llvm::Triple &T(getToolChain().getTriple());
5104 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005105 CmdArgs.push_back("-Q");
5106 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005107
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005108 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005109 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005110 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005111 if (Args.hasArg(options::OPT_gstabs))
5112 CmdArgs.push_back("--gstabs");
5113 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005114 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005115 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005116
Daniel Dunbarbe220842009-03-20 16:06:39 +00005117 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005118 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005119
Daniel Dunbar6d484762010-07-22 01:47:22 +00005120 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005121 if (getToolChain().getArch() == llvm::Triple::x86 ||
5122 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00005123 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5124 CmdArgs.push_back("-force_cpusubtype_ALL");
5125
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005126 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005127 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00005128 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00005129 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005130 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005131 CmdArgs.push_back("-static");
5132
Daniel Dunbarbe220842009-03-20 16:06:39 +00005133 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5134 options::OPT_Xassembler);
5135
5136 assert(Output.isFilename() && "Unexpected lipo output.");
5137 CmdArgs.push_back("-o");
5138 CmdArgs.push_back(Output.getFilename());
5139
Daniel Dunbarb440f562010-08-02 02:38:21 +00005140 assert(Input.isFilename() && "Invalid input.");
5141 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00005142
5143 // asm_final spec is empty.
5144
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005145 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005146 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005147 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00005148}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005149
Tim Northover157d9112014-01-16 08:48:16 +00005150void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00005151
Tim Northover157d9112014-01-16 08:48:16 +00005152void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5153 ArgStringList &CmdArgs) const {
5154 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005155
Daniel Dunbarc1964212009-03-26 16:23:12 +00005156 // Derived from darwin_arch spec.
5157 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005158 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005159
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005160 // FIXME: Is this needed anymore?
5161 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005162 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005163}
5164
Bill Wendling3b2000f2012-10-02 18:02:50 +00005165bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5166 // We only need to generate a temp path for LTO if we aren't compiling object
5167 // files. When compiling source files, we run 'dsymutil' after linking. We
5168 // don't run 'dsymutil' when compiling object files.
5169 for (InputInfoList::const_iterator
5170 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
5171 if (it->getType() != types::TY_Object)
5172 return true;
5173
5174 return false;
5175}
5176
Daniel Dunbarccbc4522010-09-09 21:51:05 +00005177void darwin::Link::AddLinkArgs(Compilation &C,
5178 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00005179 ArgStringList &CmdArgs,
5180 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005181 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00005182 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00005183
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005184 unsigned Version[3] = { 0, 0, 0 };
5185 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
5186 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00005187 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005188 Version[1], Version[2], HadExtra) ||
5189 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005190 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005191 << A->getAsString(Args);
5192 }
5193
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005194 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005195 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005196 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5197 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005198
Bob Wilson3d27dad2013-08-02 22:25:34 +00005199 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
5200 CmdArgs.push_back("-export_dynamic");
5201
Bill Wendling313b6bf2012-11-16 23:03:00 +00005202 // If we are using LTO, then automatically create a temporary file path for
5203 // the linker to use, so that it's lifetime will extend past a possible
5204 // dsymutil step.
5205 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
5206 const char *TmpPath = C.getArgs().MakeArgString(
5207 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
5208 C.addTempFile(TmpPath);
5209 CmdArgs.push_back("-object_path_lto");
5210 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00005211 }
5212
Daniel Dunbarc1964212009-03-26 16:23:12 +00005213 // Derived from the "link" spec.
5214 Args.AddAllArgs(CmdArgs, options::OPT_static);
5215 if (!Args.hasArg(options::OPT_static))
5216 CmdArgs.push_back("-dynamic");
5217 if (Args.hasArg(options::OPT_fgnu_runtime)) {
5218 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
5219 // here. How do we wish to handle such things?
5220 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005221
Daniel Dunbarc1964212009-03-26 16:23:12 +00005222 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00005223 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00005224 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00005225 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005226
5227 Args.AddLastArg(CmdArgs, options::OPT_bundle);
5228 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
5229 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
5230
5231 Arg *A;
5232 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
5233 (A = Args.getLastArg(options::OPT_current__version)) ||
5234 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005235 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005236 << A->getAsString(Args) << "-dynamiclib";
5237
5238 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
5239 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
5240 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
5241 } else {
5242 CmdArgs.push_back("-dylib");
5243
5244 Arg *A;
5245 if ((A = Args.getLastArg(options::OPT_bundle)) ||
5246 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
5247 (A = Args.getLastArg(options::OPT_client__name)) ||
5248 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
5249 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
5250 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005251 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005252 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005253
Daniel Dunbarc1964212009-03-26 16:23:12 +00005254 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
5255 "-dylib_compatibility_version");
5256 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
5257 "-dylib_current_version");
5258
Tim Northover157d9112014-01-16 08:48:16 +00005259 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005260
5261 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
5262 "-dylib_install_name");
5263 }
5264
5265 Args.AddLastArg(CmdArgs, options::OPT_all__load);
5266 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
5267 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00005268 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005269 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005270 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
5271 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
5272 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
5273 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
5274 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
5275 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00005276 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005277 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
5278 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
5279 Args.AddAllArgs(CmdArgs, options::OPT_init);
5280
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005281 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00005282 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005283
Daniel Dunbarc1964212009-03-26 16:23:12 +00005284 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
5285 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
5286 Args.AddLastArg(CmdArgs, options::OPT_single__module);
5287 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
5288 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005289
Daniel Dunbaraf68a882010-07-13 23:31:40 +00005290 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
5291 options::OPT_fno_pie,
5292 options::OPT_fno_PIE)) {
5293 if (A->getOption().matches(options::OPT_fpie) ||
5294 A->getOption().matches(options::OPT_fPIE))
5295 CmdArgs.push_back("-pie");
5296 else
5297 CmdArgs.push_back("-no_pie");
5298 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005299
5300 Args.AddLastArg(CmdArgs, options::OPT_prebind);
5301 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
5302 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
5303 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
5304 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
5305 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
5306 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
5307 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
5308 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
5309 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
5310 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
5311 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
5312 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
5313 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
5314 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
5315 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005316
Daniel Dunbar84384642011-05-02 21:03:47 +00005317 // Give --sysroot= preference, over the Apple specific behavior to also use
5318 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00005319 StringRef sysroot = C.getSysRoot();
5320 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00005321 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00005322 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00005323 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5324 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00005325 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005326 }
5327
Daniel Dunbarc1964212009-03-26 16:23:12 +00005328 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
5329 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
5330 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
5331 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
5332 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005333 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005334 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
5335 Args.AddAllArgs(CmdArgs, options::OPT_y);
5336 Args.AddLastArg(CmdArgs, options::OPT_w);
5337 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
5338 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
5339 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
5340 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
5341 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
5342 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
5343 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
5344 Args.AddLastArg(CmdArgs, options::OPT_whyload);
5345 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
5346 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
5347 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
5348 Args.AddLastArg(CmdArgs, options::OPT_Mach);
5349}
5350
Alexey Bataev186b28a2014-03-06 05:43:53 +00005351enum LibOpenMP {
5352 LibUnknown,
5353 LibGOMP,
5354 LibIOMP5
5355};
5356
Daniel Dunbarc1964212009-03-26 16:23:12 +00005357void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005358 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005359 const InputInfoList &Inputs,
5360 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00005361 const char *LinkingOutput) const {
5362 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00005363
Daniel Dunbarc1964212009-03-26 16:23:12 +00005364 // The logic here is derived from gcc's behavior; most of which
5365 // comes from specs (starting with link_command). Consult gcc for
5366 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00005367 ArgStringList CmdArgs;
5368
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005369 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
5370 if (Args.hasArg(options::OPT_ccc_arcmt_check,
5371 options::OPT_ccc_arcmt_migrate)) {
5372 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
5373 (*I)->claim();
5374 const char *Exec =
5375 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
5376 CmdArgs.push_back(Output.getFilename());
5377 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5378 return;
5379 }
5380
Daniel Dunbarc1964212009-03-26 16:23:12 +00005381 // I'm not sure why this particular decomposition exists in gcc, but
5382 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00005383 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005384
Daniel Dunbarc1964212009-03-26 16:23:12 +00005385 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
5386 Args.AddAllArgs(CmdArgs, options::OPT_s);
5387 Args.AddAllArgs(CmdArgs, options::OPT_t);
5388 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5389 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005390 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005391 Args.AddAllArgs(CmdArgs, options::OPT_r);
5392
Daniel Dunbar767bbab2010-10-18 22:08:36 +00005393 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
5394 // members of static archive libraries which implement Objective-C classes or
5395 // categories.
5396 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
5397 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005398
Daniel Dunbarc1964212009-03-26 16:23:12 +00005399 CmdArgs.push_back("-o");
5400 CmdArgs.push_back(Output.getFilename());
5401
Chad Rosier06fd3c62012-05-16 23:45:12 +00005402 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00005403 !Args.hasArg(options::OPT_nostartfiles))
5404 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005405
5406 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005407
Alexey Bataev186b28a2014-03-06 05:43:53 +00005408 LibOpenMP UsedOpenMPLib = LibUnknown;
5409 if (Args.hasArg(options::OPT_fopenmp)) {
5410 UsedOpenMPLib = LibGOMP;
5411 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
5412 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
5413 .Case("libgomp", LibGOMP)
5414 .Case("libiomp5", LibIOMP5)
5415 .Default(LibUnknown);
5416 if (UsedOpenMPLib == LibUnknown)
5417 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
5418 << A->getOption().getName() << A->getValue();
5419 }
5420 switch (UsedOpenMPLib) {
5421 case LibGOMP:
Daniel Dunbarc1964212009-03-26 16:23:12 +00005422 CmdArgs.push_back("-lgomp");
Alexey Bataev186b28a2014-03-06 05:43:53 +00005423 break;
5424 case LibIOMP5:
5425 CmdArgs.push_back("-liomp5");
5426 break;
5427 case LibUnknown:
5428 break;
5429 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005430
Douglas Gregor9295df02012-05-15 21:00:27 +00005431 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5432
Bob Wilson16d93952012-05-15 18:57:39 +00005433 if (isObjCRuntimeLinked(Args) &&
5434 !Args.hasArg(options::OPT_nostdlib) &&
5435 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00005436 // We use arclite library for both ARC and subscripting support.
5437 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
5438
Bob Wilson7dda0cd2012-04-21 00:21:42 +00005439 CmdArgs.push_back("-framework");
5440 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00005441 // Link libobj.
5442 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00005443 }
John McCall31168b02011-06-15 23:02:42 +00005444
Daniel Dunbarc1964212009-03-26 16:23:12 +00005445 if (LinkingOutput) {
5446 CmdArgs.push_back("-arch_multiple");
5447 CmdArgs.push_back("-final_output");
5448 CmdArgs.push_back(LinkingOutput);
5449 }
5450
Daniel Dunbarc1964212009-03-26 16:23:12 +00005451 if (Args.hasArg(options::OPT_fnested_functions))
5452 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005453
Daniel Dunbarc1964212009-03-26 16:23:12 +00005454 if (!Args.hasArg(options::OPT_nostdlib) &&
5455 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005456 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005457 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00005458
Daniel Dunbarc1964212009-03-26 16:23:12 +00005459 // link_ssp spec is empty.
5460
Daniel Dunbar26d482a2009-09-18 08:15:03 +00005461 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00005462 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005463 }
5464
Chad Rosier06fd3c62012-05-16 23:45:12 +00005465 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00005466 !Args.hasArg(options::OPT_nostartfiles)) {
5467 // endfile_spec is empty.
5468 }
5469
5470 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5471 Args.AddAllArgs(CmdArgs, options::OPT_F);
5472
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005473 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005474 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005475 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00005476}
5477
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005478void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005479 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005480 const InputInfoList &Inputs,
5481 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005482 const char *LinkingOutput) const {
5483 ArgStringList CmdArgs;
5484
5485 CmdArgs.push_back("-create");
5486 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005487
5488 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005489 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005490
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005491 for (InputInfoList::const_iterator
5492 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5493 const InputInfo &II = *it;
5494 assert(II.isFilename() && "Unexpected lipo input.");
5495 CmdArgs.push_back(II.getFilename());
5496 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005497 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005498 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005499 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005500}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005501
Daniel Dunbar88299622010-06-04 18:28:36 +00005502void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005503 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00005504 const InputInfoList &Inputs,
5505 const ArgList &Args,
5506 const char *LinkingOutput) const {
5507 ArgStringList CmdArgs;
5508
Daniel Dunbareb86b042011-05-09 17:23:16 +00005509 CmdArgs.push_back("-o");
5510 CmdArgs.push_back(Output.getFilename());
5511
Daniel Dunbar88299622010-06-04 18:28:36 +00005512 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5513 const InputInfo &Input = Inputs[0];
5514 assert(Input.isFilename() && "Unexpected dsymutil input.");
5515 CmdArgs.push_back(Input.getFilename());
5516
Daniel Dunbar88299622010-06-04 18:28:36 +00005517 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005518 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005519 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00005520}
5521
Eric Christopher551ef452011-08-23 17:56:55 +00005522void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00005523 const InputInfo &Output,
5524 const InputInfoList &Inputs,
5525 const ArgList &Args,
5526 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00005527 ArgStringList CmdArgs;
5528 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00005529 CmdArgs.push_back("--debug-info");
5530 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00005531 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00005532
5533 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5534 const InputInfo &Input = Inputs[0];
5535 assert(Input.isFilename() && "Unexpected verify input");
5536
5537 // Grabbing the output of the earlier dsymutil run.
5538 CmdArgs.push_back(Input.getFilename());
5539
5540 const char *Exec =
5541 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5542 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5543}
5544
David Chisnallf571cde2012-02-15 13:39:01 +00005545void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5546 const InputInfo &Output,
5547 const InputInfoList &Inputs,
5548 const ArgList &Args,
5549 const char *LinkingOutput) const {
5550 ArgStringList CmdArgs;
5551
5552 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5553 options::OPT_Xassembler);
5554
5555 CmdArgs.push_back("-o");
5556 CmdArgs.push_back(Output.getFilename());
5557
5558 for (InputInfoList::const_iterator
5559 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5560 const InputInfo &II = *it;
5561 CmdArgs.push_back(II.getFilename());
5562 }
5563
5564 const char *Exec =
5565 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5566 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5567}
5568
5569
5570void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5571 const InputInfo &Output,
5572 const InputInfoList &Inputs,
5573 const ArgList &Args,
5574 const char *LinkingOutput) const {
5575 // FIXME: Find a real GCC, don't hard-code versions here
5576 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5577 const llvm::Triple &T = getToolChain().getTriple();
5578 std::string LibPath = "/usr/lib/";
5579 llvm::Triple::ArchType Arch = T.getArch();
5580 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005581 case llvm::Triple::x86:
5582 GCCLibPath +=
5583 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5584 break;
5585 case llvm::Triple::x86_64:
5586 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5587 GCCLibPath += "/4.5.2/amd64/";
5588 LibPath += "amd64/";
5589 break;
5590 default:
5591 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00005592 }
5593
5594 ArgStringList CmdArgs;
5595
David Chisnall272a0712012-02-29 15:06:12 +00005596 // Demangle C++ names in errors
5597 CmdArgs.push_back("-C");
5598
David Chisnallf571cde2012-02-15 13:39:01 +00005599 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5600 (!Args.hasArg(options::OPT_shared))) {
5601 CmdArgs.push_back("-e");
5602 CmdArgs.push_back("_start");
5603 }
5604
5605 if (Args.hasArg(options::OPT_static)) {
5606 CmdArgs.push_back("-Bstatic");
5607 CmdArgs.push_back("-dn");
5608 } else {
5609 CmdArgs.push_back("-Bdynamic");
5610 if (Args.hasArg(options::OPT_shared)) {
5611 CmdArgs.push_back("-shared");
5612 } else {
5613 CmdArgs.push_back("--dynamic-linker");
5614 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5615 }
5616 }
5617
5618 if (Output.isFilename()) {
5619 CmdArgs.push_back("-o");
5620 CmdArgs.push_back(Output.getFilename());
5621 } else {
5622 assert(Output.isNothing() && "Invalid output.");
5623 }
5624
5625 if (!Args.hasArg(options::OPT_nostdlib) &&
5626 !Args.hasArg(options::OPT_nostartfiles)) {
5627 if (!Args.hasArg(options::OPT_shared)) {
5628 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5629 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005630 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005631 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5632 } else {
5633 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005634 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5635 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005636 }
Hans Wennborg70850d82013-07-18 20:29:38 +00005637 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00005638 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005639 }
5640
5641 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5642
5643 Args.AddAllArgs(CmdArgs, options::OPT_L);
5644 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5645 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00005646 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00005647
5648 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5649
5650 if (!Args.hasArg(options::OPT_nostdlib) &&
5651 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005652 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00005653 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00005654 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005655 if (!Args.hasArg(options::OPT_shared)) {
5656 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00005657 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00005658 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005659 }
David Chisnallf571cde2012-02-15 13:39:01 +00005660 }
5661
5662 if (!Args.hasArg(options::OPT_nostdlib) &&
5663 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00005664 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005665 }
David Chisnall96de9932012-02-16 16:00:47 +00005666 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005667
Alexey Samsonov7811d192014-02-20 13:57:37 +00005668 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00005669
5670 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005671 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
David Chisnallf571cde2012-02-15 13:39:01 +00005672 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5673}
5674
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005675void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005676 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005677 const InputInfoList &Inputs,
5678 const ArgList &Args,
5679 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005680 ArgStringList CmdArgs;
5681
5682 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5683 options::OPT_Xassembler);
5684
5685 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005686 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005687
5688 for (InputInfoList::const_iterator
5689 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5690 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005691 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005692 }
5693
5694 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005695 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005696 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005697}
5698
5699void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005700 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005701 const InputInfoList &Inputs,
5702 const ArgList &Args,
5703 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005704 ArgStringList CmdArgs;
5705
5706 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005707 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005708 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005709 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005710 }
5711
5712 if (Args.hasArg(options::OPT_static)) {
5713 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005714 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005715 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005716// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005717 CmdArgs.push_back("-Bdynamic");
5718 if (Args.hasArg(options::OPT_shared)) {
5719 CmdArgs.push_back("-shared");
5720 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00005721 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005722 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5723 }
5724 }
5725
Daniel Dunbarb440f562010-08-02 02:38:21 +00005726 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005727 CmdArgs.push_back("-o");
5728 CmdArgs.push_back(Output.getFilename());
5729 } else {
5730 assert(Output.isNothing() && "Invalid output.");
5731 }
5732
5733 if (!Args.hasArg(options::OPT_nostdlib) &&
5734 !Args.hasArg(options::OPT_nostartfiles)) {
5735 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005736 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005737 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005738 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005739 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005740 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005741 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005742 } else {
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")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005745 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005746 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005747 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005748 }
5749
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005750 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5751 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005752 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005753
5754 Args.AddAllArgs(CmdArgs, options::OPT_L);
5755 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5756 Args.AddAllArgs(CmdArgs, options::OPT_e);
5757
Daniel Dunbar54423b22010-09-17 00:24:54 +00005758 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005759
5760 if (!Args.hasArg(options::OPT_nostdlib) &&
5761 !Args.hasArg(options::OPT_nodefaultlibs)) {
5762 // FIXME: For some reason GCC passes -lgcc before adding
5763 // the default system libraries. Just mimic this for now.
5764 CmdArgs.push_back("-lgcc");
5765
5766 if (Args.hasArg(options::OPT_pthread))
5767 CmdArgs.push_back("-pthread");
5768 if (!Args.hasArg(options::OPT_shared))
5769 CmdArgs.push_back("-lc");
5770 CmdArgs.push_back("-lgcc");
5771 }
5772
5773 if (!Args.hasArg(options::OPT_nostdlib) &&
5774 !Args.hasArg(options::OPT_nostartfiles)) {
5775 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005776 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005777 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005778 }
5779
Alexey Samsonov7811d192014-02-20 13:57:37 +00005780 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005781
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005782 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005783 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005784 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005785}
5786
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005787void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005788 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005789 const InputInfoList &Inputs,
5790 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005791 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005792 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00005793 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005794
Rafael Espindolacc126272014-02-28 01:55:21 +00005795 switch (getToolChain().getArch()) {
5796 case llvm::Triple::x86:
5797 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
5798 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005799 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00005800 break;
5801
5802 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005803 CmdArgs.push_back("-mppc");
5804 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00005805 break;
5806
5807 case llvm::Triple::sparc:
5808 CmdArgs.push_back("-32");
5809 NeedsKPIC = true;
5810 break;
5811
5812 case llvm::Triple::sparcv9:
5813 CmdArgs.push_back("-64");
5814 CmdArgs.push_back("-Av9a");
5815 NeedsKPIC = true;
5816 break;
5817
5818 case llvm::Triple::mips64:
5819 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005820 StringRef CPUName;
5821 StringRef ABIName;
5822 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
5823
5824 CmdArgs.push_back("-mabi");
5825 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
5826
5827 if (getToolChain().getArch() == llvm::Triple::mips64)
5828 CmdArgs.push_back("-EB");
5829 else
5830 CmdArgs.push_back("-EL");
5831
Rafael Espindolacc126272014-02-28 01:55:21 +00005832 NeedsKPIC = true;
5833 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005834 }
5835
Rafael Espindolacc126272014-02-28 01:55:21 +00005836 default:
5837 break;
5838 }
5839
5840 if (NeedsKPIC)
5841 addAssemblerKPIC(Args, CmdArgs);
5842
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005843 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5844 options::OPT_Xassembler);
5845
5846 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005847 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005848
5849 for (InputInfoList::const_iterator
5850 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5851 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005852 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005853 }
5854
5855 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005856 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005857 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005858}
5859
5860void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005861 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005862 const InputInfoList &Inputs,
5863 const ArgList &Args,
5864 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005865 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005866 ArgStringList CmdArgs;
5867
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005868 // Silence warning for "clang -g foo.o -o foo"
5869 Args.ClaimAllArgs(options::OPT_g_Group);
5870 // and "clang -emit-llvm foo.o -o foo"
5871 Args.ClaimAllArgs(options::OPT_emit_llvm);
5872 // and for "clang -w foo.o -o foo". Other warning options are already
5873 // handled somewhere else.
5874 Args.ClaimAllArgs(options::OPT_w);
5875
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005876 if (getToolChain().getArch() == llvm::Triple::mips64)
5877 CmdArgs.push_back("-EB");
5878 else if (getToolChain().getArch() == llvm::Triple::mips64el)
5879 CmdArgs.push_back("-EL");
5880
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005881 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005882 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005883 CmdArgs.push_back("-e");
5884 CmdArgs.push_back("__start");
5885 }
5886
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005887 if (Args.hasArg(options::OPT_static)) {
5888 CmdArgs.push_back("-Bstatic");
5889 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005890 if (Args.hasArg(options::OPT_rdynamic))
5891 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005892 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005893 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005894 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005895 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005896 } else {
5897 CmdArgs.push_back("-dynamic-linker");
5898 CmdArgs.push_back("/usr/libexec/ld.so");
5899 }
5900 }
5901
Rafael Espindola044f7832013-06-05 04:28:55 +00005902 if (Args.hasArg(options::OPT_nopie))
5903 CmdArgs.push_back("-nopie");
5904
Daniel Dunbarb440f562010-08-02 02:38:21 +00005905 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005906 CmdArgs.push_back("-o");
5907 CmdArgs.push_back(Output.getFilename());
5908 } else {
5909 assert(Output.isNothing() && "Invalid output.");
5910 }
5911
5912 if (!Args.hasArg(options::OPT_nostdlib) &&
5913 !Args.hasArg(options::OPT_nostartfiles)) {
5914 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00005915 if (Args.hasArg(options::OPT_pg))
5916 CmdArgs.push_back(Args.MakeArgString(
5917 getToolChain().GetFilePath("gcrt0.o")));
5918 else
5919 CmdArgs.push_back(Args.MakeArgString(
5920 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005921 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005922 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005923 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005924 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005925 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005926 }
5927 }
5928
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005929 std::string Triple = getToolChain().getTripleString();
5930 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005931 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005932 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005933 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005934
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005935 Args.AddAllArgs(CmdArgs, options::OPT_L);
5936 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5937 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005938 Args.AddAllArgs(CmdArgs, options::OPT_s);
5939 Args.AddAllArgs(CmdArgs, options::OPT_t);
5940 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5941 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005942
Daniel Dunbar54423b22010-09-17 00:24:54 +00005943 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005944
5945 if (!Args.hasArg(options::OPT_nostdlib) &&
5946 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005947 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005948 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005949 if (Args.hasArg(options::OPT_pg))
5950 CmdArgs.push_back("-lm_p");
5951 else
5952 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005953 }
5954
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005955 // FIXME: For some reason GCC passes -lgcc before adding
5956 // the default system libraries. Just mimic this for now.
5957 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005958
Eric Christopher17674ec2012-09-13 06:32:34 +00005959 if (Args.hasArg(options::OPT_pthread)) {
5960 if (!Args.hasArg(options::OPT_shared) &&
5961 Args.hasArg(options::OPT_pg))
5962 CmdArgs.push_back("-lpthread_p");
5963 else
5964 CmdArgs.push_back("-lpthread");
5965 }
5966
Chandler Carruth45661652011-12-17 22:32:42 +00005967 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005968 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005969 CmdArgs.push_back("-lc_p");
5970 else
5971 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005972 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005973
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005974 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005975 }
5976
5977 if (!Args.hasArg(options::OPT_nostdlib) &&
5978 !Args.hasArg(options::OPT_nostartfiles)) {
5979 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005980 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005981 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005982 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005983 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005984 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005985 }
5986
5987 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005988 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005989 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005990}
Ed Schoutene33194b2009-04-02 19:13:12 +00005991
Eli Friedman9fa28852012-08-08 23:57:20 +00005992void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5993 const InputInfo &Output,
5994 const InputInfoList &Inputs,
5995 const ArgList &Args,
5996 const char *LinkingOutput) const {
5997 ArgStringList CmdArgs;
5998
5999 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6000 options::OPT_Xassembler);
6001
6002 CmdArgs.push_back("-o");
6003 CmdArgs.push_back(Output.getFilename());
6004
6005 for (InputInfoList::const_iterator
6006 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6007 const InputInfo &II = *it;
6008 CmdArgs.push_back(II.getFilename());
6009 }
6010
6011 const char *Exec =
6012 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6013 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6014}
6015
6016void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6017 const InputInfo &Output,
6018 const InputInfoList &Inputs,
6019 const ArgList &Args,
6020 const char *LinkingOutput) const {
6021 const Driver &D = getToolChain().getDriver();
6022 ArgStringList CmdArgs;
6023
6024 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6025 (!Args.hasArg(options::OPT_shared))) {
6026 CmdArgs.push_back("-e");
6027 CmdArgs.push_back("__start");
6028 }
6029
6030 if (Args.hasArg(options::OPT_static)) {
6031 CmdArgs.push_back("-Bstatic");
6032 } else {
6033 if (Args.hasArg(options::OPT_rdynamic))
6034 CmdArgs.push_back("-export-dynamic");
6035 CmdArgs.push_back("--eh-frame-hdr");
6036 CmdArgs.push_back("-Bdynamic");
6037 if (Args.hasArg(options::OPT_shared)) {
6038 CmdArgs.push_back("-shared");
6039 } else {
6040 CmdArgs.push_back("-dynamic-linker");
6041 CmdArgs.push_back("/usr/libexec/ld.so");
6042 }
6043 }
6044
6045 if (Output.isFilename()) {
6046 CmdArgs.push_back("-o");
6047 CmdArgs.push_back(Output.getFilename());
6048 } else {
6049 assert(Output.isNothing() && "Invalid output.");
6050 }
6051
6052 if (!Args.hasArg(options::OPT_nostdlib) &&
6053 !Args.hasArg(options::OPT_nostartfiles)) {
6054 if (!Args.hasArg(options::OPT_shared)) {
6055 if (Args.hasArg(options::OPT_pg))
6056 CmdArgs.push_back(Args.MakeArgString(
6057 getToolChain().GetFilePath("gcrt0.o")));
6058 else
6059 CmdArgs.push_back(Args.MakeArgString(
6060 getToolChain().GetFilePath("crt0.o")));
6061 CmdArgs.push_back(Args.MakeArgString(
6062 getToolChain().GetFilePath("crtbegin.o")));
6063 } else {
6064 CmdArgs.push_back(Args.MakeArgString(
6065 getToolChain().GetFilePath("crtbeginS.o")));
6066 }
6067 }
6068
6069 Args.AddAllArgs(CmdArgs, options::OPT_L);
6070 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6071 Args.AddAllArgs(CmdArgs, options::OPT_e);
6072
6073 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6074
6075 if (!Args.hasArg(options::OPT_nostdlib) &&
6076 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006077 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006078 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6079 if (Args.hasArg(options::OPT_pg))
6080 CmdArgs.push_back("-lm_p");
6081 else
6082 CmdArgs.push_back("-lm");
6083 }
6084
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006085 if (Args.hasArg(options::OPT_pthread)) {
6086 if (!Args.hasArg(options::OPT_shared) &&
6087 Args.hasArg(options::OPT_pg))
6088 CmdArgs.push_back("-lpthread_p");
6089 else
6090 CmdArgs.push_back("-lpthread");
6091 }
6092
Eli Friedman9fa28852012-08-08 23:57:20 +00006093 if (!Args.hasArg(options::OPT_shared)) {
6094 if (Args.hasArg(options::OPT_pg))
6095 CmdArgs.push_back("-lc_p");
6096 else
6097 CmdArgs.push_back("-lc");
6098 }
6099
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006100 StringRef MyArch;
6101 switch (getToolChain().getTriple().getArch()) {
6102 case llvm::Triple::arm:
6103 MyArch = "arm";
6104 break;
6105 case llvm::Triple::x86:
6106 MyArch = "i386";
6107 break;
6108 case llvm::Triple::x86_64:
6109 MyArch = "amd64";
6110 break;
6111 default:
6112 llvm_unreachable("Unsupported architecture");
6113 }
6114 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006115 }
6116
6117 if (!Args.hasArg(options::OPT_nostdlib) &&
6118 !Args.hasArg(options::OPT_nostartfiles)) {
6119 if (!Args.hasArg(options::OPT_shared))
6120 CmdArgs.push_back(Args.MakeArgString(
6121 getToolChain().GetFilePath("crtend.o")));
6122 else
6123 CmdArgs.push_back(Args.MakeArgString(
6124 getToolChain().GetFilePath("crtendS.o")));
6125 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006126
6127 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00006128 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006129 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006130}
6131
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006132void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006133 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006134 const InputInfoList &Inputs,
6135 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006136 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006137 ArgStringList CmdArgs;
6138
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006139 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6140 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006141 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006142 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006143 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006144 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006145 else if (getToolChain().getArch() == llvm::Triple::mips ||
6146 getToolChain().getArch() == llvm::Triple::mipsel ||
6147 getToolChain().getArch() == llvm::Triple::mips64 ||
6148 getToolChain().getArch() == llvm::Triple::mips64el) {
6149 StringRef CPUName;
6150 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006151 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006152
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006153 CmdArgs.push_back("-march");
6154 CmdArgs.push_back(CPUName.data());
6155
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006156 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006157 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006158
6159 if (getToolChain().getArch() == llvm::Triple::mips ||
6160 getToolChain().getArch() == llvm::Triple::mips64)
6161 CmdArgs.push_back("-EB");
6162 else
6163 CmdArgs.push_back("-EL");
6164
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006165 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006166 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006167 getToolChain().getArch() == llvm::Triple::armeb ||
6168 getToolChain().getArch() == llvm::Triple::thumb ||
6169 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006170 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006171 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006172 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6173
6174 if (FloatABI == "hard") {
6175 CmdArgs.push_back("-mfpu=vfp");
6176 } else {
6177 CmdArgs.push_back("-mfpu=softvfp");
6178 }
6179
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006180 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00006181 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006182 case llvm::Triple::GNUEABI:
6183 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00006184 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006185 break;
6186
6187 default:
6188 CmdArgs.push_back("-matpcs");
6189 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00006190 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00006191 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00006192 if (getToolChain().getArch() == llvm::Triple::sparc)
6193 CmdArgs.push_back("-Av8plusa");
6194 else
6195 CmdArgs.push_back("-Av9a");
6196
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006197 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006198 }
Eric Christopher0b26a612010-03-02 02:41:08 +00006199
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006200 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6201 options::OPT_Xassembler);
6202
6203 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006204 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006205
6206 for (InputInfoList::const_iterator
6207 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6208 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006209 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006210 }
6211
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006212 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006213 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006214 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006215}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006216
6217void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006218 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006219 const InputInfoList &Inputs,
6220 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006221 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00006222 const toolchains::FreeBSD& ToolChain =
6223 static_cast<const toolchains::FreeBSD&>(getToolChain());
6224 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006225 const bool IsPIE =
6226 !Args.hasArg(options::OPT_shared) &&
6227 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006228 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00006229
6230 // Silence warning for "clang -g foo.o -o foo"
6231 Args.ClaimAllArgs(options::OPT_g_Group);
6232 // and "clang -emit-llvm foo.o -o foo"
6233 Args.ClaimAllArgs(options::OPT_emit_llvm);
6234 // and for "clang -w foo.o -o foo". Other warning options are already
6235 // handled somewhere else.
6236 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006237
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006238 if (!D.SysRoot.empty())
6239 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6240
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006241 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006242 CmdArgs.push_back("-pie");
6243
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006244 if (Args.hasArg(options::OPT_static)) {
6245 CmdArgs.push_back("-Bstatic");
6246 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006247 if (Args.hasArg(options::OPT_rdynamic))
6248 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006249 CmdArgs.push_back("--eh-frame-hdr");
6250 if (Args.hasArg(options::OPT_shared)) {
6251 CmdArgs.push_back("-Bshareable");
6252 } else {
6253 CmdArgs.push_back("-dynamic-linker");
6254 CmdArgs.push_back("/libexec/ld-elf.so.1");
6255 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006256 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
6257 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00006258 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
6259 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
6260 CmdArgs.push_back("--hash-style=both");
6261 }
6262 }
6263 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006264 }
6265
6266 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6267 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006268 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006269 CmdArgs.push_back("-m");
6270 CmdArgs.push_back("elf_i386_fbsd");
6271 }
6272
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006273 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00006274 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00006275 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00006276 }
6277
Daniel Dunbarb440f562010-08-02 02:38:21 +00006278 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006279 CmdArgs.push_back("-o");
6280 CmdArgs.push_back(Output.getFilename());
6281 } else {
6282 assert(Output.isNothing() && "Invalid output.");
6283 }
6284
6285 if (!Args.hasArg(options::OPT_nostdlib) &&
6286 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00006287 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006288 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006289 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00006290 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006291 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006292 crt1 = "Scrt1.o";
6293 else
6294 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006295 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006296 if (crt1)
6297 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
6298
6299 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6300
6301 const char *crtbegin = NULL;
6302 if (Args.hasArg(options::OPT_static))
6303 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006304 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006305 crtbegin = "crtbeginS.o";
6306 else
6307 crtbegin = "crtbegin.o";
6308
6309 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006310 }
6311
6312 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00006313 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00006314 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6315 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006316 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006317 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6318 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00006319 Args.AddAllArgs(CmdArgs, options::OPT_s);
6320 Args.AddAllArgs(CmdArgs, options::OPT_t);
6321 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6322 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006323
Alp Tokerce365ca2013-12-02 12:43:03 +00006324 if (D.IsUsingLTO(Args))
6325 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00006326
Roman Divackyafe2f232012-08-28 15:09:03 +00006327 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006328
6329 if (!Args.hasArg(options::OPT_nostdlib) &&
6330 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006331 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00006332 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00006333 if (Args.hasArg(options::OPT_pg))
6334 CmdArgs.push_back("-lm_p");
6335 else
6336 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00006337 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006338 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
6339 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00006340 if (Args.hasArg(options::OPT_pg))
6341 CmdArgs.push_back("-lgcc_p");
6342 else
6343 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006344 if (Args.hasArg(options::OPT_static)) {
6345 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006346 } else if (Args.hasArg(options::OPT_pg)) {
6347 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006348 } else {
6349 CmdArgs.push_back("--as-needed");
6350 CmdArgs.push_back("-lgcc_s");
6351 CmdArgs.push_back("--no-as-needed");
6352 }
6353
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006354 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006355 if (Args.hasArg(options::OPT_pg))
6356 CmdArgs.push_back("-lpthread_p");
6357 else
6358 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006359 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006360
Roman Divacky66f22762011-02-10 16:59:40 +00006361 if (Args.hasArg(options::OPT_pg)) {
6362 if (Args.hasArg(options::OPT_shared))
6363 CmdArgs.push_back("-lc");
6364 else
6365 CmdArgs.push_back("-lc_p");
6366 CmdArgs.push_back("-lgcc_p");
6367 } else {
6368 CmdArgs.push_back("-lc");
6369 CmdArgs.push_back("-lgcc");
6370 }
6371
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006372 if (Args.hasArg(options::OPT_static)) {
6373 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006374 } else if (Args.hasArg(options::OPT_pg)) {
6375 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006376 } else {
6377 CmdArgs.push_back("--as-needed");
6378 CmdArgs.push_back("-lgcc_s");
6379 CmdArgs.push_back("--no-as-needed");
6380 }
6381 }
6382
6383 if (!Args.hasArg(options::OPT_nostdlib) &&
6384 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006385 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006386 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00006387 else
6388 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00006389 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006390 }
6391
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00006392 addSanitizerRuntimes(getToolChain(), Args, CmdArgs);
6393
Alexey Samsonov7811d192014-02-20 13:57:37 +00006394 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006395
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006396 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00006397 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006398 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006399}
Daniel Dunbarcc912342009-05-02 18:28:39 +00006400
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006401void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6402 const InputInfo &Output,
6403 const InputInfoList &Inputs,
6404 const ArgList &Args,
6405 const char *LinkingOutput) const {
6406 ArgStringList CmdArgs;
6407
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006408 // GNU as needs different flags for creating the correct output format
6409 // on architectures with different ABIs or optional feature sets.
6410 switch (getToolChain().getArch()) {
6411 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006412 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006413 break;
6414 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006415 case llvm::Triple::armeb:
6416 case llvm::Triple::thumb:
6417 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00006418 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006419 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006420 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006421 }
6422
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006423 case llvm::Triple::mips:
6424 case llvm::Triple::mipsel:
6425 case llvm::Triple::mips64:
6426 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006427 StringRef CPUName;
6428 StringRef ABIName;
6429 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6430
6431 CmdArgs.push_back("-march");
6432 CmdArgs.push_back(CPUName.data());
6433
6434 CmdArgs.push_back("-mabi");
6435 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6436
6437 if (getToolChain().getArch() == llvm::Triple::mips ||
6438 getToolChain().getArch() == llvm::Triple::mips64)
6439 CmdArgs.push_back("-EB");
6440 else
6441 CmdArgs.push_back("-EL");
6442
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006443 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006444 break;
6445 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006446
6447 case llvm::Triple::sparc:
6448 CmdArgs.push_back("-32");
6449 addAssemblerKPIC(Args, CmdArgs);
6450 break;
6451
6452 case llvm::Triple::sparcv9:
6453 CmdArgs.push_back("-64");
6454 CmdArgs.push_back("-Av9");
6455 addAssemblerKPIC(Args, CmdArgs);
6456 break;
6457
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006458 default:
6459 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006460 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006461
6462 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6463 options::OPT_Xassembler);
6464
6465 CmdArgs.push_back("-o");
6466 CmdArgs.push_back(Output.getFilename());
6467
6468 for (InputInfoList::const_iterator
6469 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6470 const InputInfo &II = *it;
6471 CmdArgs.push_back(II.getFilename());
6472 }
6473
David Chisnallddbd68f2011-09-27 22:03:18 +00006474 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006475 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6476}
6477
6478void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6479 const InputInfo &Output,
6480 const InputInfoList &Inputs,
6481 const ArgList &Args,
6482 const char *LinkingOutput) const {
6483 const Driver &D = getToolChain().getDriver();
6484 ArgStringList CmdArgs;
6485
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006486 if (!D.SysRoot.empty())
6487 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6488
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00006489 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006490 if (Args.hasArg(options::OPT_static)) {
6491 CmdArgs.push_back("-Bstatic");
6492 } else {
6493 if (Args.hasArg(options::OPT_rdynamic))
6494 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006495 if (Args.hasArg(options::OPT_shared)) {
6496 CmdArgs.push_back("-Bshareable");
6497 } else {
6498 CmdArgs.push_back("-dynamic-linker");
6499 CmdArgs.push_back("/libexec/ld.elf_so");
6500 }
6501 }
6502
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006503 // Many NetBSD architectures support more than one ABI.
6504 // Determine the correct emulation for ld.
6505 switch (getToolChain().getArch()) {
6506 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006507 CmdArgs.push_back("-m");
6508 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006509 break;
6510 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006511 case llvm::Triple::armeb:
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006512 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006513 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006514 CmdArgs.push_back("-m");
6515 switch (getToolChain().getTriple().getEnvironment()) {
6516 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006517 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006518 CmdArgs.push_back("armelf_nbsd_eabi");
6519 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00006520 case llvm::Triple::EABIHF:
6521 case llvm::Triple::GNUEABIHF:
6522 CmdArgs.push_back("armelf_nbsd_eabihf");
6523 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006524 default:
6525 CmdArgs.push_back("armelf_nbsd");
6526 break;
6527 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006528 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006529 case llvm::Triple::mips64:
6530 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006531 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006532 CmdArgs.push_back("-m");
6533 if (getToolChain().getArch() == llvm::Triple::mips64)
6534 CmdArgs.push_back("elf32btsmip");
6535 else
6536 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006537 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006538 CmdArgs.push_back("-m");
6539 if (getToolChain().getArch() == llvm::Triple::mips64)
6540 CmdArgs.push_back("elf64btsmip");
6541 else
6542 CmdArgs.push_back("elf64ltsmip");
6543 }
6544 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006545
6546 case llvm::Triple::sparc:
6547 CmdArgs.push_back("-m");
6548 CmdArgs.push_back("elf32_sparc");
6549 break;
6550
6551 case llvm::Triple::sparcv9:
6552 CmdArgs.push_back("-m");
6553 CmdArgs.push_back("elf64_sparc");
6554 break;
6555
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006556 default:
6557 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006558 }
6559
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006560 if (Output.isFilename()) {
6561 CmdArgs.push_back("-o");
6562 CmdArgs.push_back(Output.getFilename());
6563 } else {
6564 assert(Output.isNothing() && "Invalid output.");
6565 }
6566
6567 if (!Args.hasArg(options::OPT_nostdlib) &&
6568 !Args.hasArg(options::OPT_nostartfiles)) {
6569 if (!Args.hasArg(options::OPT_shared)) {
6570 CmdArgs.push_back(Args.MakeArgString(
6571 getToolChain().GetFilePath("crt0.o")));
6572 CmdArgs.push_back(Args.MakeArgString(
6573 getToolChain().GetFilePath("crti.o")));
6574 CmdArgs.push_back(Args.MakeArgString(
6575 getToolChain().GetFilePath("crtbegin.o")));
6576 } else {
6577 CmdArgs.push_back(Args.MakeArgString(
6578 getToolChain().GetFilePath("crti.o")));
6579 CmdArgs.push_back(Args.MakeArgString(
6580 getToolChain().GetFilePath("crtbeginS.o")));
6581 }
6582 }
6583
6584 Args.AddAllArgs(CmdArgs, options::OPT_L);
6585 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6586 Args.AddAllArgs(CmdArgs, options::OPT_e);
6587 Args.AddAllArgs(CmdArgs, options::OPT_s);
6588 Args.AddAllArgs(CmdArgs, options::OPT_t);
6589 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6590 Args.AddAllArgs(CmdArgs, options::OPT_r);
6591
6592 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6593
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006594 unsigned Major, Minor, Micro;
6595 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
6596 bool useLibgcc = true;
6597 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006598 switch(getToolChain().getArch()) {
6599 case llvm::Triple::x86:
6600 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006601 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006602 break;
6603 default:
6604 break;
6605 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006606 }
6607
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006608 if (!Args.hasArg(options::OPT_nostdlib) &&
6609 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006610 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006611 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6612 CmdArgs.push_back("-lm");
6613 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006614 if (Args.hasArg(options::OPT_pthread))
6615 CmdArgs.push_back("-lpthread");
6616 CmdArgs.push_back("-lc");
6617
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006618 if (useLibgcc) {
6619 if (Args.hasArg(options::OPT_static)) {
6620 // libgcc_eh depends on libc, so resolve as much as possible,
6621 // pull in any new requirements from libc and then get the rest
6622 // of libgcc.
6623 CmdArgs.push_back("-lgcc_eh");
6624 CmdArgs.push_back("-lc");
6625 CmdArgs.push_back("-lgcc");
6626 } else {
6627 CmdArgs.push_back("-lgcc");
6628 CmdArgs.push_back("--as-needed");
6629 CmdArgs.push_back("-lgcc_s");
6630 CmdArgs.push_back("--no-as-needed");
6631 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006632 }
6633 }
6634
6635 if (!Args.hasArg(options::OPT_nostdlib) &&
6636 !Args.hasArg(options::OPT_nostartfiles)) {
6637 if (!Args.hasArg(options::OPT_shared))
6638 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6639 "crtend.o")));
6640 else
6641 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6642 "crtendS.o")));
6643 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6644 "crtn.o")));
6645 }
6646
Alexey Samsonov7811d192014-02-20 13:57:37 +00006647 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006648
Rafael Espindola236db462013-11-09 20:07:19 +00006649 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006650 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6651}
6652
Thomas Schwinge4e555262013-03-28 19:04:25 +00006653void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6654 const InputInfo &Output,
6655 const InputInfoList &Inputs,
6656 const ArgList &Args,
6657 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00006658 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006659 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00006660
6661 // Add --32/--64 to make sure we get the format we want.
6662 // This is incomplete
6663 if (getToolChain().getArch() == llvm::Triple::x86) {
6664 CmdArgs.push_back("--32");
6665 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
6666 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00006667 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
6668 CmdArgs.push_back("-a32");
6669 CmdArgs.push_back("-mppc");
6670 CmdArgs.push_back("-many");
6671 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
6672 CmdArgs.push_back("-a64");
6673 CmdArgs.push_back("-mppc64");
6674 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00006675 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
6676 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00006677 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00006678 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00006679 CmdArgs.push_back("-mlittle-endian");
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00006680 } else if (getToolChain().getArch() == llvm::Triple::sparc) {
6681 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00006682 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006683 NeedsKPIC = true;
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00006684 } else if (getToolChain().getArch() == llvm::Triple::sparcv9) {
6685 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00006686 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006687 NeedsKPIC = true;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006688 } else if (getToolChain().getArch() == llvm::Triple::arm ||
6689 getToolChain().getArch() == llvm::Triple::armeb) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006690 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00006691 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
6692 CmdArgs.push_back("-mfpu=neon");
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006693 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a" ||
6694 MArch == "armebv8" || MArch == "armebv8a" || MArch == "armebv8-a")
Bernard Ogdena58ef052013-10-24 18:32:41 +00006695 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006696
Tim Northover9c7e0352013-12-12 11:55:52 +00006697 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
6698 getToolChain().getDriver(), Args, getToolChain().getTriple());
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006699 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006700
6701 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00006702
6703 // FIXME: remove krait check when GNU tools support krait cpu
6704 // for now replace it with -march=armv7-a to avoid a lower
6705 // march from being picked in the absence of a cpu flag.
6706 Arg *A;
6707 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
6708 StringRef(A->getValue()) == "krait")
6709 CmdArgs.push_back("-march=armv7-a");
6710 else
6711 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006712 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006713 } else if (getToolChain().getArch() == llvm::Triple::mips ||
6714 getToolChain().getArch() == llvm::Triple::mipsel ||
6715 getToolChain().getArch() == llvm::Triple::mips64 ||
6716 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006717 StringRef CPUName;
6718 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006719 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006720
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006721 CmdArgs.push_back("-march");
6722 CmdArgs.push_back(CPUName.data());
6723
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006724 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006725 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00006726
6727 if (getToolChain().getArch() == llvm::Triple::mips ||
6728 getToolChain().getArch() == llvm::Triple::mips64)
6729 CmdArgs.push_back("-EB");
6730 else
6731 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006732
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006733 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6734 if (StringRef(A->getValue()) == "2008")
6735 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6736 }
6737
Simon Atanasyan8cc7c122013-11-26 11:57:58 +00006738 Args.AddLastArg(CmdArgs, options::OPT_mfp32, options::OPT_mfp64);
Simon Atanasyan036d16d2013-04-30 07:47:13 +00006739 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6740 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6741 options::OPT_mno_micromips);
6742 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6743 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6744
Simon Atanasyanbd986632013-11-26 11:58:04 +00006745 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
6746 // Do not use AddLastArg because not all versions of MIPS assembler
6747 // support -mmsa / -mno-msa options.
6748 if (A->getOption().matches(options::OPT_mmsa))
6749 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
6750 }
6751
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006752 NeedsKPIC = true;
6753 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
6754 // Always pass an -march option, since our default of z10 is later
6755 // than the GNU assembler's default.
6756 StringRef CPUName = getSystemZTargetCPU(Args);
6757 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
6758 }
6759
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006760 if (NeedsKPIC)
6761 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00006762
6763 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6764 options::OPT_Xassembler);
6765
6766 CmdArgs.push_back("-o");
6767 CmdArgs.push_back(Output.getFilename());
6768
6769 for (InputInfoList::const_iterator
6770 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6771 const InputInfo &II = *it;
6772 CmdArgs.push_back(II.getFilename());
6773 }
6774
6775 const char *Exec =
6776 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6777 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00006778
6779 // Handle the debug info splitting at object creation time if we're
6780 // creating an object.
6781 // TODO: Currently only works on linux with newer objcopy.
6782 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006783 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00006784 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6785 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00006786}
6787
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006788static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006789 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00006790 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00006791 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6792 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00006793 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006794 CmdArgs.push_back("-lgcc");
6795
Logan Chien3d3373c2012-11-19 12:04:11 +00006796 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006797 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006798 CmdArgs.push_back("-lgcc");
6799 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00006800 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006801 CmdArgs.push_back("--as-needed");
6802 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00006803 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006804 CmdArgs.push_back("--no-as-needed");
6805 }
6806
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006807 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00006808 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00006809 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006810 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00006811
6812 // According to Android ABI, we have to link with libdl if we are
6813 // linking with non-static libgcc.
6814 //
6815 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6816 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6817 if (isAndroid && !StaticLibgcc)
6818 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00006819}
6820
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006821static StringRef getLinuxDynamicLinker(const ArgList &Args,
6822 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00006823 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
6824 if (ToolChain.getTriple().isArch64Bit())
6825 return "/system/bin/linker64";
6826 else
6827 return "/system/bin/linker";
6828 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
6829 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006830 return "/lib/ld-linux.so.2";
Tim Northovera2ee4332014-03-29 15:09:45 +00006831 else if (ToolChain.getArch() == llvm::Triple::aarch64 ||
6832 ToolChain.getArch() == llvm::Triple::arm64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006833 return "/lib/ld-linux-aarch64.so.1";
Christian Pirkera74c7912014-03-14 12:15:45 +00006834 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
6835 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006836 else if (ToolChain.getArch() == llvm::Triple::arm ||
6837 ToolChain.getArch() == llvm::Triple::thumb) {
6838 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6839 return "/lib/ld-linux-armhf.so.3";
6840 else
6841 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006842 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
6843 ToolChain.getArch() == llvm::Triple::thumbeb) {
6844 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6845 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
6846 else
6847 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006848 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6849 ToolChain.getArch() == llvm::Triple::mipsel)
6850 return "/lib/ld.so.1";
6851 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6852 ToolChain.getArch() == llvm::Triple::mips64el) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006853 if (mips::hasMipsAbiArg(Args, "n32"))
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006854 return "/lib32/ld.so.1";
6855 else
6856 return "/lib64/ld.so.1";
6857 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6858 return "/lib/ld.so.1";
6859 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
Bill Schmidt778d3872013-07-26 01:36:11 +00006860 ToolChain.getArch() == llvm::Triple::ppc64le ||
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006861 ToolChain.getArch() == llvm::Triple::systemz)
6862 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00006863 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
6864 return "/lib64/ld-linux.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006865 else
6866 return "/lib64/ld-linux-x86-64.so.2";
6867}
6868
Renato Golinc4b49242014-02-13 10:01:16 +00006869static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
6870 ArgStringList &CmdArgs, const ArgList &Args) {
6871 // Make use of compiler-rt if --rtlib option is used
6872 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
6873
6874 switch(RLT) {
6875 case ToolChain::RLT_CompilerRT:
6876 addClangRTLinux(TC, Args, CmdArgs);
6877 break;
6878 case ToolChain::RLT_Libgcc:
6879 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
6880 break;
Renato Golinc4b49242014-02-13 10:01:16 +00006881 }
6882}
6883
Thomas Schwinge4e555262013-03-28 19:04:25 +00006884void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6885 const InputInfo &Output,
6886 const InputInfoList &Inputs,
6887 const ArgList &Args,
6888 const char *LinkingOutput) const {
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006889 const toolchains::Linux& ToolChain =
6890 static_cast<const toolchains::Linux&>(getToolChain());
6891 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00006892 const bool isAndroid =
6893 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006894 const bool IsPIE =
6895 !Args.hasArg(options::OPT_shared) &&
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006896 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006897
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006898 ArgStringList CmdArgs;
6899
Rafael Espindolad1002f62010-11-15 18:28:16 +00006900 // Silence warning for "clang -g foo.o -o foo"
6901 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006902 // and "clang -emit-llvm foo.o -o foo"
6903 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00006904 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00006905 // handled somewhere else.
6906 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00006907
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006908 if (!D.SysRoot.empty())
6909 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006910
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006911 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00006912 CmdArgs.push_back("-pie");
6913
Rafael Espindola1c76c592010-11-07 22:57:16 +00006914 if (Args.hasArg(options::OPT_rdynamic))
6915 CmdArgs.push_back("-export-dynamic");
6916
Rafael Espindola34d77dc2010-11-11 19:34:42 +00006917 if (Args.hasArg(options::OPT_s))
6918 CmdArgs.push_back("-s");
6919
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006920 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6921 e = ToolChain.ExtraOpts.end();
6922 i != e; ++i)
6923 CmdArgs.push_back(i->c_str());
6924
6925 if (!Args.hasArg(options::OPT_static)) {
6926 CmdArgs.push_back("--eh-frame-hdr");
6927 }
6928
6929 CmdArgs.push_back("-m");
6930 if (ToolChain.getArch() == llvm::Triple::x86)
6931 CmdArgs.push_back("elf_i386");
Tim Northovera2ee4332014-03-29 15:09:45 +00006932 else if (ToolChain.getArch() == llvm::Triple::aarch64 ||
6933 ToolChain.getArch() == llvm::Triple::arm64)
Tim Northover9bb857a2013-01-31 12:13:10 +00006934 CmdArgs.push_back("aarch64linux");
Christian Pirkera74c7912014-03-14 12:15:45 +00006935 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
6936 CmdArgs.push_back("aarch64_be_linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00006937 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00006938 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006939 CmdArgs.push_back("armelf_linux_eabi");
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006940 else if (ToolChain.getArch() == llvm::Triple::armeb
6941 || ToolChain.getArch() == llvm::Triple::thumbeb)
6942 CmdArgs.push_back("armebelf_linux_eabi"); /* TODO: check which NAME. */
Ted Kremenek43d47cc2011-04-05 22:04:27 +00006943 else if (ToolChain.getArch() == llvm::Triple::ppc)
6944 CmdArgs.push_back("elf32ppclinux");
6945 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6946 CmdArgs.push_back("elf64ppc");
Will Schmidtc1fc1902014-03-24 17:10:37 +00006947 else if (ToolChain.getArch() == llvm::Triple::ppc64le)
6948 CmdArgs.push_back("elf64lppc");
Jakob Stoklund Olesen91a8e032014-01-10 03:51:33 +00006949 else if (ToolChain.getArch() == llvm::Triple::sparc)
6950 CmdArgs.push_back("elf32_sparc");
6951 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
6952 CmdArgs.push_back("elf64_sparc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00006953 else if (ToolChain.getArch() == llvm::Triple::mips)
6954 CmdArgs.push_back("elf32btsmip");
6955 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6956 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006957 else if (ToolChain.getArch() == llvm::Triple::mips64) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006958 if (mips::hasMipsAbiArg(Args, "n32"))
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006959 CmdArgs.push_back("elf32btsmipn32");
6960 else
6961 CmdArgs.push_back("elf64btsmip");
6962 }
6963 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006964 if (mips::hasMipsAbiArg(Args, "n32"))
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006965 CmdArgs.push_back("elf32ltsmipn32");
6966 else
6967 CmdArgs.push_back("elf64ltsmip");
6968 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006969 else if (ToolChain.getArch() == llvm::Triple::systemz)
6970 CmdArgs.push_back("elf64_s390");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006971 else
6972 CmdArgs.push_back("elf_x86_64");
6973
6974 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00006975 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006976 ToolChain.getArch() == llvm::Triple::armeb ||
6977 ToolChain.getArch() == llvm::Triple::thumb ||
6978 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006979 CmdArgs.push_back("-Bstatic");
6980 else
6981 CmdArgs.push_back("-static");
6982 } else if (Args.hasArg(options::OPT_shared)) {
6983 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00006984 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006985 CmdArgs.push_back("-Bsymbolic");
6986 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006987 }
6988
6989 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006990 ToolChain.getArch() == llvm::Triple::armeb ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00006991 ToolChain.getArch() == llvm::Triple::thumb ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006992 ToolChain.getArch() == llvm::Triple::thumbeb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006993 (!Args.hasArg(options::OPT_static) &&
6994 !Args.hasArg(options::OPT_shared))) {
6995 CmdArgs.push_back("-dynamic-linker");
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006996 CmdArgs.push_back(Args.MakeArgString(
6997 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006998 }
6999
7000 CmdArgs.push_back("-o");
7001 CmdArgs.push_back(Output.getFilename());
7002
Rafael Espindola81937ec2010-12-01 01:52:43 +00007003 if (!Args.hasArg(options::OPT_nostdlib) &&
7004 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007005 if (!isAndroid) {
7006 const char *crt1 = NULL;
7007 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007008 if (Args.hasArg(options::OPT_pg))
7009 crt1 = "gcrt1.o";
7010 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007011 crt1 = "Scrt1.o";
7012 else
7013 crt1 = "crt1.o";
7014 }
7015 if (crt1)
7016 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007017
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007018 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7019 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007020
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007021 const char *crtbegin;
7022 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007023 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007024 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007025 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007026 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007027 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007028 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007029 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007030 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00007031
7032 // Add crtfastmath.o if available and fast math is enabled.
7033 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007034 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007035
7036 Args.AddAllArgs(CmdArgs, options::OPT_L);
7037
7038 const ToolChain::path_list Paths = ToolChain.getFilePaths();
7039
Roman Divackyee8188a2011-03-01 17:53:14 +00007040 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
7041 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00007042 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007043
Alp Tokerce365ca2013-12-02 12:43:03 +00007044 if (D.IsUsingLTO(Args))
7045 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00007046
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00007047 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7048 CmdArgs.push_back("--no-demangle");
7049
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007050 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7051
Alexey Samsonovce8ab102014-02-25 12:43:43 +00007052 addSanitizerRuntimes(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007053 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00007054 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007055
Hans Wennborg70850d82013-07-18 20:29:38 +00007056 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00007057 !Args.hasArg(options::OPT_nostdlib) &&
7058 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00007059 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7060 !Args.hasArg(options::OPT_static);
7061 if (OnlyLibstdcxxStatic)
7062 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007063 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00007064 if (OnlyLibstdcxxStatic)
7065 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007066 CmdArgs.push_back("-lm");
7067 }
7068
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007069 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00007070 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7071 if (Args.hasArg(options::OPT_static))
7072 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00007073
Alexey Bataev186b28a2014-03-06 05:43:53 +00007074 LibOpenMP UsedOpenMPLib = LibUnknown;
7075 if (Args.hasArg(options::OPT_fopenmp)) {
7076 UsedOpenMPLib = LibGOMP;
7077 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7078 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7079 .Case("libgomp", LibGOMP)
7080 .Case("libiomp5", LibIOMP5)
7081 .Default(LibUnknown);
7082 if (UsedOpenMPLib == LibUnknown)
7083 D.Diag(diag::err_drv_unsupported_option_argument)
7084 << A->getOption().getName() << A->getValue();
7085 }
7086 switch (UsedOpenMPLib) {
7087 case LibGOMP:
Chandler Carruth01538002013-01-17 13:19:29 +00007088 CmdArgs.push_back("-lgomp");
7089
Alp Tokerf6a24ce2013-12-05 16:25:25 +00007090 // FIXME: Exclude this for platforms with libgomp that don't require
7091 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00007092 CmdArgs.push_back("-lrt");
Alexey Bataev186b28a2014-03-06 05:43:53 +00007093 break;
7094 case LibIOMP5:
7095 CmdArgs.push_back("-liomp5");
7096 break;
7097 case LibUnknown:
7098 break;
Chandler Carruth01538002013-01-17 13:19:29 +00007099 }
Renato Golinc4b49242014-02-13 10:01:16 +00007100 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007101
Chandler Carruth94a32012012-05-14 18:31:18 +00007102 if (Args.hasArg(options::OPT_pthread) ||
Alexey Bataev648250a2014-03-07 07:43:52 +00007103 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown)
Chandler Carruth94a32012012-05-14 18:31:18 +00007104 CmdArgs.push_back("-lpthread");
7105
7106 CmdArgs.push_back("-lc");
7107
7108 if (Args.hasArg(options::OPT_static))
7109 CmdArgs.push_back("--end-group");
7110 else
Renato Golinc4b49242014-02-13 10:01:16 +00007111 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00007112 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00007113
Rafael Espindola81937ec2010-12-01 01:52:43 +00007114 if (!Args.hasArg(options::OPT_nostartfiles)) {
7115 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007116 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007117 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007118 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007119 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00007120 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007121 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007122
Rafael Espindola81937ec2010-12-01 01:52:43 +00007123 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007124 if (!isAndroid)
7125 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00007126 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007127 }
7128
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007129 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
7130}
Rafael Espindola92b00932010-08-10 00:25:48 +00007131
Chris Lattner3e2ee142010-07-07 16:01:42 +00007132void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007133 const InputInfo &Output,
7134 const InputInfoList &Inputs,
7135 const ArgList &Args,
7136 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007137 ArgStringList CmdArgs;
7138
7139 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7140 options::OPT_Xassembler);
7141
7142 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007143 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007144
7145 for (InputInfoList::const_iterator
7146 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7147 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00007148 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007149 }
7150
7151 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00007152 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007153 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007154}
7155
7156void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007157 const InputInfo &Output,
7158 const InputInfoList &Inputs,
7159 const ArgList &Args,
7160 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007161 const Driver &D = getToolChain().getDriver();
7162 ArgStringList CmdArgs;
7163
Daniel Dunbarb440f562010-08-02 02:38:21 +00007164 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007165 CmdArgs.push_back("-o");
7166 CmdArgs.push_back(Output.getFilename());
7167 } else {
7168 assert(Output.isNothing() && "Invalid output.");
7169 }
7170
7171 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00007172 !Args.hasArg(options::OPT_nostartfiles)) {
7173 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7174 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7175 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
7176 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
7177 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007178
7179 Args.AddAllArgs(CmdArgs, options::OPT_L);
7180 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7181 Args.AddAllArgs(CmdArgs, options::OPT_e);
7182
Daniel Dunbar54423b22010-09-17 00:24:54 +00007183 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007184
Alexey Samsonov7811d192014-02-20 13:57:37 +00007185 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00007186
Chris Lattner3e2ee142010-07-07 16:01:42 +00007187 if (!Args.hasArg(options::OPT_nostdlib) &&
7188 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007189 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007190 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007191 CmdArgs.push_back("-lm");
7192 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007193 }
7194
7195 if (!Args.hasArg(options::OPT_nostdlib) &&
7196 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00007197 if (Args.hasArg(options::OPT_pthread))
7198 CmdArgs.push_back("-lpthread");
7199 CmdArgs.push_back("-lc");
7200 CmdArgs.push_back("-lCompilerRT-Generic");
7201 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
7202 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00007203 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007204 }
7205
Rafael Espindola236db462013-11-09 20:07:19 +00007206 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007207 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007208}
7209
Daniel Dunbarcc912342009-05-02 18:28:39 +00007210/// DragonFly Tools
7211
7212// For now, DragonFly Assemble does just about the same as for
7213// FreeBSD, but this may change soon.
7214void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007215 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007216 const InputInfoList &Inputs,
7217 const ArgList &Args,
7218 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007219 ArgStringList CmdArgs;
7220
7221 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7222 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007223 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00007224 CmdArgs.push_back("--32");
7225
7226 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7227 options::OPT_Xassembler);
7228
7229 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007230 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007231
7232 for (InputInfoList::const_iterator
7233 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7234 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00007235 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007236 }
7237
7238 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00007239 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007240 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007241}
7242
7243void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007244 const InputInfo &Output,
7245 const InputInfoList &Inputs,
7246 const ArgList &Args,
7247 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00007248 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00007249 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00007250 ArgStringList CmdArgs;
7251
John McCall65b8da02013-04-11 22:55:55 +00007252 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
7253 UseGCC47 = false;
7254
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007255 if (!D.SysRoot.empty())
7256 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7257
John McCall65b8da02013-04-11 22:55:55 +00007258 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007259 if (Args.hasArg(options::OPT_static)) {
7260 CmdArgs.push_back("-Bstatic");
7261 } else {
John McCall65b8da02013-04-11 22:55:55 +00007262 if (Args.hasArg(options::OPT_rdynamic))
7263 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007264 if (Args.hasArg(options::OPT_shared))
7265 CmdArgs.push_back("-Bshareable");
7266 else {
7267 CmdArgs.push_back("-dynamic-linker");
7268 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
7269 }
John McCall65b8da02013-04-11 22:55:55 +00007270 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007271 }
7272
7273 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7274 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007275 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007276 CmdArgs.push_back("-m");
7277 CmdArgs.push_back("elf_i386");
7278 }
7279
Daniel Dunbarb440f562010-08-02 02:38:21 +00007280 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007281 CmdArgs.push_back("-o");
7282 CmdArgs.push_back(Output.getFilename());
7283 } else {
7284 assert(Output.isNothing() && "Invalid output.");
7285 }
7286
7287 if (!Args.hasArg(options::OPT_nostdlib) &&
7288 !Args.hasArg(options::OPT_nostartfiles)) {
7289 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00007290 if (Args.hasArg(options::OPT_pg))
7291 CmdArgs.push_back(Args.MakeArgString(
7292 getToolChain().GetFilePath("gcrt1.o")));
7293 else {
7294 if (Args.hasArg(options::OPT_pie))
7295 CmdArgs.push_back(Args.MakeArgString(
7296 getToolChain().GetFilePath("Scrt1.o")));
7297 else
7298 CmdArgs.push_back(Args.MakeArgString(
7299 getToolChain().GetFilePath("crt1.o")));
7300 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007301 }
John McCall65b8da02013-04-11 22:55:55 +00007302 CmdArgs.push_back(Args.MakeArgString(
7303 getToolChain().GetFilePath("crti.o")));
7304 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
7305 CmdArgs.push_back(Args.MakeArgString(
7306 getToolChain().GetFilePath("crtbeginS.o")));
7307 else
7308 CmdArgs.push_back(Args.MakeArgString(
7309 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007310 }
7311
7312 Args.AddAllArgs(CmdArgs, options::OPT_L);
7313 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7314 Args.AddAllArgs(CmdArgs, options::OPT_e);
7315
Daniel Dunbar54423b22010-09-17 00:24:54 +00007316 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007317
7318 if (!Args.hasArg(options::OPT_nostdlib) &&
7319 !Args.hasArg(options::OPT_nodefaultlibs)) {
7320 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
7321 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00007322 if (UseGCC47)
7323 CmdArgs.push_back("-L/usr/lib/gcc47");
7324 else
7325 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007326
7327 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00007328 if (UseGCC47) {
7329 CmdArgs.push_back("-rpath");
7330 CmdArgs.push_back("/usr/lib/gcc47");
7331 } else {
7332 CmdArgs.push_back("-rpath");
7333 CmdArgs.push_back("/usr/lib/gcc44");
7334 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007335 }
7336
Hans Wennborg70850d82013-07-18 20:29:38 +00007337 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007338 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00007339 CmdArgs.push_back("-lm");
7340 }
7341
Daniel Dunbarcc912342009-05-02 18:28:39 +00007342 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00007343 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007344
7345 if (!Args.hasArg(options::OPT_nolibc)) {
7346 CmdArgs.push_back("-lc");
7347 }
7348
John McCall65b8da02013-04-11 22:55:55 +00007349 if (UseGCC47) {
7350 if (Args.hasArg(options::OPT_static) ||
7351 Args.hasArg(options::OPT_static_libgcc)) {
7352 CmdArgs.push_back("-lgcc");
7353 CmdArgs.push_back("-lgcc_eh");
7354 } else {
7355 if (Args.hasArg(options::OPT_shared_libgcc)) {
7356 CmdArgs.push_back("-lgcc_pic");
7357 if (!Args.hasArg(options::OPT_shared))
7358 CmdArgs.push_back("-lgcc");
7359 } else {
7360 CmdArgs.push_back("-lgcc");
7361 CmdArgs.push_back("--as-needed");
7362 CmdArgs.push_back("-lgcc_pic");
7363 CmdArgs.push_back("--no-as-needed");
7364 }
7365 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007366 } else {
John McCall65b8da02013-04-11 22:55:55 +00007367 if (Args.hasArg(options::OPT_shared)) {
7368 CmdArgs.push_back("-lgcc_pic");
7369 } else {
7370 CmdArgs.push_back("-lgcc");
7371 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007372 }
7373 }
7374
7375 if (!Args.hasArg(options::OPT_nostdlib) &&
7376 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00007377 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00007378 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00007379 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00007380 else
7381 CmdArgs.push_back(Args.MakeArgString(
7382 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007383 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00007384 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007385 }
7386
Alexey Samsonov7811d192014-02-20 13:57:37 +00007387 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007388
Daniel Dunbarcc912342009-05-02 18:28:39 +00007389 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00007390 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007391 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007392}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007393
7394void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
7395 const InputInfo &Output,
7396 const InputInfoList &Inputs,
7397 const ArgList &Args,
7398 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007399 ArgStringList CmdArgs;
7400
7401 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00007402 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
7403 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007404 } else {
7405 assert(Output.isNothing() && "Invalid output.");
7406 }
7407
7408 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg32e3b722013-08-09 17:38:42 +00007409 !Args.hasArg(options::OPT_nostartfiles) &&
7410 !C.getDriver().IsCLMode()) {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007411 CmdArgs.push_back("-defaultlib:libcmt");
7412 }
7413
7414 CmdArgs.push_back("-nologo");
7415
Hans Wennborgf1a74252013-09-10 20:18:04 +00007416 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
7417
7418 if (DLL) {
7419 CmdArgs.push_back(Args.MakeArgString("-dll"));
7420
7421 SmallString<128> ImplibName(Output.getFilename());
7422 llvm::sys::path::replace_extension(ImplibName, "lib");
7423 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
7424 ImplibName.str()));
7425 }
7426
Peter Collingbourne32701642013-11-01 18:16:25 +00007427 if (getToolChain().getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00007428 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00007429 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborg65f17522013-08-27 18:10:21 +00007430 SmallString<128> LibSanitizer(getToolChain().getDriver().ResourceDir);
Hans Wennborgf1a74252013-09-10 20:18:04 +00007431 llvm::sys::path::append(LibSanitizer, "lib", "windows");
7432 if (DLL) {
Timur Iskhodzhanov3b6adcb62013-09-11 11:45:31 +00007433 llvm::sys::path::append(LibSanitizer, "clang_rt.asan_dll_thunk-i386.lib");
Hans Wennborgf1a74252013-09-10 20:18:04 +00007434 } else {
7435 llvm::sys::path::append(LibSanitizer, "clang_rt.asan-i386.lib");
7436 }
7437 // FIXME: Handle 64-bit.
Hans Wennborg65f17522013-08-27 18:10:21 +00007438 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
7439 }
7440
Michael J. Spencere2f49362012-06-18 16:56:04 +00007441 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg2e274592013-08-13 23:38:57 +00007442 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00007443
7444 // Add filenames immediately.
7445 for (InputInfoList::const_iterator
7446 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7447 if (it->isFilename())
7448 CmdArgs.push_back(it->getFilename());
Hans Wennborgbe4a6762013-08-14 01:24:35 +00007449 else
7450 it->getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencere2f49362012-06-18 16:56:04 +00007451 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007452
7453 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00007454 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007455 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7456}
Hans Wennborg87cfa712013-09-19 20:32:16 +00007457
7458void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
7459 const InputInfo &Output,
7460 const InputInfoList &Inputs,
7461 const ArgList &Args,
7462 const char *LinkingOutput) const {
7463 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
7464}
7465
Hans Wennborg188382e2013-09-20 18:16:35 +00007466// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
7467// If one cannot be found, return FallbackName.
7468// We do this special search to prevent clang-cl from falling back onto itself
7469// if it's available as cl.exe on the path.
7470static std::string FindFallback(const char *FallbackName,
7471 const char *ClangProgramPath) {
7472 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
7473 if (!OptPath.hasValue())
7474 return FallbackName;
7475
7476#ifdef LLVM_ON_WIN32
7477 const StringRef PathSeparators = ";";
7478#else
7479 const StringRef PathSeparators = ":";
7480#endif
7481
7482 SmallVector<StringRef, 8> PathSegments;
7483 llvm::SplitString(OptPath.getValue(), PathSegments, PathSeparators);
7484
7485 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
7486 const StringRef &PathSegment = PathSegments[i];
7487 if (PathSegment.empty())
7488 continue;
7489
7490 SmallString<128> FilePath(PathSegment);
7491 llvm::sys::path::append(FilePath, FallbackName);
7492 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
7493 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
7494 return FilePath.str();
7495 }
7496
7497 return FallbackName;
7498}
7499
Hans Wennborg87cfa712013-09-19 20:32:16 +00007500Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
7501 const InputInfo &Output,
7502 const InputInfoList &Inputs,
7503 const ArgList &Args,
7504 const char *LinkingOutput) const {
7505 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00007506 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007507 CmdArgs.push_back("/c"); // Compile only.
7508 CmdArgs.push_back("/W0"); // No warnings.
7509
7510 // The goal is to be able to invoke this tool correctly based on
7511 // any flag accepted by clang-cl.
7512
7513 // These are spelled the same way in clang and cl.exe,.
7514 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
7515 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00007516
7517 // Optimization level.
7518 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
7519 if (A->getOption().getID() == options::OPT_O0) {
7520 CmdArgs.push_back("/Od");
7521 } else {
7522 StringRef OptLevel = A->getValue();
7523 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
7524 A->render(Args, CmdArgs);
7525 else if (OptLevel == "3")
7526 CmdArgs.push_back("/Ox");
7527 }
7528 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00007529
7530 // Flags for which clang-cl have an alias.
7531 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
7532
7533 if (Arg *A = Args.getLastArg(options::OPT_frtti, options::OPT_fno_rtti))
7534 CmdArgs.push_back(A->getOption().getID() == options::OPT_frtti ? "/GR"
7535 : "/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00007536 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
7537 options::OPT_fno_function_sections))
7538 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
7539 ? "/Gy"
7540 : "/Gy-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007541 if (Args.hasArg(options::OPT_fsyntax_only))
7542 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00007543 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
7544 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007545
Hans Wennborg260ff402013-09-27 17:54:18 +00007546 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
7547 for (size_t I = 0, E = Includes.size(); I != E; ++I)
7548 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Includes[I]));
7549
Hans Wennborg87cfa712013-09-19 20:32:16 +00007550 // Flags that can simply be passed through.
7551 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
7552 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
7553
7554 // The order of these flags is relevant, so pick the last one.
7555 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
7556 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
7557 A->render(Args, CmdArgs);
7558
7559
7560 // Input filename.
7561 assert(Inputs.size() == 1);
7562 const InputInfo &II = Inputs[0];
7563 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
7564 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
7565 if (II.isFilename())
7566 CmdArgs.push_back(II.getFilename());
7567 else
7568 II.getInputArg().renderAsInput(Args, CmdArgs);
7569
7570 // Output filename.
7571 assert(Output.getType() == types::TY_Object);
7572 const char *Fo = Args.MakeArgString(std::string("/Fo") +
7573 Output.getFilename());
7574 CmdArgs.push_back(Fo);
7575
Hans Wennborg188382e2013-09-20 18:16:35 +00007576 const Driver &D = getToolChain().getDriver();
7577 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborg87cfa712013-09-19 20:32:16 +00007578
Hans Wennborg188382e2013-09-20 18:16:35 +00007579 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00007580}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007581
7582
7583/// XCore Tools
7584// We pass assemble and link construction to the xcc tool.
7585
7586void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7587 const InputInfo &Output,
7588 const InputInfoList &Inputs,
7589 const ArgList &Args,
7590 const char *LinkingOutput) const {
7591 ArgStringList CmdArgs;
7592
7593 CmdArgs.push_back("-o");
7594 CmdArgs.push_back(Output.getFilename());
7595
7596 CmdArgs.push_back("-c");
7597
Robert Lytton9e8c1a42014-02-13 10:40:12 +00007598 if (Args.hasArg(options::OPT_v))
7599 CmdArgs.push_back("-v");
7600
7601 if (Args.hasArg(options::OPT_g_Group))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007602 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00007603
Robert Lytton8e95d4e2014-02-11 10:34:45 +00007604 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
7605 false))
7606 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007607
7608 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7609 options::OPT_Xassembler);
7610
7611 for (InputInfoList::const_iterator
7612 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7613 const InputInfo &II = *it;
7614 CmdArgs.push_back(II.getFilename());
7615 }
7616
7617 const char *Exec =
7618 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7619 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7620}
7621
7622void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
7623 const InputInfo &Output,
7624 const InputInfoList &Inputs,
7625 const ArgList &Args,
7626 const char *LinkingOutput) const {
7627 ArgStringList CmdArgs;
7628
7629 if (Output.isFilename()) {
7630 CmdArgs.push_back("-o");
7631 CmdArgs.push_back(Output.getFilename());
7632 } else {
7633 assert(Output.isNothing() && "Invalid output.");
7634 }
7635
Robert Lytton9e8c1a42014-02-13 10:40:12 +00007636 if (Args.hasArg(options::OPT_v))
7637 CmdArgs.push_back("-v");
7638
Robert Lyttonf7e03c12014-02-13 10:34:44 +00007639 ExceptionSettings EH = exceptionSettings(Args, getToolChain().getTriple());
7640 if (EH.ShouldUseExceptionTables)
7641 CmdArgs.push_back("-fexceptions");
7642
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007643 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7644
7645 const char *Exec =
7646 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7647 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7648}