blob: 95c2063695ccab1d81d9da25e4a1d81dd3e90090 [file] [log] [blame]
Daniel Dunbar5903d8c2009-03-17 22:07:58 +00001//===--- Tools.h - Tool Implementations -------------------------*- C++ -*-===//
2//
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
Benjamin Kramer2f5db8b2014-08-13 16:25:19 +000010#ifndef LLVM_CLANG_LIB_DRIVER_TOOLS_H
11#define LLVM_CLANG_LIB_DRIVER_TOOLS_H
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000012
David Majnemere11d3732015-06-08 00:22:46 +000013#include "clang/Basic/VersionTuple.h"
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000014#include "clang/Driver/Tool.h"
Daniel Dunbare6adeee2009-03-29 17:08:39 +000015#include "clang/Driver/Types.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000016#include "clang/Driver/Util.h"
Douglas Katzman3459ce22015-10-08 04:24:12 +000017#include "clang/Frontend/CodeGenOptions.h"
Joerg Sonnenberger637603a2011-05-16 13:35:02 +000018#include "llvm/ADT/Triple.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000019#include "llvm/Option/Option.h"
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000020#include "llvm/Support/Compiler.h"
21
22namespace clang {
Reid Klecknerbac59a12015-07-15 17:58:55 +000023class ObjCRuntime;
John McCall5fb5df92012-06-20 06:18:46 +000024
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000025namespace driver {
Reid Klecknerbac59a12015-07-15 17:58:55 +000026class Command;
27class Driver;
Douglas Gregor111af7d2009-04-18 00:34:01 +000028
Daniel Dunbarc1964212009-03-26 16:23:12 +000029namespace toolchains {
Reid Klecknerbac59a12015-07-15 17:58:55 +000030class MachO;
Daniel Dunbarc1964212009-03-26 16:23:12 +000031}
32
Daniel Dunbar15abb2e2009-03-17 22:18:43 +000033namespace tools {
Hans Wennborg1da044a2014-06-26 19:59:02 +000034
35namespace visualstudio {
Douglas Katzman95354292015-06-23 20:42:09 +000036class Compiler;
Hans Wennborg1da044a2014-06-26 19:59:02 +000037}
38
Reid Kleckner898229a2013-06-14 17:17:23 +000039using llvm::opt::ArgStringList;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000040
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +000041SmallString<128> getCompilerRT(const ToolChain &TC,
42 const llvm::opt::ArgList &Args,
43 StringRef Component, bool Shared = false);
Peter Collingbourne581f4382015-07-02 01:48:12 +000044
Reid Klecknerbac59a12015-07-15 17:58:55 +000045/// \brief Clang compiler tool.
46class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
47public:
48 static const char *getBaseInputName(const llvm::opt::ArgList &Args,
49 const InputInfo &Input);
50 static const char *getBaseInputStem(const llvm::opt::ArgList &Args,
51 const InputInfoList &Inputs);
52 static const char *getDependencyFileName(const llvm::opt::ArgList &Args,
53 const InputInfoList &Inputs);
Bob Wilsondecc03e2012-11-23 06:14:39 +000054
Reid Klecknerbac59a12015-07-15 17:58:55 +000055private:
56 void AddPreprocessingOptions(Compilation &C, const JobAction &JA,
57 const Driver &D, const llvm::opt::ArgList &Args,
58 llvm::opt::ArgStringList &CmdArgs,
59 const InputInfo &Output,
Artem Belevichfa11ab52015-11-17 22:28:46 +000060 const InputInfoList &Inputs,
61 const ToolChain *AuxToolChain) const;
Daniel Dunbard067f7f2009-04-08 23:54:23 +000062
Reid Klecknerbac59a12015-07-15 17:58:55 +000063 void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
Tim Northovera2ee4332014-03-29 15:09:45 +000064 llvm::opt::ArgStringList &CmdArgs) const;
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +000065 void AddARMTargetArgs(const llvm::Triple &Triple,
66 const llvm::opt::ArgList &Args,
Reid Klecknerbac59a12015-07-15 17:58:55 +000067 llvm::opt::ArgStringList &CmdArgs,
68 bool KernelOrKext) const;
69 void AddARM64TargetArgs(const llvm::opt::ArgList &Args,
Ulrich Weigand8afad612014-07-28 13:17:52 +000070 llvm::opt::ArgStringList &CmdArgs) const;
Reid Klecknerbac59a12015-07-15 17:58:55 +000071 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
72 llvm::opt::ArgStringList &CmdArgs) const;
73 void AddPPCTargetArgs(const llvm::opt::ArgList &Args,
Hans Wennborg75958c42013-08-08 00:17:41 +000074 llvm::opt::ArgStringList &CmdArgs) const;
Reid Klecknerbac59a12015-07-15 17:58:55 +000075 void AddR600TargetArgs(const llvm::opt::ArgList &Args,
76 llvm::opt::ArgStringList &CmdArgs) const;
77 void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
78 llvm::opt::ArgStringList &CmdArgs) const;
79 void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
80 llvm::opt::ArgStringList &CmdArgs) const;
81 void AddX86TargetArgs(const llvm::opt::ArgList &Args,
82 llvm::opt::ArgStringList &CmdArgs) const;
83 void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
84 llvm::opt::ArgStringList &CmdArgs) const;
Hans Wennborg75958c42013-08-08 00:17:41 +000085
Reid Klecknerbac59a12015-07-15 17:58:55 +000086 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
Hans Wennborg1da044a2014-06-26 19:59:02 +000087
Reid Klecknerbac59a12015-07-15 17:58:55 +000088 ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
89 llvm::opt::ArgStringList &cmdArgs,
90 RewriteKind rewrite) const;
Hans Wennborg1da044a2014-06-26 19:59:02 +000091
Reid Klecknerbac59a12015-07-15 17:58:55 +000092 void AddClangCLArgs(const llvm::opt::ArgList &Args,
Douglas Katzman3459ce22015-10-08 04:24:12 +000093 llvm::opt::ArgStringList &CmdArgs,
94 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
95 bool *EmitCodeView) const;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000096
Reid Klecknerbac59a12015-07-15 17:58:55 +000097 visualstudio::Compiler *getCLFallback() const;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000098
Reid Klecknerbac59a12015-07-15 17:58:55 +000099 mutable std::unique_ptr<visualstudio::Compiler> CLFallback;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000100
Reid Klecknerbac59a12015-07-15 17:58:55 +0000101public:
102 // CAUTION! The first constructor argument ("clang") is not arbitrary,
103 // as it is for other tools. Some operations on a Tool actually test
104 // whether that tool is Clang based on the Tool's Name as a string.
105 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC, RF_Full) {}
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000106
Reid Klecknerbac59a12015-07-15 17:58:55 +0000107 bool hasGoodDiagnostics() const override { return true; }
108 bool hasIntegratedAssembler() const override { return true; }
109 bool hasIntegratedCPP() const override { return true; }
110 bool canEmitIR() const override { return true; }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000111
Reid Klecknerbac59a12015-07-15 17:58:55 +0000112 void ConstructJob(Compilation &C, const JobAction &JA,
113 const InputInfo &Output, const InputInfoList &Inputs,
114 const llvm::opt::ArgList &TCArgs,
115 const char *LinkingOutput) const override;
116};
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000117
Reid Klecknerbac59a12015-07-15 17:58:55 +0000118/// \brief Clang integrated assembler tool.
119class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
120public:
121 ClangAs(const ToolChain &TC)
122 : Tool("clang::as", "clang integrated assembler", TC, RF_Full) {}
123 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
124 llvm::opt::ArgStringList &CmdArgs) const;
125 bool hasGoodDiagnostics() const override { return true; }
126 bool hasIntegratedAssembler() const override { return false; }
127 bool hasIntegratedCPP() const override { return false; }
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000128
Reid Klecknerbac59a12015-07-15 17:58:55 +0000129 void ConstructJob(Compilation &C, const JobAction &JA,
130 const InputInfo &Output, const InputInfoList &Inputs,
131 const llvm::opt::ArgList &TCArgs,
132 const char *LinkingOutput) const override;
133};
134
135/// \brief Base class for all GNU tools that provide the same behavior when
136/// it comes to response files support
137class LLVM_LIBRARY_VISIBILITY GnuTool : public Tool {
138 virtual void anchor();
139
140public:
141 GnuTool(const char *Name, const char *ShortName, const ToolChain &TC)
142 : Tool(Name, ShortName, TC, RF_Full, llvm::sys::WEM_CurrentCodePage) {}
143};
144
145/// gcc - Generic GCC tool implementations.
Daniel Dunbar82116f82009-03-17 22:45:24 +0000146namespace gcc {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000147class LLVM_LIBRARY_VISIBILITY Common : public GnuTool {
148public:
149 Common(const char *Name, const char *ShortName, const ToolChain &TC)
150 : GnuTool(Name, ShortName, TC) {}
Daniel Dunbara3246a02009-03-18 08:07:30 +0000151
Reid Klecknerbac59a12015-07-15 17:58:55 +0000152 void ConstructJob(Compilation &C, const JobAction &JA,
153 const InputInfo &Output, const InputInfoList &Inputs,
154 const llvm::opt::ArgList &TCArgs,
155 const char *LinkingOutput) const override;
Daniel Dunbara3246a02009-03-18 08:07:30 +0000156
Reid Klecknerbac59a12015-07-15 17:58:55 +0000157 /// RenderExtraToolArgs - Render any arguments necessary to force
158 /// the particular tool mode.
159 virtual void RenderExtraToolArgs(const JobAction &JA,
160 llvm::opt::ArgStringList &CmdArgs) const = 0;
161};
Daniel Dunbara3246a02009-03-18 08:07:30 +0000162
Reid Klecknerbac59a12015-07-15 17:58:55 +0000163class LLVM_LIBRARY_VISIBILITY Preprocessor : public Common {
164public:
165 Preprocessor(const ToolChain &TC)
166 : Common("gcc::Preprocessor", "gcc preprocessor", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000167
Reid Klecknerbac59a12015-07-15 17:58:55 +0000168 bool hasGoodDiagnostics() const override { return true; }
169 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000170
Reid Klecknerbac59a12015-07-15 17:58:55 +0000171 void RenderExtraToolArgs(const JobAction &JA,
172 llvm::opt::ArgStringList &CmdArgs) const override;
173};
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000174
Reid Klecknerbac59a12015-07-15 17:58:55 +0000175class LLVM_LIBRARY_VISIBILITY Compiler : public Common {
176public:
177 Compiler(const ToolChain &TC) : Common("gcc::Compiler", "gcc frontend", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000178
Reid Klecknerbac59a12015-07-15 17:58:55 +0000179 bool hasGoodDiagnostics() const override { return true; }
180 bool hasIntegratedCPP() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000181
Reid Klecknerbac59a12015-07-15 17:58:55 +0000182 void RenderExtraToolArgs(const JobAction &JA,
183 llvm::opt::ArgStringList &CmdArgs) const override;
184};
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000185
Reid Klecknerbac59a12015-07-15 17:58:55 +0000186class LLVM_LIBRARY_VISIBILITY Linker : public Common {
187public:
188 Linker(const ToolChain &TC) : Common("gcc::Linker", "linker (via gcc)", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000189
Reid Klecknerbac59a12015-07-15 17:58:55 +0000190 bool hasIntegratedCPP() const override { return false; }
191 bool isLinkJob() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000192
Reid Klecknerbac59a12015-07-15 17:58:55 +0000193 void RenderExtraToolArgs(const JobAction &JA,
194 llvm::opt::ArgStringList &CmdArgs) const override;
195};
Daniel Dunbar82116f82009-03-17 22:45:24 +0000196} // end namespace gcc
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000197
Tony Linthicum76329bf2011-12-12 21:14:55 +0000198namespace hexagon {
Douglas Katzman95354292015-06-23 20:42:09 +0000199// For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile
200// and Compile.
201// We simply use "clang -cc1" for those actions.
202class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
203public:
204 Assembler(const ToolChain &TC)
205 : GnuTool("hexagon::Assembler", "hexagon-as", TC) {}
Tony Linthicum76329bf2011-12-12 21:14:55 +0000206
Douglas Katzman95354292015-06-23 20:42:09 +0000207 bool hasIntegratedCPP() const override { return false; }
Tony Linthicum76329bf2011-12-12 21:14:55 +0000208
Reid Klecknerbac59a12015-07-15 17:58:55 +0000209 void RenderExtraToolArgs(const JobAction &JA,
210 llvm::opt::ArgStringList &CmdArgs) const;
211 void ConstructJob(Compilation &C, const JobAction &JA,
212 const InputInfo &Output, const InputInfoList &Inputs,
213 const llvm::opt::ArgList &TCArgs,
214 const char *LinkingOutput) const override;
Douglas Katzman95354292015-06-23 20:42:09 +0000215};
Tony Linthicum76329bf2011-12-12 21:14:55 +0000216
Douglas Katzman95354292015-06-23 20:42:09 +0000217class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
218public:
219 Linker(const ToolChain &TC) : GnuTool("hexagon::Linker", "hexagon-ld", TC) {}
Tony Linthicum76329bf2011-12-12 21:14:55 +0000220
Douglas Katzman95354292015-06-23 20:42:09 +0000221 bool hasIntegratedCPP() const override { return false; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000222 bool isLinkJob() const override { return true; }
Tony Linthicum76329bf2011-12-12 21:14:55 +0000223
Reid Klecknerbac59a12015-07-15 17:58:55 +0000224 virtual void RenderExtraToolArgs(const JobAction &JA,
225 llvm::opt::ArgStringList &CmdArgs) const;
226 void ConstructJob(Compilation &C, const JobAction &JA,
227 const InputInfo &Output, const InputInfoList &Inputs,
228 const llvm::opt::ArgList &TCArgs,
229 const char *LinkingOutput) const override;
230};
Tony Linthicum76329bf2011-12-12 21:14:55 +0000231} // end namespace hexagon.
232
Tom Stellard8fa33092015-07-18 01:49:05 +0000233namespace amdgpu {
234
235class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
236public:
237 Linker(const ToolChain &TC) : GnuTool("amdgpu::Linker", "lld", TC) {}
238 bool isLinkJob() const override { return true; }
239 bool hasIntegratedCPP() const override { return false; }
240 void ConstructJob(Compilation &C, const JobAction &JA,
241 const InputInfo &Output, const InputInfoList &Inputs,
242 const llvm::opt::ArgList &TCArgs,
243 const char *LinkingOutput) const override;
244};
245
246} // end namespace amdgpu
247
Bernard Ogden31561762013-12-12 13:27:11 +0000248namespace arm {
Renato Goline17c5802015-07-27 23:44:42 +0000249std::string getARMTargetCPU(StringRef CPU, StringRef Arch,
Reid Klecknerbac59a12015-07-15 17:58:55 +0000250 const llvm::Triple &Triple);
Renato Goline17c5802015-07-27 23:44:42 +0000251const std::string getARMArch(StringRef Arch,
Reid Klecknerbac59a12015-07-15 17:58:55 +0000252 const llvm::Triple &Triple);
Chandler Carruthd96f37a2015-08-30 07:51:18 +0000253StringRef getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple);
Vladimir Sukharev64f68242015-09-23 09:29:32 +0000254StringRef getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
255 const llvm::Triple &Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +0000256
Reid Klecknerbac59a12015-07-15 17:58:55 +0000257void appendEBLinkFlags(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs,
258 const llvm::Triple &Triple);
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000259} // end namespace arm
Tony Linthicum76329bf2011-12-12 21:14:55 +0000260
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000261namespace mips {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000262typedef enum { NanLegacy = 1, Nan2008 = 2 } NanEncoding;
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +0000263
264enum class FloatABI {
265 Invalid,
266 Soft,
267 Hard,
268};
269
Reid Klecknerbac59a12015-07-15 17:58:55 +0000270NanEncoding getSupportedNanEncoding(StringRef &CPU);
271void getMipsCPUAndABI(const llvm::opt::ArgList &Args,
272 const llvm::Triple &Triple, StringRef &CPUName,
273 StringRef &ABIName);
Vasileios Kalintirisc744e122015-11-12 15:26:54 +0000274std::string getMipsABILibSuffix(const llvm::opt::ArgList &Args,
275 const llvm::Triple &Triple);
Reid Klecknerbac59a12015-07-15 17:58:55 +0000276bool hasMipsAbiArg(const llvm::opt::ArgList &Args, const char *Value);
277bool isUCLibc(const llvm::opt::ArgList &Args);
278bool isNaN2008(const llvm::opt::ArgList &Args, const llvm::Triple &Triple);
279bool isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +0000280 StringRef ABIName, mips::FloatABI FloatABI);
Reid Klecknerbac59a12015-07-15 17:58:55 +0000281bool shouldUseFPXX(const llvm::opt::ArgList &Args, const llvm::Triple &Triple,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +0000282 StringRef CPUName, StringRef ABIName,
283 mips::FloatABI FloatABI);
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000284} // end namespace mips
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000285
Ulrich Weigand8afad612014-07-28 13:17:52 +0000286namespace ppc {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000287bool hasPPCAbiArg(const llvm::opt::ArgList &Args, const char *Value);
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000288} // end namespace ppc
Ulrich Weigand8afad612014-07-28 13:17:52 +0000289
Douglas Katzman95354292015-06-23 20:42:09 +0000290/// cloudabi -- Directly call GNU Binutils linker
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000291namespace cloudabi {
Douglas Katzman95354292015-06-23 20:42:09 +0000292class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000293public:
Douglas Katzman95354292015-06-23 20:42:09 +0000294 Linker(const ToolChain &TC) : GnuTool("cloudabi::Linker", "linker", TC) {}
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000295
296 bool hasIntegratedCPP() const override { return false; }
297 bool isLinkJob() const override { return true; }
298
299 void ConstructJob(Compilation &C, const JobAction &JA,
300 const InputInfo &Output, const InputInfoList &Inputs,
301 const llvm::opt::ArgList &TCArgs,
302 const char *LinkingOutput) const override;
303};
304} // end namespace cloudabi
305
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000306namespace darwin {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000307llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
308void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
Rafael Espindoladcbf6982012-10-31 18:51:07 +0000309
Reid Klecknerbac59a12015-07-15 17:58:55 +0000310class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
311 virtual void anchor();
Daniel Dunbare9ded432009-09-09 18:36:20 +0000312
Reid Klecknerbac59a12015-07-15 17:58:55 +0000313protected:
314 void AddMachOArch(const llvm::opt::ArgList &Args,
315 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbare9ded432009-09-09 18:36:20 +0000316
Reid Klecknerbac59a12015-07-15 17:58:55 +0000317 const toolchains::MachO &getMachOToolChain() const {
318 return reinterpret_cast<const toolchains::MachO &>(getToolChain());
319 }
Daniel Dunbare9ded432009-09-09 18:36:20 +0000320
Reid Klecknerbac59a12015-07-15 17:58:55 +0000321public:
322 MachOTool(
323 const char *Name, const char *ShortName, const ToolChain &TC,
324 ResponseFileSupport ResponseSupport = RF_None,
325 llvm::sys::WindowsEncodingMethod ResponseEncoding = llvm::sys::WEM_UTF8,
326 const char *ResponseFlag = "@")
327 : Tool(Name, ShortName, TC, ResponseSupport, ResponseEncoding,
328 ResponseFlag) {}
329};
Daniel Dunbarbe220842009-03-20 16:06:39 +0000330
Reid Klecknerbac59a12015-07-15 17:58:55 +0000331class LLVM_LIBRARY_VISIBILITY Assembler : public MachOTool {
332public:
333 Assembler(const ToolChain &TC)
334 : MachOTool("darwin::Assembler", "assembler", TC) {}
Daniel Dunbarbe220842009-03-20 16:06:39 +0000335
Reid Klecknerbac59a12015-07-15 17:58:55 +0000336 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarbe220842009-03-20 16:06:39 +0000337
Reid Klecknerbac59a12015-07-15 17:58:55 +0000338 void ConstructJob(Compilation &C, const JobAction &JA,
339 const InputInfo &Output, const InputInfoList &Inputs,
340 const llvm::opt::ArgList &TCArgs,
341 const char *LinkingOutput) const override;
342};
Daniel Dunbarc1964212009-03-26 16:23:12 +0000343
Reid Klecknerbac59a12015-07-15 17:58:55 +0000344class LLVM_LIBRARY_VISIBILITY Linker : public MachOTool {
345 bool NeedsTempPath(const InputInfoList &Inputs) const;
346 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
347 llvm::opt::ArgStringList &CmdArgs,
348 const InputInfoList &Inputs) const;
Daniel Dunbarc1964212009-03-26 16:23:12 +0000349
Reid Klecknerbac59a12015-07-15 17:58:55 +0000350public:
351 Linker(const ToolChain &TC)
352 : MachOTool("darwin::Linker", "linker", TC, RF_FileList,
353 llvm::sys::WEM_UTF8, "-filelist") {}
Daniel Dunbarc1964212009-03-26 16:23:12 +0000354
Reid Klecknerbac59a12015-07-15 17:58:55 +0000355 bool hasIntegratedCPP() const override { return false; }
356 bool isLinkJob() const override { return true; }
Daniel Dunbarc1964212009-03-26 16:23:12 +0000357
Reid Klecknerbac59a12015-07-15 17:58:55 +0000358 void ConstructJob(Compilation &C, const JobAction &JA,
359 const InputInfo &Output, const InputInfoList &Inputs,
360 const llvm::opt::ArgList &TCArgs,
361 const char *LinkingOutput) const override;
362};
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000363
Reid Klecknerbac59a12015-07-15 17:58:55 +0000364class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool {
365public:
366 Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000367
Reid Klecknerbac59a12015-07-15 17:58:55 +0000368 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar88299622010-06-04 18:28:36 +0000369
Reid Klecknerbac59a12015-07-15 17:58:55 +0000370 void ConstructJob(Compilation &C, const JobAction &JA,
371 const InputInfo &Output, const InputInfoList &Inputs,
372 const llvm::opt::ArgList &TCArgs,
373 const char *LinkingOutput) const override;
374};
Daniel Dunbar88299622010-06-04 18:28:36 +0000375
Reid Klecknerbac59a12015-07-15 17:58:55 +0000376class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool {
377public:
378 Dsymutil(const ToolChain &TC)
379 : MachOTool("darwin::Dsymutil", "dsymutil", TC) {}
Daniel Dunbar88299622010-06-04 18:28:36 +0000380
Reid Klecknerbac59a12015-07-15 17:58:55 +0000381 bool hasIntegratedCPP() const override { return false; }
382 bool isDsymutilJob() const override { return true; }
Eric Christopher551ef452011-08-23 17:56:55 +0000383
Reid Klecknerbac59a12015-07-15 17:58:55 +0000384 void ConstructJob(Compilation &C, const JobAction &JA,
385 const InputInfo &Output, const InputInfoList &Inputs,
386 const llvm::opt::ArgList &TCArgs,
387 const char *LinkingOutput) const override;
388};
Eric Christopher551ef452011-08-23 17:56:55 +0000389
Reid Klecknerbac59a12015-07-15 17:58:55 +0000390class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool {
391public:
392 VerifyDebug(const ToolChain &TC)
393 : MachOTool("darwin::VerifyDebug", "dwarfdump", TC) {}
Eric Christopher551ef452011-08-23 17:56:55 +0000394
Reid Klecknerbac59a12015-07-15 17:58:55 +0000395 bool hasIntegratedCPP() const override { return false; }
Eric Christopher551ef452011-08-23 17:56:55 +0000396
Reid Klecknerbac59a12015-07-15 17:58:55 +0000397 void ConstructJob(Compilation &C, const JobAction &JA,
398 const InputInfo &Output, const InputInfoList &Inputs,
399 const llvm::opt::ArgList &TCArgs,
400 const char *LinkingOutput) const override;
401};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000402} // end namespace darwin
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000403
Douglas Katzman95354292015-06-23 20:42:09 +0000404/// openbsd -- Directly call GNU Binutils assembler and linker
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000405namespace openbsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000406class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
407public:
408 Assembler(const ToolChain &TC)
409 : GnuTool("openbsd::Assembler", "assembler", TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000410
Douglas Katzman95354292015-06-23 20:42:09 +0000411 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000412
Douglas Katzman95354292015-06-23 20:42:09 +0000413 void ConstructJob(Compilation &C, const JobAction &JA,
414 const InputInfo &Output, const InputInfoList &Inputs,
415 const llvm::opt::ArgList &TCArgs,
416 const char *LinkingOutput) const override;
417};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000418
Douglas Katzman95354292015-06-23 20:42:09 +0000419class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
420public:
421 Linker(const ToolChain &TC) : GnuTool("openbsd::Linker", "linker", TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000422
Douglas Katzman95354292015-06-23 20:42:09 +0000423 bool hasIntegratedCPP() const override { return false; }
424 bool isLinkJob() const override { return true; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000425
Reid Klecknerbac59a12015-07-15 17:58:55 +0000426 void ConstructJob(Compilation &C, const JobAction &JA,
427 const InputInfo &Output, const InputInfoList &Inputs,
428 const llvm::opt::ArgList &TCArgs,
429 const char *LinkingOutput) const override;
430};
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000431} // end namespace openbsd
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000432
Douglas Katzman95354292015-06-23 20:42:09 +0000433/// bitrig -- Directly call GNU Binutils assembler and linker
Eli Friedman9fa28852012-08-08 23:57:20 +0000434namespace bitrig {
Douglas Katzman95354292015-06-23 20:42:09 +0000435class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
436public:
437 Assembler(const ToolChain &TC)
438 : GnuTool("bitrig::Assembler", "assembler", TC) {}
Eli Friedman9fa28852012-08-08 23:57:20 +0000439
Douglas Katzman95354292015-06-23 20:42:09 +0000440 bool hasIntegratedCPP() const override { return false; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000441
Douglas Katzman95354292015-06-23 20:42:09 +0000442 void ConstructJob(Compilation &C, const JobAction &JA,
443 const InputInfo &Output, const InputInfoList &Inputs,
444 const llvm::opt::ArgList &TCArgs,
445 const char *LinkingOutput) const override;
446};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000447
Douglas Katzman95354292015-06-23 20:42:09 +0000448class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
449public:
450 Linker(const ToolChain &TC) : GnuTool("bitrig::Linker", "linker", TC) {}
Eli Friedman9fa28852012-08-08 23:57:20 +0000451
Douglas Katzman95354292015-06-23 20:42:09 +0000452 bool hasIntegratedCPP() const override { return false; }
453 bool isLinkJob() const override { return true; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000454
Reid Klecknerbac59a12015-07-15 17:58:55 +0000455 void ConstructJob(Compilation &C, const JobAction &JA,
456 const InputInfo &Output, const InputInfoList &Inputs,
457 const llvm::opt::ArgList &TCArgs,
458 const char *LinkingOutput) const override;
459};
Eli Friedman9fa28852012-08-08 23:57:20 +0000460} // end namespace bitrig
461
Douglas Katzman95354292015-06-23 20:42:09 +0000462/// freebsd -- Directly call GNU Binutils assembler and linker
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000463namespace freebsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000464class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
465public:
466 Assembler(const ToolChain &TC)
467 : GnuTool("freebsd::Assembler", "assembler", TC) {}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000468
Douglas Katzman95354292015-06-23 20:42:09 +0000469 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000470
Douglas Katzman95354292015-06-23 20:42:09 +0000471 void ConstructJob(Compilation &C, const JobAction &JA,
472 const InputInfo &Output, const InputInfoList &Inputs,
473 const llvm::opt::ArgList &TCArgs,
474 const char *LinkingOutput) const override;
475};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000476
Douglas Katzman95354292015-06-23 20:42:09 +0000477class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
478public:
479 Linker(const ToolChain &TC) : GnuTool("freebsd::Linker", "linker", TC) {}
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000480
Douglas Katzman95354292015-06-23 20:42:09 +0000481 bool hasIntegratedCPP() const override { return false; }
482 bool isLinkJob() const override { return true; }
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000483
Reid Klecknerbac59a12015-07-15 17:58:55 +0000484 void ConstructJob(Compilation &C, const JobAction &JA,
485 const InputInfo &Output, const InputInfoList &Inputs,
486 const llvm::opt::ArgList &TCArgs,
487 const char *LinkingOutput) const override;
488};
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000489} // end namespace freebsd
490
Douglas Katzman95354292015-06-23 20:42:09 +0000491/// netbsd -- Directly call GNU Binutils assembler and linker
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000492namespace netbsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000493class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
Douglas Katzman95354292015-06-23 20:42:09 +0000494public:
495 Assembler(const ToolChain &TC)
496 : GnuTool("netbsd::Assembler", "assembler", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000497
Douglas Katzman95354292015-06-23 20:42:09 +0000498 bool hasIntegratedCPP() const override { return false; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000499
Douglas Katzman95354292015-06-23 20:42:09 +0000500 void ConstructJob(Compilation &C, const JobAction &JA,
501 const InputInfo &Output, const InputInfoList &Inputs,
502 const llvm::opt::ArgList &TCArgs,
503 const char *LinkingOutput) const override;
504};
Joerg Sonnenberger637603a2011-05-16 13:35:02 +0000505
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000506class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
Douglas Katzman95354292015-06-23 20:42:09 +0000507public:
508 Linker(const ToolChain &TC) : GnuTool("netbsd::Linker", "linker", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000509
Douglas Katzman95354292015-06-23 20:42:09 +0000510 bool hasIntegratedCPP() const override { return false; }
511 bool isLinkJob() const override { return true; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000512
Reid Klecknerbac59a12015-07-15 17:58:55 +0000513 void ConstructJob(Compilation &C, const JobAction &JA,
514 const InputInfo &Output, const InputInfoList &Inputs,
515 const llvm::opt::ArgList &TCArgs,
516 const char *LinkingOutput) const override;
517};
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000518} // end namespace netbsd
519
Douglas Katzman95354292015-06-23 20:42:09 +0000520/// Directly call GNU Binutils' assembler and linker.
Thomas Schwinge4e555262013-03-28 19:04:25 +0000521namespace gnutools {
Douglas Katzman95354292015-06-23 20:42:09 +0000522class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
523public:
524 Assembler(const ToolChain &TC) : GnuTool("GNU::Assembler", "assembler", TC) {}
Rafael Espindola92b00932010-08-10 00:25:48 +0000525
Douglas Katzman95354292015-06-23 20:42:09 +0000526 bool hasIntegratedCPP() const override { return false; }
527
528 void ConstructJob(Compilation &C, const JobAction &JA,
529 const InputInfo &Output, const InputInfoList &Inputs,
530 const llvm::opt::ArgList &TCArgs,
531 const char *LinkingOutput) const override;
532};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000533
Douglas Katzman95354292015-06-23 20:42:09 +0000534class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
535public:
536 Linker(const ToolChain &TC) : GnuTool("GNU::Linker", "linker", TC) {}
537
538 bool hasIntegratedCPP() const override { return false; }
539 bool isLinkJob() const override { return true; }
Rafael Espindola92b00932010-08-10 00:25:48 +0000540
Reid Klecknerbac59a12015-07-15 17:58:55 +0000541 void ConstructJob(Compilation &C, const JobAction &JA,
542 const InputInfo &Output, const InputInfoList &Inputs,
543 const llvm::opt::ArgList &TCArgs,
544 const char *LinkingOutput) const override;
545};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000546} // end namespace gnutools
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000547
Reid Klecknerbac59a12015-07-15 17:58:55 +0000548namespace nacltools {
549class LLVM_LIBRARY_VISIBILITY AssemblerARM : public gnutools::Assembler {
550public:
551 AssemblerARM(const ToolChain &TC) : gnutools::Assembler(TC) {}
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000552
Reid Klecknerbac59a12015-07-15 17:58:55 +0000553 void ConstructJob(Compilation &C, const JobAction &JA,
554 const InputInfo &Output, const InputInfoList &Inputs,
555 const llvm::opt::ArgList &TCArgs,
556 const char *LinkingOutput) const override;
557};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000558
Derek Schuff821d8842015-11-16 22:21:25 +0000559class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000560public:
Derek Schuff821d8842015-11-16 22:21:25 +0000561 Linker(const ToolChain &TC) : GnuTool("NaCl::Linker", "linker", TC) {}
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000562
Reid Klecknerbac59a12015-07-15 17:58:55 +0000563 bool hasIntegratedCPP() const override { return false; }
564 bool isLinkJob() const override { return true; }
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000565
Reid Klecknerbac59a12015-07-15 17:58:55 +0000566 void ConstructJob(Compilation &C, const JobAction &JA,
567 const InputInfo &Output, const InputInfoList &Inputs,
568 const llvm::opt::ArgList &TCArgs,
569 const char *LinkingOutput) const override;
570};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000571} // end namespace nacltools
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000572
Douglas Katzman95354292015-06-23 20:42:09 +0000573/// minix -- Directly call GNU Binutils assembler and linker
Chris Lattner3e2ee142010-07-07 16:01:42 +0000574namespace minix {
Douglas Katzman95354292015-06-23 20:42:09 +0000575class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
576public:
577 Assembler(const ToolChain &TC)
578 : GnuTool("minix::Assembler", "assembler", TC) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000579
Douglas Katzman95354292015-06-23 20:42:09 +0000580 bool hasIntegratedCPP() const override { return false; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000581
Douglas Katzman95354292015-06-23 20:42:09 +0000582 void ConstructJob(Compilation &C, const JobAction &JA,
583 const InputInfo &Output, const InputInfoList &Inputs,
584 const llvm::opt::ArgList &TCArgs,
585 const char *LinkingOutput) const override;
586};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000587
Douglas Katzman95354292015-06-23 20:42:09 +0000588class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
589public:
590 Linker(const ToolChain &TC) : GnuTool("minix::Linker", "linker", TC) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000591
Douglas Katzman95354292015-06-23 20:42:09 +0000592 bool hasIntegratedCPP() const override { return false; }
593 bool isLinkJob() const override { return true; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000594
Reid Klecknerbac59a12015-07-15 17:58:55 +0000595 void ConstructJob(Compilation &C, const JobAction &JA,
596 const InputInfo &Output, const InputInfoList &Inputs,
597 const llvm::opt::ArgList &TCArgs,
598 const char *LinkingOutput) const override;
599};
Chris Lattner3e2ee142010-07-07 16:01:42 +0000600} // end namespace minix
601
Douglas Katzman95354292015-06-23 20:42:09 +0000602/// solaris -- Directly call Solaris assembler and linker
David Chisnallf571cde2012-02-15 13:39:01 +0000603namespace solaris {
Douglas Katzman95354292015-06-23 20:42:09 +0000604class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
605public:
606 Assembler(const ToolChain &TC)
607 : Tool("solaris::Assembler", "assembler", TC) {}
David Chisnallf571cde2012-02-15 13:39:01 +0000608
Douglas Katzman95354292015-06-23 20:42:09 +0000609 bool hasIntegratedCPP() const override { return false; }
David Chisnallf571cde2012-02-15 13:39:01 +0000610
Douglas Katzman95354292015-06-23 20:42:09 +0000611 void ConstructJob(Compilation &C, const JobAction &JA,
612 const InputInfo &Output, const InputInfoList &Inputs,
613 const llvm::opt::ArgList &TCArgs,
614 const char *LinkingOutput) const override;
615};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000616
Douglas Katzman95354292015-06-23 20:42:09 +0000617class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
618public:
619 Linker(const ToolChain &TC) : Tool("solaris::Linker", "linker", TC) {}
David Chisnallf571cde2012-02-15 13:39:01 +0000620
Douglas Katzman95354292015-06-23 20:42:09 +0000621 bool hasIntegratedCPP() const override { return false; }
622 bool isLinkJob() const override { return true; }
David Chisnallf571cde2012-02-15 13:39:01 +0000623
Reid Klecknerbac59a12015-07-15 17:58:55 +0000624 void ConstructJob(Compilation &C, const JobAction &JA,
625 const InputInfo &Output, const InputInfoList &Inputs,
626 const llvm::opt::ArgList &TCArgs,
627 const char *LinkingOutput) const override;
628};
David Chisnalla9ed5d72012-02-15 16:25:46 +0000629} // end namespace solaris
David Chisnallf571cde2012-02-15 13:39:01 +0000630
Douglas Katzman95354292015-06-23 20:42:09 +0000631/// dragonfly -- Directly call GNU Binutils assembler and linker
Daniel Dunbarcc912342009-05-02 18:28:39 +0000632namespace dragonfly {
Douglas Katzman95354292015-06-23 20:42:09 +0000633class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
634public:
635 Assembler(const ToolChain &TC)
636 : GnuTool("dragonfly::Assembler", "assembler", TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000637
Douglas Katzman95354292015-06-23 20:42:09 +0000638 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000639
Douglas Katzman95354292015-06-23 20:42:09 +0000640 void ConstructJob(Compilation &C, const JobAction &JA,
641 const InputInfo &Output, const InputInfoList &Inputs,
642 const llvm::opt::ArgList &TCArgs,
643 const char *LinkingOutput) const override;
644};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000645
Douglas Katzman95354292015-06-23 20:42:09 +0000646class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
647public:
648 Linker(const ToolChain &TC) : GnuTool("dragonfly::Linker", "linker", TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000649
Douglas Katzman95354292015-06-23 20:42:09 +0000650 bool hasIntegratedCPP() const override { return false; }
651 bool isLinkJob() const override { return true; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000652
Reid Klecknerbac59a12015-07-15 17:58:55 +0000653 void ConstructJob(Compilation &C, const JobAction &JA,
654 const InputInfo &Output, const InputInfoList &Inputs,
655 const llvm::opt::ArgList &TCArgs,
656 const char *LinkingOutput) const override;
657};
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000658} // end namespace dragonfly
Daniel Dunbarcc912342009-05-02 18:28:39 +0000659
Hans Wennborg1da044a2014-06-26 19:59:02 +0000660/// Visual studio tools.
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000661namespace visualstudio {
Douglas Katzman95354292015-06-23 20:42:09 +0000662VersionTuple getMSVCVersion(const Driver *D, const llvm::Triple &Triple,
663 const llvm::opt::ArgList &Args, bool IsWindowsMSVC);
David Majnemere11d3732015-06-08 00:22:46 +0000664
Douglas Katzman95354292015-06-23 20:42:09 +0000665class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
666public:
667 Linker(const ToolChain &TC)
668 : Tool("visualstudio::Linker", "linker", TC, RF_Full,
669 llvm::sys::WEM_UTF16) {}
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000670
Douglas Katzman95354292015-06-23 20:42:09 +0000671 bool hasIntegratedCPP() const override { return false; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000672 bool isLinkJob() const override { return true; }
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000673
Reid Klecknerbac59a12015-07-15 17:58:55 +0000674 void ConstructJob(Compilation &C, const JobAction &JA,
675 const InputInfo &Output, const InputInfoList &Inputs,
676 const llvm::opt::ArgList &TCArgs,
677 const char *LinkingOutput) const override;
Douglas Katzman95354292015-06-23 20:42:09 +0000678};
Hans Wennborg87cfa712013-09-19 20:32:16 +0000679
Douglas Katzman95354292015-06-23 20:42:09 +0000680class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
681public:
682 Compiler(const ToolChain &TC)
683 : Tool("visualstudio::Compiler", "compiler", TC, RF_Full,
684 llvm::sys::WEM_UTF16) {}
Hans Wennborg87cfa712013-09-19 20:32:16 +0000685
Douglas Katzman95354292015-06-23 20:42:09 +0000686 bool hasIntegratedAssembler() const override { return true; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000687 bool hasIntegratedCPP() const override { return true; }
688 bool isLinkJob() const override { return false; }
Hans Wennborg87cfa712013-09-19 20:32:16 +0000689
Reid Klecknerbac59a12015-07-15 17:58:55 +0000690 void ConstructJob(Compilation &C, const JobAction &JA,
691 const InputInfo &Output, const InputInfoList &Inputs,
692 const llvm::opt::ArgList &TCArgs,
693 const char *LinkingOutput) const override;
Hans Wennborg87cfa712013-09-19 20:32:16 +0000694
Reid Klecknerbac59a12015-07-15 17:58:55 +0000695 std::unique_ptr<Command> GetCommand(Compilation &C, const JobAction &JA,
696 const InputInfo &Output,
697 const InputInfoList &Inputs,
698 const llvm::opt::ArgList &TCArgs,
699 const char *LinkingOutput) const;
700};
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000701} // end namespace visualstudio
702
Yaron Keren1c0070c2015-07-02 04:45:27 +0000703/// MinGW -- Directly call GNU Binutils assembler and linker
704namespace MinGW {
705class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
706public:
707 Assembler(const ToolChain &TC) : Tool("MinGW::Assemble", "assembler", TC) {}
708
709 bool hasIntegratedCPP() const override { return false; }
710
711 void ConstructJob(Compilation &C, const JobAction &JA,
712 const InputInfo &Output, const InputInfoList &Inputs,
713 const llvm::opt::ArgList &TCArgs,
714 const char *LinkingOutput) const override;
715};
716
717class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
718public:
719 Linker(const ToolChain &TC) : Tool("MinGW::Linker", "linker", TC) {}
720
721 bool hasIntegratedCPP() const override { return false; }
722 bool isLinkJob() const override { return true; }
723
724 void ConstructJob(Compilation &C, const JobAction &JA,
725 const InputInfo &Output, const InputInfoList &Inputs,
726 const llvm::opt::ArgList &TCArgs,
727 const char *LinkingOutput) const override;
728
729private:
730 void AddLibGCC(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs) const;
731};
732} // end namespace MinGW
733
Tim Northover9c7e0352013-12-12 11:55:52 +0000734namespace arm {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000735enum class FloatABI {
736 Invalid,
737 Soft,
738 SoftFP,
739 Hard,
740};
741
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000742FloatABI getARMFloatABI(const ToolChain &TC, const llvm::opt::ArgList &Args);
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000743} // end namespace arm
744
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000745namespace XCore {
Douglas Katzman95354292015-06-23 20:42:09 +0000746// For XCore, we do not need to instantiate tools for PreProcess, PreCompile and
747// Compile.
748// We simply use "clang -cc1" for those actions.
749class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000750public:
Douglas Katzman95354292015-06-23 20:42:09 +0000751 Assembler(const ToolChain &TC) : Tool("XCore::Assembler", "XCore-as", TC) {}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000752
753 bool hasIntegratedCPP() const override { return false; }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000754 void ConstructJob(Compilation &C, const JobAction &JA,
755 const InputInfo &Output, const InputInfoList &Inputs,
756 const llvm::opt::ArgList &TCArgs,
757 const char *LinkingOutput) const override;
758};
759
Douglas Katzman95354292015-06-23 20:42:09 +0000760class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000761public:
Douglas Katzman95354292015-06-23 20:42:09 +0000762 Linker(const ToolChain &TC) : Tool("XCore::Linker", "XCore-ld", TC) {}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000763
764 bool hasIntegratedCPP() const override { return false; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000765 bool isLinkJob() const override { return true; }
766 void ConstructJob(Compilation &C, const JobAction &JA,
767 const InputInfo &Output, const InputInfoList &Inputs,
768 const llvm::opt::ArgList &TCArgs,
769 const char *LinkingOutput) const override;
770};
771} // end namespace XCore.
Douglas Katzman95354292015-06-23 20:42:09 +0000772
Reid Klecknerbac59a12015-07-15 17:58:55 +0000773namespace CrossWindows {
774class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
775public:
776 Assembler(const ToolChain &TC) : Tool("CrossWindows::Assembler", "as", TC) {}
Douglas Katzman95354292015-06-23 20:42:09 +0000777
Reid Klecknerbac59a12015-07-15 17:58:55 +0000778 bool hasIntegratedCPP() const override { return false; }
Douglas Katzman95354292015-06-23 20:42:09 +0000779
Reid Klecknerbac59a12015-07-15 17:58:55 +0000780 void ConstructJob(Compilation &C, const JobAction &JA,
781 const InputInfo &Output, const InputInfoList &Inputs,
782 const llvm::opt::ArgList &TCArgs,
783 const char *LinkingOutput) const override;
784};
Douglas Katzman95354292015-06-23 20:42:09 +0000785
Reid Klecknerbac59a12015-07-15 17:58:55 +0000786class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
787public:
788 Linker(const ToolChain &TC)
789 : Tool("CrossWindows::Linker", "ld", TC, RF_Full) {}
Douglas Katzman95354292015-06-23 20:42:09 +0000790
Reid Klecknerbac59a12015-07-15 17:58:55 +0000791 bool hasIntegratedCPP() const override { return false; }
792 bool isLinkJob() const override { return true; }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000793
794 void ConstructJob(Compilation &C, const JobAction &JA,
795 const InputInfo &Output, const InputInfoList &Inputs,
796 const llvm::opt::ArgList &TCArgs,
797 const char *LinkingOutput) const override;
798};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000799} // end namespace CrossWindows
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000800
Douglas Katzman84a75642015-06-19 14:55:19 +0000801/// SHAVE tools -- Directly call moviCompile and moviAsm
802namespace SHAVE {
Douglas Katzman95354292015-06-23 20:42:09 +0000803class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
Douglas Katzman84a75642015-06-19 14:55:19 +0000804public:
Douglas Katzman95354292015-06-23 20:42:09 +0000805 Compiler(const ToolChain &TC) : Tool("moviCompile", "movicompile", TC) {}
Douglas Katzman84a75642015-06-19 14:55:19 +0000806
807 bool hasIntegratedCPP() const override { return true; }
808
809 void ConstructJob(Compilation &C, const JobAction &JA,
810 const InputInfo &Output, const InputInfoList &Inputs,
811 const llvm::opt::ArgList &TCArgs,
812 const char *LinkingOutput) const override;
813};
814
Douglas Katzman95354292015-06-23 20:42:09 +0000815class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
Douglas Katzman84a75642015-06-19 14:55:19 +0000816public:
Douglas Katzman95354292015-06-23 20:42:09 +0000817 Assembler(const ToolChain &TC) : Tool("moviAsm", "moviAsm", TC) {}
Douglas Katzman84a75642015-06-19 14:55:19 +0000818
819 bool hasIntegratedCPP() const override { return false; } // not sure.
820
821 void ConstructJob(Compilation &C, const JobAction &JA,
822 const InputInfo &Output, const InputInfoList &Inputs,
823 const llvm::opt::ArgList &TCArgs,
824 const char *LinkingOutput) const override;
825};
826} // end namespace SHAVE
827
Douglas Katzmand6e597c2015-09-17 19:56:40 +0000828/// The Myriad toolchain uses tools that are in two different namespaces.
829/// The Compiler and Assembler as defined above are in the SHAVE namespace,
830/// whereas the linker, which accepts code for a mixture of Sparc and SHAVE,
831/// is in the Myriad namespace.
832namespace Myriad {
833class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
834public:
835 Linker(const ToolChain &TC) : GnuTool("shave::Linker", "ld", TC) {}
836 bool hasIntegratedCPP() const override { return false; }
837 bool isLinkJob() const override { return true; }
838 void ConstructJob(Compilation &C, const JobAction &JA,
839 const InputInfo &Output, const InputInfoList &Inputs,
840 const llvm::opt::ArgList &TCArgs,
841 const char *LinkingOutput) const override;
842};
843} // end namespace Myriad
844
Filipe Cabecinhasc888e192015-10-14 12:25:43 +0000845namespace PS4cpu {
846class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
847public:
848 Assemble(const ToolChain &TC)
849 : Tool("PS4cpu::Assemble", "assembler", TC, RF_Full) {}
850
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000851 bool hasIntegratedCPP() const override { return false; }
Filipe Cabecinhasc888e192015-10-14 12:25:43 +0000852
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000853 void ConstructJob(Compilation &C, const JobAction &JA,
854 const InputInfo &Output,
855 const InputInfoList &Inputs,
856 const llvm::opt::ArgList &TCArgs,
857 const char *LinkingOutput) const override;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +0000858};
859
860class LLVM_LIBRARY_VISIBILITY Link : public Tool {
861public:
862 Link(const ToolChain &TC) : Tool("PS4cpu::Link", "linker", TC, RF_Full) {}
863
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000864 bool hasIntegratedCPP() const override { return false; }
865 bool isLinkJob() const override { return true; }
Filipe Cabecinhasc888e192015-10-14 12:25:43 +0000866
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000867 void ConstructJob(Compilation &C, const JobAction &JA,
868 const InputInfo &Output,
869 const InputInfoList &Inputs,
870 const llvm::opt::ArgList &TCArgs,
871 const char *LinkingOutput) const override;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +0000872};
873} // end namespace PS4cpu
874
Douglas Katzman9dc5fbb2015-06-03 16:56:50 +0000875} // end namespace tools
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000876} // end namespace driver
877} // end namespace clang
878
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000879#endif // LLVM_CLANG_LIB_DRIVER_TOOLS_H