blob: 30ddcc90c235eb1007f620866397b615f47dece2 [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"
Joerg Sonnenberger637603a2011-05-16 13:35:02 +000017#include "llvm/ADT/Triple.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000018#include "llvm/Option/Option.h"
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000019#include "llvm/Support/Compiler.h"
20
21namespace clang {
Reid Klecknerbac59a12015-07-15 17:58:55 +000022class ObjCRuntime;
John McCall5fb5df92012-06-20 06:18:46 +000023
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000024namespace driver {
Reid Klecknerbac59a12015-07-15 17:58:55 +000025class Command;
26class Driver;
Douglas Gregor111af7d2009-04-18 00:34:01 +000027
Daniel Dunbarc1964212009-03-26 16:23:12 +000028namespace toolchains {
Reid Klecknerbac59a12015-07-15 17:58:55 +000029class MachO;
Daniel Dunbarc1964212009-03-26 16:23:12 +000030}
31
Daniel Dunbar15abb2e2009-03-17 22:18:43 +000032namespace tools {
Hans Wennborg1da044a2014-06-26 19:59:02 +000033
34namespace visualstudio {
Douglas Katzman95354292015-06-23 20:42:09 +000035class Compiler;
Hans Wennborg1da044a2014-06-26 19:59:02 +000036}
37
Reid Kleckner898229a2013-06-14 17:17:23 +000038using llvm::opt::ArgStringList;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000039
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +000040SmallString<128> getCompilerRT(const ToolChain &TC,
41 const llvm::opt::ArgList &Args,
42 StringRef Component, bool Shared = false);
Peter Collingbourne581f4382015-07-02 01:48:12 +000043
Reid Klecknerbac59a12015-07-15 17:58:55 +000044/// \brief Clang compiler tool.
45class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
46public:
47 static const char *getBaseInputName(const llvm::opt::ArgList &Args,
48 const InputInfo &Input);
49 static const char *getBaseInputStem(const llvm::opt::ArgList &Args,
50 const InputInfoList &Inputs);
51 static const char *getDependencyFileName(const llvm::opt::ArgList &Args,
52 const InputInfoList &Inputs);
Bob Wilsondecc03e2012-11-23 06:14:39 +000053
Reid Klecknerbac59a12015-07-15 17:58:55 +000054private:
55 void AddPreprocessingOptions(Compilation &C, const JobAction &JA,
56 const Driver &D, const llvm::opt::ArgList &Args,
57 llvm::opt::ArgStringList &CmdArgs,
58 const InputInfo &Output,
59 const InputInfoList &Inputs) const;
Daniel Dunbard067f7f2009-04-08 23:54:23 +000060
Reid Klecknerbac59a12015-07-15 17:58:55 +000061 void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
Tim Northovera2ee4332014-03-29 15:09:45 +000062 llvm::opt::ArgStringList &CmdArgs) const;
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +000063 void AddARMTargetArgs(const llvm::Triple &Triple,
64 const llvm::opt::ArgList &Args,
Reid Klecknerbac59a12015-07-15 17:58:55 +000065 llvm::opt::ArgStringList &CmdArgs,
66 bool KernelOrKext) const;
67 void AddARM64TargetArgs(const llvm::opt::ArgList &Args,
Ulrich Weigand8afad612014-07-28 13:17:52 +000068 llvm::opt::ArgStringList &CmdArgs) const;
Reid Klecknerbac59a12015-07-15 17:58:55 +000069 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
70 llvm::opt::ArgStringList &CmdArgs) const;
71 void AddPPCTargetArgs(const llvm::opt::ArgList &Args,
Hans Wennborg75958c42013-08-08 00:17:41 +000072 llvm::opt::ArgStringList &CmdArgs) const;
Reid Klecknerbac59a12015-07-15 17:58:55 +000073 void AddR600TargetArgs(const llvm::opt::ArgList &Args,
74 llvm::opt::ArgStringList &CmdArgs) const;
75 void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
76 llvm::opt::ArgStringList &CmdArgs) const;
77 void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
78 llvm::opt::ArgStringList &CmdArgs) const;
79 void AddX86TargetArgs(const llvm::opt::ArgList &Args,
80 llvm::opt::ArgStringList &CmdArgs) const;
81 void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
82 llvm::opt::ArgStringList &CmdArgs) const;
Hans Wennborg75958c42013-08-08 00:17:41 +000083
Reid Klecknerbac59a12015-07-15 17:58:55 +000084 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
Hans Wennborg1da044a2014-06-26 19:59:02 +000085
Reid Klecknerbac59a12015-07-15 17:58:55 +000086 ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
87 llvm::opt::ArgStringList &cmdArgs,
88 RewriteKind rewrite) const;
Hans Wennborg1da044a2014-06-26 19:59:02 +000089
Reid Klecknerbac59a12015-07-15 17:58:55 +000090 void AddClangCLArgs(const llvm::opt::ArgList &Args,
91 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000092
Reid Klecknerbac59a12015-07-15 17:58:55 +000093 visualstudio::Compiler *getCLFallback() const;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000094
Reid Klecknerbac59a12015-07-15 17:58:55 +000095 mutable std::unique_ptr<visualstudio::Compiler> CLFallback;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000096
Reid Klecknerbac59a12015-07-15 17:58:55 +000097public:
98 // CAUTION! The first constructor argument ("clang") is not arbitrary,
99 // as it is for other tools. Some operations on a Tool actually test
100 // whether that tool is Clang based on the Tool's Name as a string.
101 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC, RF_Full) {}
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000102
Reid Klecknerbac59a12015-07-15 17:58:55 +0000103 bool hasGoodDiagnostics() const override { return true; }
104 bool hasIntegratedAssembler() const override { return true; }
105 bool hasIntegratedCPP() const override { return true; }
106 bool canEmitIR() const override { return true; }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000107
Reid Klecknerbac59a12015-07-15 17:58:55 +0000108 void ConstructJob(Compilation &C, const JobAction &JA,
109 const InputInfo &Output, const InputInfoList &Inputs,
110 const llvm::opt::ArgList &TCArgs,
111 const char *LinkingOutput) const override;
112};
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000113
Reid Klecknerbac59a12015-07-15 17:58:55 +0000114/// \brief Clang integrated assembler tool.
115class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
116public:
117 ClangAs(const ToolChain &TC)
118 : Tool("clang::as", "clang integrated assembler", TC, RF_Full) {}
119 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
120 llvm::opt::ArgStringList &CmdArgs) const;
121 bool hasGoodDiagnostics() const override { return true; }
122 bool hasIntegratedAssembler() const override { return false; }
123 bool hasIntegratedCPP() const override { return false; }
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000124
Reid Klecknerbac59a12015-07-15 17:58:55 +0000125 void ConstructJob(Compilation &C, const JobAction &JA,
126 const InputInfo &Output, const InputInfoList &Inputs,
127 const llvm::opt::ArgList &TCArgs,
128 const char *LinkingOutput) const override;
129};
130
131/// \brief Base class for all GNU tools that provide the same behavior when
132/// it comes to response files support
133class LLVM_LIBRARY_VISIBILITY GnuTool : public Tool {
134 virtual void anchor();
135
136public:
137 GnuTool(const char *Name, const char *ShortName, const ToolChain &TC)
138 : Tool(Name, ShortName, TC, RF_Full, llvm::sys::WEM_CurrentCodePage) {}
139};
140
141/// gcc - Generic GCC tool implementations.
Daniel Dunbar82116f82009-03-17 22:45:24 +0000142namespace gcc {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000143class LLVM_LIBRARY_VISIBILITY Common : public GnuTool {
144public:
145 Common(const char *Name, const char *ShortName, const ToolChain &TC)
146 : GnuTool(Name, ShortName, TC) {}
Daniel Dunbara3246a02009-03-18 08:07:30 +0000147
Reid Klecknerbac59a12015-07-15 17:58:55 +0000148 void ConstructJob(Compilation &C, const JobAction &JA,
149 const InputInfo &Output, const InputInfoList &Inputs,
150 const llvm::opt::ArgList &TCArgs,
151 const char *LinkingOutput) const override;
Daniel Dunbara3246a02009-03-18 08:07:30 +0000152
Reid Klecknerbac59a12015-07-15 17:58:55 +0000153 /// RenderExtraToolArgs - Render any arguments necessary to force
154 /// the particular tool mode.
155 virtual void RenderExtraToolArgs(const JobAction &JA,
156 llvm::opt::ArgStringList &CmdArgs) const = 0;
157};
Daniel Dunbara3246a02009-03-18 08:07:30 +0000158
Reid Klecknerbac59a12015-07-15 17:58:55 +0000159class LLVM_LIBRARY_VISIBILITY Preprocessor : public Common {
160public:
161 Preprocessor(const ToolChain &TC)
162 : Common("gcc::Preprocessor", "gcc preprocessor", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000163
Reid Klecknerbac59a12015-07-15 17:58:55 +0000164 bool hasGoodDiagnostics() const override { return true; }
165 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000166
Reid Klecknerbac59a12015-07-15 17:58:55 +0000167 void RenderExtraToolArgs(const JobAction &JA,
168 llvm::opt::ArgStringList &CmdArgs) const override;
169};
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000170
Reid Klecknerbac59a12015-07-15 17:58:55 +0000171class LLVM_LIBRARY_VISIBILITY Compiler : public Common {
172public:
173 Compiler(const ToolChain &TC) : Common("gcc::Compiler", "gcc frontend", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000174
Reid Klecknerbac59a12015-07-15 17:58:55 +0000175 bool hasGoodDiagnostics() const override { return true; }
176 bool hasIntegratedCPP() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000177
Reid Klecknerbac59a12015-07-15 17:58:55 +0000178 void RenderExtraToolArgs(const JobAction &JA,
179 llvm::opt::ArgStringList &CmdArgs) const override;
180};
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000181
Reid Klecknerbac59a12015-07-15 17:58:55 +0000182class LLVM_LIBRARY_VISIBILITY Linker : public Common {
183public:
184 Linker(const ToolChain &TC) : Common("gcc::Linker", "linker (via gcc)", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000185
Reid Klecknerbac59a12015-07-15 17:58:55 +0000186 bool hasIntegratedCPP() const override { return false; }
187 bool isLinkJob() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000188
Reid Klecknerbac59a12015-07-15 17:58:55 +0000189 void RenderExtraToolArgs(const JobAction &JA,
190 llvm::opt::ArgStringList &CmdArgs) const override;
191};
Daniel Dunbar82116f82009-03-17 22:45:24 +0000192} // end namespace gcc
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000193
Tony Linthicum76329bf2011-12-12 21:14:55 +0000194namespace hexagon {
Douglas Katzman95354292015-06-23 20:42:09 +0000195// For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile
196// and Compile.
197// We simply use "clang -cc1" for those actions.
198class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
199public:
200 Assembler(const ToolChain &TC)
201 : GnuTool("hexagon::Assembler", "hexagon-as", TC) {}
Tony Linthicum76329bf2011-12-12 21:14:55 +0000202
Douglas Katzman95354292015-06-23 20:42:09 +0000203 bool hasIntegratedCPP() const override { return false; }
Tony Linthicum76329bf2011-12-12 21:14:55 +0000204
Reid Klecknerbac59a12015-07-15 17:58:55 +0000205 void RenderExtraToolArgs(const JobAction &JA,
206 llvm::opt::ArgStringList &CmdArgs) const;
207 void ConstructJob(Compilation &C, const JobAction &JA,
208 const InputInfo &Output, const InputInfoList &Inputs,
209 const llvm::opt::ArgList &TCArgs,
210 const char *LinkingOutput) const override;
Douglas Katzman95354292015-06-23 20:42:09 +0000211};
Tony Linthicum76329bf2011-12-12 21:14:55 +0000212
Douglas Katzman95354292015-06-23 20:42:09 +0000213class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
214public:
215 Linker(const ToolChain &TC) : GnuTool("hexagon::Linker", "hexagon-ld", TC) {}
Tony Linthicum76329bf2011-12-12 21:14:55 +0000216
Douglas Katzman95354292015-06-23 20:42:09 +0000217 bool hasIntegratedCPP() const override { return false; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000218 bool isLinkJob() const override { return true; }
Tony Linthicum76329bf2011-12-12 21:14:55 +0000219
Reid Klecknerbac59a12015-07-15 17:58:55 +0000220 virtual void RenderExtraToolArgs(const JobAction &JA,
221 llvm::opt::ArgStringList &CmdArgs) const;
222 void ConstructJob(Compilation &C, const JobAction &JA,
223 const InputInfo &Output, const InputInfoList &Inputs,
224 const llvm::opt::ArgList &TCArgs,
225 const char *LinkingOutput) const override;
226};
Tony Linthicum76329bf2011-12-12 21:14:55 +0000227} // end namespace hexagon.
228
Tom Stellard8fa33092015-07-18 01:49:05 +0000229namespace amdgpu {
230
231class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
232public:
233 Linker(const ToolChain &TC) : GnuTool("amdgpu::Linker", "lld", TC) {}
234 bool isLinkJob() const override { return true; }
235 bool hasIntegratedCPP() const override { return false; }
236 void ConstructJob(Compilation &C, const JobAction &JA,
237 const InputInfo &Output, const InputInfoList &Inputs,
238 const llvm::opt::ArgList &TCArgs,
239 const char *LinkingOutput) const override;
240};
241
242} // end namespace amdgpu
243
Bernard Ogden31561762013-12-12 13:27:11 +0000244namespace arm {
Renato Goline17c5802015-07-27 23:44:42 +0000245std::string getARMTargetCPU(StringRef CPU, StringRef Arch,
Reid Klecknerbac59a12015-07-15 17:58:55 +0000246 const llvm::Triple &Triple);
Renato Goline17c5802015-07-27 23:44:42 +0000247const std::string getARMArch(StringRef Arch,
Reid Klecknerbac59a12015-07-15 17:58:55 +0000248 const llvm::Triple &Triple);
Chandler Carruthd96f37a2015-08-30 07:51:18 +0000249StringRef getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple);
Vladimir Sukharev64f68242015-09-23 09:29:32 +0000250StringRef getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
251 const llvm::Triple &Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +0000252
Reid Klecknerbac59a12015-07-15 17:58:55 +0000253void appendEBLinkFlags(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs,
254 const llvm::Triple &Triple);
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000255}
Tony Linthicum76329bf2011-12-12 21:14:55 +0000256
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000257namespace mips {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000258typedef enum { NanLegacy = 1, Nan2008 = 2 } NanEncoding;
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +0000259
260enum class FloatABI {
261 Invalid,
262 Soft,
263 Hard,
264};
265
Reid Klecknerbac59a12015-07-15 17:58:55 +0000266NanEncoding getSupportedNanEncoding(StringRef &CPU);
267void getMipsCPUAndABI(const llvm::opt::ArgList &Args,
268 const llvm::Triple &Triple, StringRef &CPUName,
269 StringRef &ABIName);
270bool hasMipsAbiArg(const llvm::opt::ArgList &Args, const char *Value);
271bool isUCLibc(const llvm::opt::ArgList &Args);
272bool isNaN2008(const llvm::opt::ArgList &Args, const llvm::Triple &Triple);
273bool isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +0000274 StringRef ABIName, mips::FloatABI FloatABI);
Reid Klecknerbac59a12015-07-15 17:58:55 +0000275bool shouldUseFPXX(const llvm::opt::ArgList &Args, const llvm::Triple &Triple,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +0000276 StringRef CPUName, StringRef ABIName,
277 mips::FloatABI FloatABI);
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000278}
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000279
Ulrich Weigand8afad612014-07-28 13:17:52 +0000280namespace ppc {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000281bool hasPPCAbiArg(const llvm::opt::ArgList &Args, const char *Value);
Ulrich Weigand8afad612014-07-28 13:17:52 +0000282}
283
Douglas Katzman95354292015-06-23 20:42:09 +0000284/// cloudabi -- Directly call GNU Binutils linker
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000285namespace cloudabi {
Douglas Katzman95354292015-06-23 20:42:09 +0000286class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000287public:
Douglas Katzman95354292015-06-23 20:42:09 +0000288 Linker(const ToolChain &TC) : GnuTool("cloudabi::Linker", "linker", TC) {}
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000289
290 bool hasIntegratedCPP() const override { return false; }
291 bool isLinkJob() const override { return true; }
292
293 void ConstructJob(Compilation &C, const JobAction &JA,
294 const InputInfo &Output, const InputInfoList &Inputs,
295 const llvm::opt::ArgList &TCArgs,
296 const char *LinkingOutput) const override;
297};
298} // end namespace cloudabi
299
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000300namespace darwin {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000301llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
302void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
Rafael Espindoladcbf6982012-10-31 18:51:07 +0000303
Reid Klecknerbac59a12015-07-15 17:58:55 +0000304class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
305 virtual void anchor();
Daniel Dunbare9ded432009-09-09 18:36:20 +0000306
Reid Klecknerbac59a12015-07-15 17:58:55 +0000307protected:
308 void AddMachOArch(const llvm::opt::ArgList &Args,
309 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbare9ded432009-09-09 18:36:20 +0000310
Reid Klecknerbac59a12015-07-15 17:58:55 +0000311 const toolchains::MachO &getMachOToolChain() const {
312 return reinterpret_cast<const toolchains::MachO &>(getToolChain());
313 }
Daniel Dunbare9ded432009-09-09 18:36:20 +0000314
Reid Klecknerbac59a12015-07-15 17:58:55 +0000315public:
316 MachOTool(
317 const char *Name, const char *ShortName, const ToolChain &TC,
318 ResponseFileSupport ResponseSupport = RF_None,
319 llvm::sys::WindowsEncodingMethod ResponseEncoding = llvm::sys::WEM_UTF8,
320 const char *ResponseFlag = "@")
321 : Tool(Name, ShortName, TC, ResponseSupport, ResponseEncoding,
322 ResponseFlag) {}
323};
Daniel Dunbarbe220842009-03-20 16:06:39 +0000324
Reid Klecknerbac59a12015-07-15 17:58:55 +0000325class LLVM_LIBRARY_VISIBILITY Assembler : public MachOTool {
326public:
327 Assembler(const ToolChain &TC)
328 : MachOTool("darwin::Assembler", "assembler", TC) {}
Daniel Dunbarbe220842009-03-20 16:06:39 +0000329
Reid Klecknerbac59a12015-07-15 17:58:55 +0000330 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarbe220842009-03-20 16:06:39 +0000331
Reid Klecknerbac59a12015-07-15 17:58:55 +0000332 void ConstructJob(Compilation &C, const JobAction &JA,
333 const InputInfo &Output, const InputInfoList &Inputs,
334 const llvm::opt::ArgList &TCArgs,
335 const char *LinkingOutput) const override;
336};
Daniel Dunbarc1964212009-03-26 16:23:12 +0000337
Reid Klecknerbac59a12015-07-15 17:58:55 +0000338class LLVM_LIBRARY_VISIBILITY Linker : public MachOTool {
339 bool NeedsTempPath(const InputInfoList &Inputs) const;
340 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
341 llvm::opt::ArgStringList &CmdArgs,
342 const InputInfoList &Inputs) const;
Daniel Dunbarc1964212009-03-26 16:23:12 +0000343
Reid Klecknerbac59a12015-07-15 17:58:55 +0000344public:
345 Linker(const ToolChain &TC)
346 : MachOTool("darwin::Linker", "linker", TC, RF_FileList,
347 llvm::sys::WEM_UTF8, "-filelist") {}
Daniel Dunbarc1964212009-03-26 16:23:12 +0000348
Reid Klecknerbac59a12015-07-15 17:58:55 +0000349 bool hasIntegratedCPP() const override { return false; }
350 bool isLinkJob() const override { return true; }
Daniel Dunbarc1964212009-03-26 16:23:12 +0000351
Reid Klecknerbac59a12015-07-15 17:58:55 +0000352 void ConstructJob(Compilation &C, const JobAction &JA,
353 const InputInfo &Output, const InputInfoList &Inputs,
354 const llvm::opt::ArgList &TCArgs,
355 const char *LinkingOutput) const override;
356};
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000357
Reid Klecknerbac59a12015-07-15 17:58:55 +0000358class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool {
359public:
360 Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000361
Reid Klecknerbac59a12015-07-15 17:58:55 +0000362 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar88299622010-06-04 18:28:36 +0000363
Reid Klecknerbac59a12015-07-15 17:58:55 +0000364 void ConstructJob(Compilation &C, const JobAction &JA,
365 const InputInfo &Output, const InputInfoList &Inputs,
366 const llvm::opt::ArgList &TCArgs,
367 const char *LinkingOutput) const override;
368};
Daniel Dunbar88299622010-06-04 18:28:36 +0000369
Reid Klecknerbac59a12015-07-15 17:58:55 +0000370class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool {
371public:
372 Dsymutil(const ToolChain &TC)
373 : MachOTool("darwin::Dsymutil", "dsymutil", TC) {}
Daniel Dunbar88299622010-06-04 18:28:36 +0000374
Reid Klecknerbac59a12015-07-15 17:58:55 +0000375 bool hasIntegratedCPP() const override { return false; }
376 bool isDsymutilJob() const override { return true; }
Eric Christopher551ef452011-08-23 17:56:55 +0000377
Reid Klecknerbac59a12015-07-15 17:58:55 +0000378 void ConstructJob(Compilation &C, const JobAction &JA,
379 const InputInfo &Output, const InputInfoList &Inputs,
380 const llvm::opt::ArgList &TCArgs,
381 const char *LinkingOutput) const override;
382};
Eric Christopher551ef452011-08-23 17:56:55 +0000383
Reid Klecknerbac59a12015-07-15 17:58:55 +0000384class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool {
385public:
386 VerifyDebug(const ToolChain &TC)
387 : MachOTool("darwin::VerifyDebug", "dwarfdump", TC) {}
Eric Christopher551ef452011-08-23 17:56:55 +0000388
Reid Klecknerbac59a12015-07-15 17:58:55 +0000389 bool hasIntegratedCPP() const override { return false; }
Eric Christopher551ef452011-08-23 17:56:55 +0000390
Reid Klecknerbac59a12015-07-15 17:58:55 +0000391 void ConstructJob(Compilation &C, const JobAction &JA,
392 const InputInfo &Output, const InputInfoList &Inputs,
393 const llvm::opt::ArgList &TCArgs,
394 const char *LinkingOutput) const override;
395};
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000396}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000397
Douglas Katzman95354292015-06-23 20:42:09 +0000398/// openbsd -- Directly call GNU Binutils assembler and linker
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000399namespace openbsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000400class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
401public:
402 Assembler(const ToolChain &TC)
403 : GnuTool("openbsd::Assembler", "assembler", TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000404
Douglas Katzman95354292015-06-23 20:42:09 +0000405 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000406
Douglas Katzman95354292015-06-23 20:42:09 +0000407 void ConstructJob(Compilation &C, const JobAction &JA,
408 const InputInfo &Output, const InputInfoList &Inputs,
409 const llvm::opt::ArgList &TCArgs,
410 const char *LinkingOutput) const override;
411};
412class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
413public:
414 Linker(const ToolChain &TC) : GnuTool("openbsd::Linker", "linker", TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000415
Douglas Katzman95354292015-06-23 20:42:09 +0000416 bool hasIntegratedCPP() const override { return false; }
417 bool isLinkJob() const override { return true; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000418
Reid Klecknerbac59a12015-07-15 17:58:55 +0000419 void ConstructJob(Compilation &C, const JobAction &JA,
420 const InputInfo &Output, const InputInfoList &Inputs,
421 const llvm::opt::ArgList &TCArgs,
422 const char *LinkingOutput) const override;
423};
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000424} // end namespace openbsd
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000425
Douglas Katzman95354292015-06-23 20:42:09 +0000426/// bitrig -- Directly call GNU Binutils assembler and linker
Eli Friedman9fa28852012-08-08 23:57:20 +0000427namespace bitrig {
Douglas Katzman95354292015-06-23 20:42:09 +0000428class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
429public:
430 Assembler(const ToolChain &TC)
431 : GnuTool("bitrig::Assembler", "assembler", TC) {}
Eli Friedman9fa28852012-08-08 23:57:20 +0000432
Douglas Katzman95354292015-06-23 20:42:09 +0000433 bool hasIntegratedCPP() const override { return false; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000434
Douglas Katzman95354292015-06-23 20:42:09 +0000435 void ConstructJob(Compilation &C, const JobAction &JA,
436 const InputInfo &Output, const InputInfoList &Inputs,
437 const llvm::opt::ArgList &TCArgs,
438 const char *LinkingOutput) const override;
439};
440class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
441public:
442 Linker(const ToolChain &TC) : GnuTool("bitrig::Linker", "linker", TC) {}
Eli Friedman9fa28852012-08-08 23:57:20 +0000443
Douglas Katzman95354292015-06-23 20:42:09 +0000444 bool hasIntegratedCPP() const override { return false; }
445 bool isLinkJob() const override { return true; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000446
Reid Klecknerbac59a12015-07-15 17:58:55 +0000447 void ConstructJob(Compilation &C, const JobAction &JA,
448 const InputInfo &Output, const InputInfoList &Inputs,
449 const llvm::opt::ArgList &TCArgs,
450 const char *LinkingOutput) const override;
451};
Eli Friedman9fa28852012-08-08 23:57:20 +0000452} // end namespace bitrig
453
Douglas Katzman95354292015-06-23 20:42:09 +0000454/// freebsd -- Directly call GNU Binutils assembler and linker
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000455namespace freebsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000456class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
457public:
458 Assembler(const ToolChain &TC)
459 : GnuTool("freebsd::Assembler", "assembler", TC) {}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000460
Douglas Katzman95354292015-06-23 20:42:09 +0000461 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000462
Douglas Katzman95354292015-06-23 20:42:09 +0000463 void ConstructJob(Compilation &C, const JobAction &JA,
464 const InputInfo &Output, const InputInfoList &Inputs,
465 const llvm::opt::ArgList &TCArgs,
466 const char *LinkingOutput) const override;
467};
468class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
469public:
470 Linker(const ToolChain &TC) : GnuTool("freebsd::Linker", "linker", TC) {}
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000471
Douglas Katzman95354292015-06-23 20:42:09 +0000472 bool hasIntegratedCPP() const override { return false; }
473 bool isLinkJob() const override { return true; }
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000474
Reid Klecknerbac59a12015-07-15 17:58:55 +0000475 void ConstructJob(Compilation &C, const JobAction &JA,
476 const InputInfo &Output, const InputInfoList &Inputs,
477 const llvm::opt::ArgList &TCArgs,
478 const char *LinkingOutput) const override;
479};
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000480} // end namespace freebsd
481
Douglas Katzman95354292015-06-23 20:42:09 +0000482/// netbsd -- Directly call GNU Binutils assembler and linker
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000483namespace netbsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000484class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
Joerg Sonnenberger637603a2011-05-16 13:35:02 +0000485
Douglas Katzman95354292015-06-23 20:42:09 +0000486public:
487 Assembler(const ToolChain &TC)
488 : GnuTool("netbsd::Assembler", "assembler", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000489
Douglas Katzman95354292015-06-23 20:42:09 +0000490 bool hasIntegratedCPP() const override { return false; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000491
Douglas Katzman95354292015-06-23 20:42:09 +0000492 void ConstructJob(Compilation &C, const JobAction &JA,
493 const InputInfo &Output, const InputInfoList &Inputs,
494 const llvm::opt::ArgList &TCArgs,
495 const char *LinkingOutput) const override;
496};
497class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
Joerg Sonnenberger637603a2011-05-16 13:35:02 +0000498
Douglas Katzman95354292015-06-23 20:42:09 +0000499public:
500 Linker(const ToolChain &TC) : GnuTool("netbsd::Linker", "linker", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000501
Douglas Katzman95354292015-06-23 20:42:09 +0000502 bool hasIntegratedCPP() const override { return false; }
503 bool isLinkJob() const override { return true; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000504
Reid Klecknerbac59a12015-07-15 17:58:55 +0000505 void ConstructJob(Compilation &C, const JobAction &JA,
506 const InputInfo &Output, const InputInfoList &Inputs,
507 const llvm::opt::ArgList &TCArgs,
508 const char *LinkingOutput) const override;
509};
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000510} // end namespace netbsd
511
Douglas Katzman95354292015-06-23 20:42:09 +0000512/// Directly call GNU Binutils' assembler and linker.
Thomas Schwinge4e555262013-03-28 19:04:25 +0000513namespace gnutools {
Douglas Katzman95354292015-06-23 20:42:09 +0000514class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
515public:
516 Assembler(const ToolChain &TC) : GnuTool("GNU::Assembler", "assembler", TC) {}
Rafael Espindola92b00932010-08-10 00:25:48 +0000517
Douglas Katzman95354292015-06-23 20:42:09 +0000518 bool hasIntegratedCPP() const override { return false; }
519
520 void ConstructJob(Compilation &C, const JobAction &JA,
521 const InputInfo &Output, const InputInfoList &Inputs,
522 const llvm::opt::ArgList &TCArgs,
523 const char *LinkingOutput) const override;
524};
525class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
526public:
527 Linker(const ToolChain &TC) : GnuTool("GNU::Linker", "linker", TC) {}
528
529 bool hasIntegratedCPP() const override { return false; }
530 bool isLinkJob() const override { return true; }
Rafael Espindola92b00932010-08-10 00:25:48 +0000531
Reid Klecknerbac59a12015-07-15 17:58:55 +0000532 void ConstructJob(Compilation &C, const JobAction &JA,
533 const InputInfo &Output, const InputInfoList &Inputs,
534 const llvm::opt::ArgList &TCArgs,
535 const char *LinkingOutput) const override;
536};
537}
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000538
Reid Klecknerbac59a12015-07-15 17:58:55 +0000539namespace nacltools {
540class LLVM_LIBRARY_VISIBILITY AssemblerARM : public gnutools::Assembler {
541public:
542 AssemblerARM(const ToolChain &TC) : gnutools::Assembler(TC) {}
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000543
Reid Klecknerbac59a12015-07-15 17:58:55 +0000544 void ConstructJob(Compilation &C, const JobAction &JA,
545 const InputInfo &Output, const InputInfoList &Inputs,
546 const llvm::opt::ArgList &TCArgs,
547 const char *LinkingOutput) const override;
548};
549class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
550public:
551 Linker(const ToolChain &TC) : Tool("NaCl::Linker", "linker", TC) {}
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000552
Reid Klecknerbac59a12015-07-15 17:58:55 +0000553 bool hasIntegratedCPP() const override { return false; }
554 bool isLinkJob() const override { return true; }
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000555
Reid Klecknerbac59a12015-07-15 17:58:55 +0000556 void ConstructJob(Compilation &C, const JobAction &JA,
557 const InputInfo &Output, const InputInfoList &Inputs,
558 const llvm::opt::ArgList &TCArgs,
559 const char *LinkingOutput) const override;
560};
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000561}
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000562
Douglas Katzman95354292015-06-23 20:42:09 +0000563/// minix -- Directly call GNU Binutils assembler and linker
Chris Lattner3e2ee142010-07-07 16:01:42 +0000564namespace minix {
Douglas Katzman95354292015-06-23 20:42:09 +0000565class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
566public:
567 Assembler(const ToolChain &TC)
568 : GnuTool("minix::Assembler", "assembler", TC) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000569
Douglas Katzman95354292015-06-23 20:42:09 +0000570 bool hasIntegratedCPP() const override { return false; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000571
Douglas Katzman95354292015-06-23 20:42:09 +0000572 void ConstructJob(Compilation &C, const JobAction &JA,
573 const InputInfo &Output, const InputInfoList &Inputs,
574 const llvm::opt::ArgList &TCArgs,
575 const char *LinkingOutput) const override;
576};
577class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
578public:
579 Linker(const ToolChain &TC) : GnuTool("minix::Linker", "linker", TC) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000580
Douglas Katzman95354292015-06-23 20:42:09 +0000581 bool hasIntegratedCPP() const override { return false; }
582 bool isLinkJob() const override { return true; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000583
Reid Klecknerbac59a12015-07-15 17:58:55 +0000584 void ConstructJob(Compilation &C, const JobAction &JA,
585 const InputInfo &Output, const InputInfoList &Inputs,
586 const llvm::opt::ArgList &TCArgs,
587 const char *LinkingOutput) const override;
588};
Chris Lattner3e2ee142010-07-07 16:01:42 +0000589} // end namespace minix
590
Douglas Katzman95354292015-06-23 20:42:09 +0000591/// solaris -- Directly call Solaris assembler and linker
David Chisnallf571cde2012-02-15 13:39:01 +0000592namespace solaris {
Douglas Katzman95354292015-06-23 20:42:09 +0000593class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
594public:
595 Assembler(const ToolChain &TC)
596 : Tool("solaris::Assembler", "assembler", TC) {}
David Chisnallf571cde2012-02-15 13:39:01 +0000597
Douglas Katzman95354292015-06-23 20:42:09 +0000598 bool hasIntegratedCPP() const override { return false; }
David Chisnallf571cde2012-02-15 13:39:01 +0000599
Douglas Katzman95354292015-06-23 20:42:09 +0000600 void ConstructJob(Compilation &C, const JobAction &JA,
601 const InputInfo &Output, const InputInfoList &Inputs,
602 const llvm::opt::ArgList &TCArgs,
603 const char *LinkingOutput) const override;
604};
605class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
606public:
607 Linker(const ToolChain &TC) : Tool("solaris::Linker", "linker", TC) {}
David Chisnallf571cde2012-02-15 13:39:01 +0000608
Douglas Katzman95354292015-06-23 20:42:09 +0000609 bool hasIntegratedCPP() const override { return false; }
610 bool isLinkJob() const override { return true; }
David Chisnallf571cde2012-02-15 13:39:01 +0000611
Reid Klecknerbac59a12015-07-15 17:58:55 +0000612 void ConstructJob(Compilation &C, const JobAction &JA,
613 const InputInfo &Output, const InputInfoList &Inputs,
614 const llvm::opt::ArgList &TCArgs,
615 const char *LinkingOutput) const override;
616};
David Chisnalla9ed5d72012-02-15 16:25:46 +0000617} // end namespace solaris
David Chisnallf571cde2012-02-15 13:39:01 +0000618
Douglas Katzman95354292015-06-23 20:42:09 +0000619/// dragonfly -- Directly call GNU Binutils assembler and linker
Daniel Dunbarcc912342009-05-02 18:28:39 +0000620namespace dragonfly {
Douglas Katzman95354292015-06-23 20:42:09 +0000621class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
622public:
623 Assembler(const ToolChain &TC)
624 : GnuTool("dragonfly::Assembler", "assembler", TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000625
Douglas Katzman95354292015-06-23 20:42:09 +0000626 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000627
Douglas Katzman95354292015-06-23 20:42:09 +0000628 void ConstructJob(Compilation &C, const JobAction &JA,
629 const InputInfo &Output, const InputInfoList &Inputs,
630 const llvm::opt::ArgList &TCArgs,
631 const char *LinkingOutput) const override;
632};
633class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
634public:
635 Linker(const ToolChain &TC) : GnuTool("dragonfly::Linker", "linker", TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000636
Douglas Katzman95354292015-06-23 20:42:09 +0000637 bool hasIntegratedCPP() const override { return false; }
638 bool isLinkJob() const override { return true; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000639
Reid Klecknerbac59a12015-07-15 17:58:55 +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};
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000645} // end namespace dragonfly
Daniel Dunbarcc912342009-05-02 18:28:39 +0000646
Hans Wennborg1da044a2014-06-26 19:59:02 +0000647/// Visual studio tools.
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000648namespace visualstudio {
Douglas Katzman95354292015-06-23 20:42:09 +0000649VersionTuple getMSVCVersion(const Driver *D, const llvm::Triple &Triple,
650 const llvm::opt::ArgList &Args, bool IsWindowsMSVC);
David Majnemere11d3732015-06-08 00:22:46 +0000651
Douglas Katzman95354292015-06-23 20:42:09 +0000652class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
653public:
654 Linker(const ToolChain &TC)
655 : Tool("visualstudio::Linker", "linker", TC, RF_Full,
656 llvm::sys::WEM_UTF16) {}
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000657
Douglas Katzman95354292015-06-23 20:42:09 +0000658 bool hasIntegratedCPP() const override { return false; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000659 bool isLinkJob() const override { return true; }
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000660
Reid Klecknerbac59a12015-07-15 17:58:55 +0000661 void ConstructJob(Compilation &C, const JobAction &JA,
662 const InputInfo &Output, const InputInfoList &Inputs,
663 const llvm::opt::ArgList &TCArgs,
664 const char *LinkingOutput) const override;
Douglas Katzman95354292015-06-23 20:42:09 +0000665};
Hans Wennborg87cfa712013-09-19 20:32:16 +0000666
Douglas Katzman95354292015-06-23 20:42:09 +0000667class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
668public:
669 Compiler(const ToolChain &TC)
670 : Tool("visualstudio::Compiler", "compiler", TC, RF_Full,
671 llvm::sys::WEM_UTF16) {}
Hans Wennborg87cfa712013-09-19 20:32:16 +0000672
Douglas Katzman95354292015-06-23 20:42:09 +0000673 bool hasIntegratedAssembler() const override { return true; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000674 bool hasIntegratedCPP() const override { return true; }
675 bool isLinkJob() const override { return false; }
Hans Wennborg87cfa712013-09-19 20:32:16 +0000676
Reid Klecknerbac59a12015-07-15 17:58:55 +0000677 void ConstructJob(Compilation &C, const JobAction &JA,
678 const InputInfo &Output, const InputInfoList &Inputs,
679 const llvm::opt::ArgList &TCArgs,
680 const char *LinkingOutput) const override;
Hans Wennborg87cfa712013-09-19 20:32:16 +0000681
Reid Klecknerbac59a12015-07-15 17:58:55 +0000682 std::unique_ptr<Command> GetCommand(Compilation &C, const JobAction &JA,
683 const InputInfo &Output,
684 const InputInfoList &Inputs,
685 const llvm::opt::ArgList &TCArgs,
686 const char *LinkingOutput) const;
687};
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000688} // end namespace visualstudio
689
Yaron Keren1c0070c2015-07-02 04:45:27 +0000690/// MinGW -- Directly call GNU Binutils assembler and linker
691namespace MinGW {
692class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
693public:
694 Assembler(const ToolChain &TC) : Tool("MinGW::Assemble", "assembler", TC) {}
695
696 bool hasIntegratedCPP() const override { return false; }
697
698 void ConstructJob(Compilation &C, const JobAction &JA,
699 const InputInfo &Output, const InputInfoList &Inputs,
700 const llvm::opt::ArgList &TCArgs,
701 const char *LinkingOutput) const override;
702};
703
704class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
705public:
706 Linker(const ToolChain &TC) : Tool("MinGW::Linker", "linker", TC) {}
707
708 bool hasIntegratedCPP() const override { return false; }
709 bool isLinkJob() const override { return true; }
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
716private:
717 void AddLibGCC(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs) const;
718};
719} // end namespace MinGW
720
Tim Northover9c7e0352013-12-12 11:55:52 +0000721namespace arm {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000722enum class FloatABI {
723 Invalid,
724 Soft,
725 SoftFP,
726 Hard,
727};
728
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000729FloatABI getARMFloatABI(const ToolChain &TC, const llvm::opt::ArgList &Args);
Tim Northover9c7e0352013-12-12 11:55:52 +0000730}
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000731namespace XCore {
Douglas Katzman95354292015-06-23 20:42:09 +0000732// For XCore, we do not need to instantiate tools for PreProcess, PreCompile and
733// Compile.
734// We simply use "clang -cc1" for those actions.
735class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000736public:
Douglas Katzman95354292015-06-23 20:42:09 +0000737 Assembler(const ToolChain &TC) : Tool("XCore::Assembler", "XCore-as", TC) {}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000738
739 bool hasIntegratedCPP() const override { return false; }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000740 void ConstructJob(Compilation &C, const JobAction &JA,
741 const InputInfo &Output, const InputInfoList &Inputs,
742 const llvm::opt::ArgList &TCArgs,
743 const char *LinkingOutput) const override;
744};
745
Douglas Katzman95354292015-06-23 20:42:09 +0000746class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000747public:
Douglas Katzman95354292015-06-23 20:42:09 +0000748 Linker(const ToolChain &TC) : Tool("XCore::Linker", "XCore-ld", TC) {}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000749
750 bool hasIntegratedCPP() const override { return false; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000751 bool isLinkJob() const override { return true; }
752 void ConstructJob(Compilation &C, const JobAction &JA,
753 const InputInfo &Output, const InputInfoList &Inputs,
754 const llvm::opt::ArgList &TCArgs,
755 const char *LinkingOutput) const override;
756};
757} // end namespace XCore.
Douglas Katzman95354292015-06-23 20:42:09 +0000758
Reid Klecknerbac59a12015-07-15 17:58:55 +0000759namespace CrossWindows {
760class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
761public:
762 Assembler(const ToolChain &TC) : Tool("CrossWindows::Assembler", "as", TC) {}
Douglas Katzman95354292015-06-23 20:42:09 +0000763
Reid Klecknerbac59a12015-07-15 17:58:55 +0000764 bool hasIntegratedCPP() const override { return false; }
Douglas Katzman95354292015-06-23 20:42:09 +0000765
Reid Klecknerbac59a12015-07-15 17:58:55 +0000766 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};
Douglas Katzman95354292015-06-23 20:42:09 +0000771
Reid Klecknerbac59a12015-07-15 17:58:55 +0000772class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
773public:
774 Linker(const ToolChain &TC)
775 : Tool("CrossWindows::Linker", "ld", TC, RF_Full) {}
Douglas Katzman95354292015-06-23 20:42:09 +0000776
Reid Klecknerbac59a12015-07-15 17:58:55 +0000777 bool hasIntegratedCPP() const override { return false; }
778 bool isLinkJob() const override { return true; }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000779
780 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};
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000785}
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000786
Douglas Katzman84a75642015-06-19 14:55:19 +0000787/// SHAVE tools -- Directly call moviCompile and moviAsm
788namespace SHAVE {
Douglas Katzman95354292015-06-23 20:42:09 +0000789class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
Douglas Katzman84a75642015-06-19 14:55:19 +0000790public:
Douglas Katzman95354292015-06-23 20:42:09 +0000791 Compiler(const ToolChain &TC) : Tool("moviCompile", "movicompile", TC) {}
Douglas Katzman84a75642015-06-19 14:55:19 +0000792
793 bool hasIntegratedCPP() const override { return true; }
794
795 void ConstructJob(Compilation &C, const JobAction &JA,
796 const InputInfo &Output, const InputInfoList &Inputs,
797 const llvm::opt::ArgList &TCArgs,
798 const char *LinkingOutput) const override;
799};
800
Douglas Katzman95354292015-06-23 20:42:09 +0000801class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
Douglas Katzman84a75642015-06-19 14:55:19 +0000802public:
Douglas Katzman95354292015-06-23 20:42:09 +0000803 Assembler(const ToolChain &TC) : Tool("moviAsm", "moviAsm", TC) {}
Douglas Katzman84a75642015-06-19 14:55:19 +0000804
805 bool hasIntegratedCPP() const override { return false; } // not sure.
806
807 void ConstructJob(Compilation &C, const JobAction &JA,
808 const InputInfo &Output, const InputInfoList &Inputs,
809 const llvm::opt::ArgList &TCArgs,
810 const char *LinkingOutput) const override;
811};
812} // end namespace SHAVE
813
Douglas Katzmand6e597c2015-09-17 19:56:40 +0000814/// The Myriad toolchain uses tools that are in two different namespaces.
815/// The Compiler and Assembler as defined above are in the SHAVE namespace,
816/// whereas the linker, which accepts code for a mixture of Sparc and SHAVE,
817/// is in the Myriad namespace.
818namespace Myriad {
819class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
820public:
821 Linker(const ToolChain &TC) : GnuTool("shave::Linker", "ld", TC) {}
822 bool hasIntegratedCPP() const override { return false; }
823 bool isLinkJob() const override { return true; }
824 void ConstructJob(Compilation &C, const JobAction &JA,
825 const InputInfo &Output, const InputInfoList &Inputs,
826 const llvm::opt::ArgList &TCArgs,
827 const char *LinkingOutput) const override;
828};
829} // end namespace Myriad
830
Douglas Katzman9dc5fbb2015-06-03 16:56:50 +0000831} // end namespace tools
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000832} // end namespace driver
833} // end namespace clang
834
Benjamin Kramer2f5db8b2014-08-13 16:25:19 +0000835#endif