blob: b1d5d69eb16bfa05f2c7d1d55269a6f724331815 [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
Peter Collingbourne581f4382015-07-02 01:48:12 +000040SmallString<128> getCompilerRT(const ToolChain &TC, StringRef Component,
41 bool Shared = false);
42
Reid Klecknerbac59a12015-07-15 17:58:55 +000043/// \brief Clang compiler tool.
44class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
45public:
46 static const char *getBaseInputName(const llvm::opt::ArgList &Args,
47 const InputInfo &Input);
48 static const char *getBaseInputStem(const llvm::opt::ArgList &Args,
49 const InputInfoList &Inputs);
50 static const char *getDependencyFileName(const llvm::opt::ArgList &Args,
51 const InputInfoList &Inputs);
Bob Wilsondecc03e2012-11-23 06:14:39 +000052
Reid Klecknerbac59a12015-07-15 17:58:55 +000053private:
54 void AddPreprocessingOptions(Compilation &C, const JobAction &JA,
55 const Driver &D, const llvm::opt::ArgList &Args,
56 llvm::opt::ArgStringList &CmdArgs,
57 const InputInfo &Output,
58 const InputInfoList &Inputs) const;
Daniel Dunbard067f7f2009-04-08 23:54:23 +000059
Reid Klecknerbac59a12015-07-15 17:58:55 +000060 void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
Tim Northovera2ee4332014-03-29 15:09:45 +000061 llvm::opt::ArgStringList &CmdArgs) const;
Reid Klecknerbac59a12015-07-15 17:58:55 +000062 void AddARMTargetArgs(const llvm::opt::ArgList &Args,
63 llvm::opt::ArgStringList &CmdArgs,
64 bool KernelOrKext) const;
65 void AddARM64TargetArgs(const llvm::opt::ArgList &Args,
Ulrich Weigand8afad612014-07-28 13:17:52 +000066 llvm::opt::ArgStringList &CmdArgs) const;
Reid Klecknerbac59a12015-07-15 17:58:55 +000067 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
68 llvm::opt::ArgStringList &CmdArgs) const;
69 void AddPPCTargetArgs(const llvm::opt::ArgList &Args,
Hans Wennborg75958c42013-08-08 00:17:41 +000070 llvm::opt::ArgStringList &CmdArgs) const;
Reid Klecknerbac59a12015-07-15 17:58:55 +000071 void AddR600TargetArgs(const llvm::opt::ArgList &Args,
72 llvm::opt::ArgStringList &CmdArgs) const;
73 void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
74 llvm::opt::ArgStringList &CmdArgs) const;
75 void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
76 llvm::opt::ArgStringList &CmdArgs) const;
77 void AddX86TargetArgs(const llvm::opt::ArgList &Args,
78 llvm::opt::ArgStringList &CmdArgs) const;
79 void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
80 llvm::opt::ArgStringList &CmdArgs) const;
Hans Wennborg75958c42013-08-08 00:17:41 +000081
Reid Klecknerbac59a12015-07-15 17:58:55 +000082 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
Hans Wennborg1da044a2014-06-26 19:59:02 +000083
Reid Klecknerbac59a12015-07-15 17:58:55 +000084 ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
85 llvm::opt::ArgStringList &cmdArgs,
86 RewriteKind rewrite) const;
Hans Wennborg1da044a2014-06-26 19:59:02 +000087
Reid Klecknerbac59a12015-07-15 17:58:55 +000088 void AddClangCLArgs(const llvm::opt::ArgList &Args,
89 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000090
Reid Klecknerbac59a12015-07-15 17:58:55 +000091 visualstudio::Compiler *getCLFallback() const;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000092
Reid Klecknerbac59a12015-07-15 17:58:55 +000093 mutable std::unique_ptr<visualstudio::Compiler> CLFallback;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000094
Reid Klecknerbac59a12015-07-15 17:58:55 +000095public:
96 // CAUTION! The first constructor argument ("clang") is not arbitrary,
97 // as it is for other tools. Some operations on a Tool actually test
98 // whether that tool is Clang based on the Tool's Name as a string.
99 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC, RF_Full) {}
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000100
Reid Klecknerbac59a12015-07-15 17:58:55 +0000101 bool hasGoodDiagnostics() const override { return true; }
102 bool hasIntegratedAssembler() const override { return true; }
103 bool hasIntegratedCPP() const override { return true; }
104 bool canEmitIR() const override { return true; }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000105
Reid Klecknerbac59a12015-07-15 17:58:55 +0000106 void ConstructJob(Compilation &C, const JobAction &JA,
107 const InputInfo &Output, const InputInfoList &Inputs,
108 const llvm::opt::ArgList &TCArgs,
109 const char *LinkingOutput) const override;
110};
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000111
Reid Klecknerbac59a12015-07-15 17:58:55 +0000112/// \brief Clang integrated assembler tool.
113class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
114public:
115 ClangAs(const ToolChain &TC)
116 : Tool("clang::as", "clang integrated assembler", TC, RF_Full) {}
117 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
118 llvm::opt::ArgStringList &CmdArgs) const;
119 bool hasGoodDiagnostics() const override { return true; }
120 bool hasIntegratedAssembler() const override { return false; }
121 bool hasIntegratedCPP() const override { return false; }
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000122
Reid Klecknerbac59a12015-07-15 17:58:55 +0000123 void ConstructJob(Compilation &C, const JobAction &JA,
124 const InputInfo &Output, const InputInfoList &Inputs,
125 const llvm::opt::ArgList &TCArgs,
126 const char *LinkingOutput) const override;
127};
128
129/// \brief Base class for all GNU tools that provide the same behavior when
130/// it comes to response files support
131class LLVM_LIBRARY_VISIBILITY GnuTool : public Tool {
132 virtual void anchor();
133
134public:
135 GnuTool(const char *Name, const char *ShortName, const ToolChain &TC)
136 : Tool(Name, ShortName, TC, RF_Full, llvm::sys::WEM_CurrentCodePage) {}
137};
138
139/// gcc - Generic GCC tool implementations.
Daniel Dunbar82116f82009-03-17 22:45:24 +0000140namespace gcc {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000141class LLVM_LIBRARY_VISIBILITY Common : public GnuTool {
142public:
143 Common(const char *Name, const char *ShortName, const ToolChain &TC)
144 : GnuTool(Name, ShortName, TC) {}
Daniel Dunbara3246a02009-03-18 08:07:30 +0000145
Reid Klecknerbac59a12015-07-15 17:58:55 +0000146 void ConstructJob(Compilation &C, const JobAction &JA,
147 const InputInfo &Output, const InputInfoList &Inputs,
148 const llvm::opt::ArgList &TCArgs,
149 const char *LinkingOutput) const override;
Daniel Dunbara3246a02009-03-18 08:07:30 +0000150
Reid Klecknerbac59a12015-07-15 17:58:55 +0000151 /// RenderExtraToolArgs - Render any arguments necessary to force
152 /// the particular tool mode.
153 virtual void RenderExtraToolArgs(const JobAction &JA,
154 llvm::opt::ArgStringList &CmdArgs) const = 0;
155};
Daniel Dunbara3246a02009-03-18 08:07:30 +0000156
Reid Klecknerbac59a12015-07-15 17:58:55 +0000157class LLVM_LIBRARY_VISIBILITY Preprocessor : public Common {
158public:
159 Preprocessor(const ToolChain &TC)
160 : Common("gcc::Preprocessor", "gcc preprocessor", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000161
Reid Klecknerbac59a12015-07-15 17:58:55 +0000162 bool hasGoodDiagnostics() const override { return true; }
163 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000164
Reid Klecknerbac59a12015-07-15 17:58:55 +0000165 void RenderExtraToolArgs(const JobAction &JA,
166 llvm::opt::ArgStringList &CmdArgs) const override;
167};
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000168
Reid Klecknerbac59a12015-07-15 17:58:55 +0000169class LLVM_LIBRARY_VISIBILITY Compiler : public Common {
170public:
171 Compiler(const ToolChain &TC) : Common("gcc::Compiler", "gcc frontend", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000172
Reid Klecknerbac59a12015-07-15 17:58:55 +0000173 bool hasGoodDiagnostics() const override { return true; }
174 bool hasIntegratedCPP() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000175
Reid Klecknerbac59a12015-07-15 17:58:55 +0000176 void RenderExtraToolArgs(const JobAction &JA,
177 llvm::opt::ArgStringList &CmdArgs) const override;
178};
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000179
Reid Klecknerbac59a12015-07-15 17:58:55 +0000180class LLVM_LIBRARY_VISIBILITY Linker : public Common {
181public:
182 Linker(const ToolChain &TC) : Common("gcc::Linker", "linker (via gcc)", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000183
Reid Klecknerbac59a12015-07-15 17:58:55 +0000184 bool hasIntegratedCPP() const override { return false; }
185 bool isLinkJob() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000186
Reid Klecknerbac59a12015-07-15 17:58:55 +0000187 void RenderExtraToolArgs(const JobAction &JA,
188 llvm::opt::ArgStringList &CmdArgs) const override;
189};
Daniel Dunbar82116f82009-03-17 22:45:24 +0000190} // end namespace gcc
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000191
Tony Linthicum76329bf2011-12-12 21:14:55 +0000192namespace hexagon {
Douglas Katzman95354292015-06-23 20:42:09 +0000193// For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile
194// and Compile.
195// We simply use "clang -cc1" for those actions.
196class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
197public:
198 Assembler(const ToolChain &TC)
199 : GnuTool("hexagon::Assembler", "hexagon-as", TC) {}
Tony Linthicum76329bf2011-12-12 21:14:55 +0000200
Douglas Katzman95354292015-06-23 20:42:09 +0000201 bool hasIntegratedCPP() const override { return false; }
Tony Linthicum76329bf2011-12-12 21:14:55 +0000202
Reid Klecknerbac59a12015-07-15 17:58:55 +0000203 void RenderExtraToolArgs(const JobAction &JA,
204 llvm::opt::ArgStringList &CmdArgs) const;
205 void ConstructJob(Compilation &C, const JobAction &JA,
206 const InputInfo &Output, const InputInfoList &Inputs,
207 const llvm::opt::ArgList &TCArgs,
208 const char *LinkingOutput) const override;
Douglas Katzman95354292015-06-23 20:42:09 +0000209};
Tony Linthicum76329bf2011-12-12 21:14:55 +0000210
Douglas Katzman95354292015-06-23 20:42:09 +0000211class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
212public:
213 Linker(const ToolChain &TC) : GnuTool("hexagon::Linker", "hexagon-ld", TC) {}
Tony Linthicum76329bf2011-12-12 21:14:55 +0000214
Douglas Katzman95354292015-06-23 20:42:09 +0000215 bool hasIntegratedCPP() const override { return false; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000216 bool isLinkJob() const override { return true; }
Tony Linthicum76329bf2011-12-12 21:14:55 +0000217
Reid Klecknerbac59a12015-07-15 17:58:55 +0000218 virtual void RenderExtraToolArgs(const JobAction &JA,
219 llvm::opt::ArgStringList &CmdArgs) const;
220 void ConstructJob(Compilation &C, const JobAction &JA,
221 const InputInfo &Output, const InputInfoList &Inputs,
222 const llvm::opt::ArgList &TCArgs,
223 const char *LinkingOutput) const override;
224};
Tony Linthicum76329bf2011-12-12 21:14:55 +0000225} // end namespace hexagon.
226
Tom Stellard8fa33092015-07-18 01:49:05 +0000227namespace amdgpu {
228
229class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
230public:
231 Linker(const ToolChain &TC) : GnuTool("amdgpu::Linker", "lld", TC) {}
232 bool isLinkJob() const override { return true; }
233 bool hasIntegratedCPP() const override { return false; }
234 void ConstructJob(Compilation &C, const JobAction &JA,
235 const InputInfo &Output, const InputInfoList &Inputs,
236 const llvm::opt::ArgList &TCArgs,
237 const char *LinkingOutput) const override;
238};
239
240} // end namespace amdgpu
241
Bernard Ogden31561762013-12-12 13:27:11 +0000242namespace arm {
Renato Goline17c5802015-07-27 23:44:42 +0000243std::string getARMTargetCPU(StringRef CPU, StringRef Arch,
Reid Klecknerbac59a12015-07-15 17:58:55 +0000244 const llvm::Triple &Triple);
Renato Goline17c5802015-07-27 23:44:42 +0000245const std::string getARMArch(StringRef Arch,
Reid Klecknerbac59a12015-07-15 17:58:55 +0000246 const llvm::Triple &Triple);
Chandler Carruthd96f37a2015-08-30 07:51:18 +0000247StringRef getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple);
248StringRef getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +0000249
Reid Klecknerbac59a12015-07-15 17:58:55 +0000250void appendEBLinkFlags(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs,
251 const llvm::Triple &Triple);
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000252}
Tony Linthicum76329bf2011-12-12 21:14:55 +0000253
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000254namespace mips {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000255typedef enum { NanLegacy = 1, Nan2008 = 2 } NanEncoding;
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +0000256
257enum class FloatABI {
258 Invalid,
259 Soft,
260 Hard,
261};
262
Reid Klecknerbac59a12015-07-15 17:58:55 +0000263NanEncoding getSupportedNanEncoding(StringRef &CPU);
264void getMipsCPUAndABI(const llvm::opt::ArgList &Args,
265 const llvm::Triple &Triple, StringRef &CPUName,
266 StringRef &ABIName);
267bool hasMipsAbiArg(const llvm::opt::ArgList &Args, const char *Value);
268bool isUCLibc(const llvm::opt::ArgList &Args);
269bool isNaN2008(const llvm::opt::ArgList &Args, const llvm::Triple &Triple);
270bool isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +0000271 StringRef ABIName, mips::FloatABI FloatABI);
Reid Klecknerbac59a12015-07-15 17:58:55 +0000272bool shouldUseFPXX(const llvm::opt::ArgList &Args, const llvm::Triple &Triple,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +0000273 StringRef CPUName, StringRef ABIName,
274 mips::FloatABI FloatABI);
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000275}
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000276
Ulrich Weigand8afad612014-07-28 13:17:52 +0000277namespace ppc {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000278bool hasPPCAbiArg(const llvm::opt::ArgList &Args, const char *Value);
Ulrich Weigand8afad612014-07-28 13:17:52 +0000279}
280
Douglas Katzman95354292015-06-23 20:42:09 +0000281/// cloudabi -- Directly call GNU Binutils linker
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000282namespace cloudabi {
Douglas Katzman95354292015-06-23 20:42:09 +0000283class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000284public:
Douglas Katzman95354292015-06-23 20:42:09 +0000285 Linker(const ToolChain &TC) : GnuTool("cloudabi::Linker", "linker", TC) {}
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000286
287 bool hasIntegratedCPP() const override { return false; }
288 bool isLinkJob() const override { return true; }
289
290 void ConstructJob(Compilation &C, const JobAction &JA,
291 const InputInfo &Output, const InputInfoList &Inputs,
292 const llvm::opt::ArgList &TCArgs,
293 const char *LinkingOutput) const override;
294};
295} // end namespace cloudabi
296
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000297namespace darwin {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000298llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
299void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
Rafael Espindoladcbf6982012-10-31 18:51:07 +0000300
Reid Klecknerbac59a12015-07-15 17:58:55 +0000301class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
302 virtual void anchor();
Daniel Dunbare9ded432009-09-09 18:36:20 +0000303
Reid Klecknerbac59a12015-07-15 17:58:55 +0000304protected:
305 void AddMachOArch(const llvm::opt::ArgList &Args,
306 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbare9ded432009-09-09 18:36:20 +0000307
Reid Klecknerbac59a12015-07-15 17:58:55 +0000308 const toolchains::MachO &getMachOToolChain() const {
309 return reinterpret_cast<const toolchains::MachO &>(getToolChain());
310 }
Daniel Dunbare9ded432009-09-09 18:36:20 +0000311
Reid Klecknerbac59a12015-07-15 17:58:55 +0000312public:
313 MachOTool(
314 const char *Name, const char *ShortName, const ToolChain &TC,
315 ResponseFileSupport ResponseSupport = RF_None,
316 llvm::sys::WindowsEncodingMethod ResponseEncoding = llvm::sys::WEM_UTF8,
317 const char *ResponseFlag = "@")
318 : Tool(Name, ShortName, TC, ResponseSupport, ResponseEncoding,
319 ResponseFlag) {}
320};
Daniel Dunbarbe220842009-03-20 16:06:39 +0000321
Reid Klecknerbac59a12015-07-15 17:58:55 +0000322class LLVM_LIBRARY_VISIBILITY Assembler : public MachOTool {
323public:
324 Assembler(const ToolChain &TC)
325 : MachOTool("darwin::Assembler", "assembler", TC) {}
Daniel Dunbarbe220842009-03-20 16:06:39 +0000326
Reid Klecknerbac59a12015-07-15 17:58:55 +0000327 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarbe220842009-03-20 16:06:39 +0000328
Reid Klecknerbac59a12015-07-15 17:58:55 +0000329 void ConstructJob(Compilation &C, const JobAction &JA,
330 const InputInfo &Output, const InputInfoList &Inputs,
331 const llvm::opt::ArgList &TCArgs,
332 const char *LinkingOutput) const override;
333};
Daniel Dunbarc1964212009-03-26 16:23:12 +0000334
Reid Klecknerbac59a12015-07-15 17:58:55 +0000335class LLVM_LIBRARY_VISIBILITY Linker : public MachOTool {
336 bool NeedsTempPath(const InputInfoList &Inputs) const;
337 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
338 llvm::opt::ArgStringList &CmdArgs,
339 const InputInfoList &Inputs) const;
Daniel Dunbarc1964212009-03-26 16:23:12 +0000340
Reid Klecknerbac59a12015-07-15 17:58:55 +0000341public:
342 Linker(const ToolChain &TC)
343 : MachOTool("darwin::Linker", "linker", TC, RF_FileList,
344 llvm::sys::WEM_UTF8, "-filelist") {}
Daniel Dunbarc1964212009-03-26 16:23:12 +0000345
Reid Klecknerbac59a12015-07-15 17:58:55 +0000346 bool hasIntegratedCPP() const override { return false; }
347 bool isLinkJob() const override { return true; }
Daniel Dunbarc1964212009-03-26 16:23:12 +0000348
Reid Klecknerbac59a12015-07-15 17:58:55 +0000349 void ConstructJob(Compilation &C, const JobAction &JA,
350 const InputInfo &Output, const InputInfoList &Inputs,
351 const llvm::opt::ArgList &TCArgs,
352 const char *LinkingOutput) const override;
353};
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000354
Reid Klecknerbac59a12015-07-15 17:58:55 +0000355class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool {
356public:
357 Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000358
Reid Klecknerbac59a12015-07-15 17:58:55 +0000359 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar88299622010-06-04 18:28:36 +0000360
Reid Klecknerbac59a12015-07-15 17:58:55 +0000361 void ConstructJob(Compilation &C, const JobAction &JA,
362 const InputInfo &Output, const InputInfoList &Inputs,
363 const llvm::opt::ArgList &TCArgs,
364 const char *LinkingOutput) const override;
365};
Daniel Dunbar88299622010-06-04 18:28:36 +0000366
Reid Klecknerbac59a12015-07-15 17:58:55 +0000367class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool {
368public:
369 Dsymutil(const ToolChain &TC)
370 : MachOTool("darwin::Dsymutil", "dsymutil", TC) {}
Daniel Dunbar88299622010-06-04 18:28:36 +0000371
Reid Klecknerbac59a12015-07-15 17:58:55 +0000372 bool hasIntegratedCPP() const override { return false; }
373 bool isDsymutilJob() const override { return true; }
Eric Christopher551ef452011-08-23 17:56:55 +0000374
Reid Klecknerbac59a12015-07-15 17:58:55 +0000375 void ConstructJob(Compilation &C, const JobAction &JA,
376 const InputInfo &Output, const InputInfoList &Inputs,
377 const llvm::opt::ArgList &TCArgs,
378 const char *LinkingOutput) const override;
379};
Eric Christopher551ef452011-08-23 17:56:55 +0000380
Reid Klecknerbac59a12015-07-15 17:58:55 +0000381class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool {
382public:
383 VerifyDebug(const ToolChain &TC)
384 : MachOTool("darwin::VerifyDebug", "dwarfdump", TC) {}
Eric Christopher551ef452011-08-23 17:56:55 +0000385
Reid Klecknerbac59a12015-07-15 17:58:55 +0000386 bool hasIntegratedCPP() const override { return false; }
Eric Christopher551ef452011-08-23 17:56:55 +0000387
Reid Klecknerbac59a12015-07-15 17:58:55 +0000388 void ConstructJob(Compilation &C, const JobAction &JA,
389 const InputInfo &Output, const InputInfoList &Inputs,
390 const llvm::opt::ArgList &TCArgs,
391 const char *LinkingOutput) const override;
392};
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000393}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000394
Douglas Katzman95354292015-06-23 20:42:09 +0000395/// openbsd -- Directly call GNU Binutils assembler and linker
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000396namespace openbsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000397class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
398public:
399 Assembler(const ToolChain &TC)
400 : GnuTool("openbsd::Assembler", "assembler", TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000401
Douglas Katzman95354292015-06-23 20:42:09 +0000402 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000403
Douglas Katzman95354292015-06-23 20:42:09 +0000404 void ConstructJob(Compilation &C, const JobAction &JA,
405 const InputInfo &Output, const InputInfoList &Inputs,
406 const llvm::opt::ArgList &TCArgs,
407 const char *LinkingOutput) const override;
408};
409class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
410public:
411 Linker(const ToolChain &TC) : GnuTool("openbsd::Linker", "linker", TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000412
Douglas Katzman95354292015-06-23 20:42:09 +0000413 bool hasIntegratedCPP() const override { return false; }
414 bool isLinkJob() const override { return true; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000415
Reid Klecknerbac59a12015-07-15 17:58:55 +0000416 void ConstructJob(Compilation &C, const JobAction &JA,
417 const InputInfo &Output, const InputInfoList &Inputs,
418 const llvm::opt::ArgList &TCArgs,
419 const char *LinkingOutput) const override;
420};
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000421} // end namespace openbsd
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000422
Douglas Katzman95354292015-06-23 20:42:09 +0000423/// bitrig -- Directly call GNU Binutils assembler and linker
Eli Friedman9fa28852012-08-08 23:57:20 +0000424namespace bitrig {
Douglas Katzman95354292015-06-23 20:42:09 +0000425class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
426public:
427 Assembler(const ToolChain &TC)
428 : GnuTool("bitrig::Assembler", "assembler", TC) {}
Eli Friedman9fa28852012-08-08 23:57:20 +0000429
Douglas Katzman95354292015-06-23 20:42:09 +0000430 bool hasIntegratedCPP() const override { return false; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000431
Douglas Katzman95354292015-06-23 20:42:09 +0000432 void ConstructJob(Compilation &C, const JobAction &JA,
433 const InputInfo &Output, const InputInfoList &Inputs,
434 const llvm::opt::ArgList &TCArgs,
435 const char *LinkingOutput) const override;
436};
437class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
438public:
439 Linker(const ToolChain &TC) : GnuTool("bitrig::Linker", "linker", TC) {}
Eli Friedman9fa28852012-08-08 23:57:20 +0000440
Douglas Katzman95354292015-06-23 20:42:09 +0000441 bool hasIntegratedCPP() const override { return false; }
442 bool isLinkJob() const override { return true; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000443
Reid Klecknerbac59a12015-07-15 17:58:55 +0000444 void ConstructJob(Compilation &C, const JobAction &JA,
445 const InputInfo &Output, const InputInfoList &Inputs,
446 const llvm::opt::ArgList &TCArgs,
447 const char *LinkingOutput) const override;
448};
Eli Friedman9fa28852012-08-08 23:57:20 +0000449} // end namespace bitrig
450
Douglas Katzman95354292015-06-23 20:42:09 +0000451/// freebsd -- Directly call GNU Binutils assembler and linker
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000452namespace freebsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000453class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
454public:
455 Assembler(const ToolChain &TC)
456 : GnuTool("freebsd::Assembler", "assembler", TC) {}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000457
Douglas Katzman95354292015-06-23 20:42:09 +0000458 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000459
Douglas Katzman95354292015-06-23 20:42:09 +0000460 void ConstructJob(Compilation &C, const JobAction &JA,
461 const InputInfo &Output, const InputInfoList &Inputs,
462 const llvm::opt::ArgList &TCArgs,
463 const char *LinkingOutput) const override;
464};
465class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
466public:
467 Linker(const ToolChain &TC) : GnuTool("freebsd::Linker", "linker", TC) {}
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000468
Douglas Katzman95354292015-06-23 20:42:09 +0000469 bool hasIntegratedCPP() const override { return false; }
470 bool isLinkJob() const override { return true; }
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000471
Reid Klecknerbac59a12015-07-15 17:58:55 +0000472 void ConstructJob(Compilation &C, const JobAction &JA,
473 const InputInfo &Output, const InputInfoList &Inputs,
474 const llvm::opt::ArgList &TCArgs,
475 const char *LinkingOutput) const override;
476};
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000477} // end namespace freebsd
478
Douglas Katzman95354292015-06-23 20:42:09 +0000479/// netbsd -- Directly call GNU Binutils assembler and linker
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000480namespace netbsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000481class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
Joerg Sonnenberger637603a2011-05-16 13:35:02 +0000482
Douglas Katzman95354292015-06-23 20:42:09 +0000483public:
484 Assembler(const ToolChain &TC)
485 : GnuTool("netbsd::Assembler", "assembler", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000486
Douglas Katzman95354292015-06-23 20:42:09 +0000487 bool hasIntegratedCPP() const override { return false; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000488
Douglas Katzman95354292015-06-23 20:42:09 +0000489 void ConstructJob(Compilation &C, const JobAction &JA,
490 const InputInfo &Output, const InputInfoList &Inputs,
491 const llvm::opt::ArgList &TCArgs,
492 const char *LinkingOutput) const override;
493};
494class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
Joerg Sonnenberger637603a2011-05-16 13:35:02 +0000495
Douglas Katzman95354292015-06-23 20:42:09 +0000496public:
497 Linker(const ToolChain &TC) : GnuTool("netbsd::Linker", "linker", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000498
Douglas Katzman95354292015-06-23 20:42:09 +0000499 bool hasIntegratedCPP() const override { return false; }
500 bool isLinkJob() const override { return true; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000501
Reid Klecknerbac59a12015-07-15 17:58:55 +0000502 void ConstructJob(Compilation &C, const JobAction &JA,
503 const InputInfo &Output, const InputInfoList &Inputs,
504 const llvm::opt::ArgList &TCArgs,
505 const char *LinkingOutput) const override;
506};
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000507} // end namespace netbsd
508
Douglas Katzman95354292015-06-23 20:42:09 +0000509/// Directly call GNU Binutils' assembler and linker.
Thomas Schwinge4e555262013-03-28 19:04:25 +0000510namespace gnutools {
Douglas Katzman95354292015-06-23 20:42:09 +0000511class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
512public:
513 Assembler(const ToolChain &TC) : GnuTool("GNU::Assembler", "assembler", TC) {}
Rafael Espindola92b00932010-08-10 00:25:48 +0000514
Douglas Katzman95354292015-06-23 20:42:09 +0000515 bool hasIntegratedCPP() const override { return false; }
516
517 void ConstructJob(Compilation &C, const JobAction &JA,
518 const InputInfo &Output, const InputInfoList &Inputs,
519 const llvm::opt::ArgList &TCArgs,
520 const char *LinkingOutput) const override;
521};
522class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
523public:
524 Linker(const ToolChain &TC) : GnuTool("GNU::Linker", "linker", TC) {}
525
526 bool hasIntegratedCPP() const override { return false; }
527 bool isLinkJob() const override { return true; }
Rafael Espindola92b00932010-08-10 00:25:48 +0000528
Reid Klecknerbac59a12015-07-15 17:58:55 +0000529 void ConstructJob(Compilation &C, const JobAction &JA,
530 const InputInfo &Output, const InputInfoList &Inputs,
531 const llvm::opt::ArgList &TCArgs,
532 const char *LinkingOutput) const override;
533};
534}
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000535
Reid Klecknerbac59a12015-07-15 17:58:55 +0000536namespace nacltools {
537class LLVM_LIBRARY_VISIBILITY AssemblerARM : public gnutools::Assembler {
538public:
539 AssemblerARM(const ToolChain &TC) : gnutools::Assembler(TC) {}
Rafael Espindolac8f008f2010-11-07 20:14:31 +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};
546class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
547public:
548 Linker(const ToolChain &TC) : Tool("NaCl::Linker", "linker", TC) {}
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000549
Reid Klecknerbac59a12015-07-15 17:58:55 +0000550 bool hasIntegratedCPP() const override { return false; }
551 bool isLinkJob() const override { return true; }
Derek Schuff6ab52fa2015-03-30 20:31:33 +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};
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000558}
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000559
Douglas Katzman95354292015-06-23 20:42:09 +0000560/// minix -- Directly call GNU Binutils assembler and linker
Chris Lattner3e2ee142010-07-07 16:01:42 +0000561namespace minix {
Douglas Katzman95354292015-06-23 20:42:09 +0000562class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
563public:
564 Assembler(const ToolChain &TC)
565 : GnuTool("minix::Assembler", "assembler", TC) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000566
Douglas Katzman95354292015-06-23 20:42:09 +0000567 bool hasIntegratedCPP() const override { return false; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000568
Douglas Katzman95354292015-06-23 20:42:09 +0000569 void ConstructJob(Compilation &C, const JobAction &JA,
570 const InputInfo &Output, const InputInfoList &Inputs,
571 const llvm::opt::ArgList &TCArgs,
572 const char *LinkingOutput) const override;
573};
574class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
575public:
576 Linker(const ToolChain &TC) : GnuTool("minix::Linker", "linker", TC) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000577
Douglas Katzman95354292015-06-23 20:42:09 +0000578 bool hasIntegratedCPP() const override { return false; }
579 bool isLinkJob() const override { return true; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000580
Reid Klecknerbac59a12015-07-15 17:58:55 +0000581 void ConstructJob(Compilation &C, const JobAction &JA,
582 const InputInfo &Output, const InputInfoList &Inputs,
583 const llvm::opt::ArgList &TCArgs,
584 const char *LinkingOutput) const override;
585};
Chris Lattner3e2ee142010-07-07 16:01:42 +0000586} // end namespace minix
587
Douglas Katzman95354292015-06-23 20:42:09 +0000588/// solaris -- Directly call Solaris assembler and linker
David Chisnallf571cde2012-02-15 13:39:01 +0000589namespace solaris {
Douglas Katzman95354292015-06-23 20:42:09 +0000590class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
591public:
592 Assembler(const ToolChain &TC)
593 : Tool("solaris::Assembler", "assembler", TC) {}
David Chisnallf571cde2012-02-15 13:39:01 +0000594
Douglas Katzman95354292015-06-23 20:42:09 +0000595 bool hasIntegratedCPP() const override { return false; }
David Chisnallf571cde2012-02-15 13:39:01 +0000596
Douglas Katzman95354292015-06-23 20:42:09 +0000597 void ConstructJob(Compilation &C, const JobAction &JA,
598 const InputInfo &Output, const InputInfoList &Inputs,
599 const llvm::opt::ArgList &TCArgs,
600 const char *LinkingOutput) const override;
601};
602class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
603public:
604 Linker(const ToolChain &TC) : Tool("solaris::Linker", "linker", TC) {}
David Chisnallf571cde2012-02-15 13:39:01 +0000605
Douglas Katzman95354292015-06-23 20:42:09 +0000606 bool hasIntegratedCPP() const override { return false; }
607 bool isLinkJob() const override { return true; }
David Chisnallf571cde2012-02-15 13:39:01 +0000608
Reid Klecknerbac59a12015-07-15 17:58:55 +0000609 void ConstructJob(Compilation &C, const JobAction &JA,
610 const InputInfo &Output, const InputInfoList &Inputs,
611 const llvm::opt::ArgList &TCArgs,
612 const char *LinkingOutput) const override;
613};
David Chisnalla9ed5d72012-02-15 16:25:46 +0000614} // end namespace solaris
David Chisnallf571cde2012-02-15 13:39:01 +0000615
Douglas Katzman95354292015-06-23 20:42:09 +0000616/// dragonfly -- Directly call GNU Binutils assembler and linker
Daniel Dunbarcc912342009-05-02 18:28:39 +0000617namespace dragonfly {
Douglas Katzman95354292015-06-23 20:42:09 +0000618class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
619public:
620 Assembler(const ToolChain &TC)
621 : GnuTool("dragonfly::Assembler", "assembler", TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000622
Douglas Katzman95354292015-06-23 20:42:09 +0000623 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000624
Douglas Katzman95354292015-06-23 20:42:09 +0000625 void ConstructJob(Compilation &C, const JobAction &JA,
626 const InputInfo &Output, const InputInfoList &Inputs,
627 const llvm::opt::ArgList &TCArgs,
628 const char *LinkingOutput) const override;
629};
630class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
631public:
632 Linker(const ToolChain &TC) : GnuTool("dragonfly::Linker", "linker", TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000633
Douglas Katzman95354292015-06-23 20:42:09 +0000634 bool hasIntegratedCPP() const override { return false; }
635 bool isLinkJob() const override { return true; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000636
Reid Klecknerbac59a12015-07-15 17:58:55 +0000637 void ConstructJob(Compilation &C, const JobAction &JA,
638 const InputInfo &Output, const InputInfoList &Inputs,
639 const llvm::opt::ArgList &TCArgs,
640 const char *LinkingOutput) const override;
641};
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000642} // end namespace dragonfly
Daniel Dunbarcc912342009-05-02 18:28:39 +0000643
Hans Wennborg1da044a2014-06-26 19:59:02 +0000644/// Visual studio tools.
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000645namespace visualstudio {
Douglas Katzman95354292015-06-23 20:42:09 +0000646VersionTuple getMSVCVersion(const Driver *D, const llvm::Triple &Triple,
647 const llvm::opt::ArgList &Args, bool IsWindowsMSVC);
David Majnemere11d3732015-06-08 00:22:46 +0000648
Douglas Katzman95354292015-06-23 20:42:09 +0000649class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
650public:
651 Linker(const ToolChain &TC)
652 : Tool("visualstudio::Linker", "linker", TC, RF_Full,
653 llvm::sys::WEM_UTF16) {}
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000654
Douglas Katzman95354292015-06-23 20:42:09 +0000655 bool hasIntegratedCPP() const override { return false; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000656 bool isLinkJob() const override { return true; }
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000657
Reid Klecknerbac59a12015-07-15 17:58:55 +0000658 void ConstructJob(Compilation &C, const JobAction &JA,
659 const InputInfo &Output, const InputInfoList &Inputs,
660 const llvm::opt::ArgList &TCArgs,
661 const char *LinkingOutput) const override;
Douglas Katzman95354292015-06-23 20:42:09 +0000662};
Hans Wennborg87cfa712013-09-19 20:32:16 +0000663
Douglas Katzman95354292015-06-23 20:42:09 +0000664class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
665public:
666 Compiler(const ToolChain &TC)
667 : Tool("visualstudio::Compiler", "compiler", TC, RF_Full,
668 llvm::sys::WEM_UTF16) {}
Hans Wennborg87cfa712013-09-19 20:32:16 +0000669
Douglas Katzman95354292015-06-23 20:42:09 +0000670 bool hasIntegratedAssembler() const override { return true; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000671 bool hasIntegratedCPP() const override { return true; }
672 bool isLinkJob() const override { return false; }
Hans Wennborg87cfa712013-09-19 20:32:16 +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;
Hans Wennborg87cfa712013-09-19 20:32:16 +0000678
Reid Klecknerbac59a12015-07-15 17:58:55 +0000679 std::unique_ptr<Command> GetCommand(Compilation &C, const JobAction &JA,
680 const InputInfo &Output,
681 const InputInfoList &Inputs,
682 const llvm::opt::ArgList &TCArgs,
683 const char *LinkingOutput) const;
684};
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000685} // end namespace visualstudio
686
Yaron Keren1c0070c2015-07-02 04:45:27 +0000687/// MinGW -- Directly call GNU Binutils assembler and linker
688namespace MinGW {
689class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
690public:
691 Assembler(const ToolChain &TC) : Tool("MinGW::Assemble", "assembler", TC) {}
692
693 bool hasIntegratedCPP() const override { return false; }
694
695 void ConstructJob(Compilation &C, const JobAction &JA,
696 const InputInfo &Output, const InputInfoList &Inputs,
697 const llvm::opt::ArgList &TCArgs,
698 const char *LinkingOutput) const override;
699};
700
701class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
702public:
703 Linker(const ToolChain &TC) : Tool("MinGW::Linker", "linker", TC) {}
704
705 bool hasIntegratedCPP() const override { return false; }
706 bool isLinkJob() const override { return true; }
707
708 void ConstructJob(Compilation &C, const JobAction &JA,
709 const InputInfo &Output, const InputInfoList &Inputs,
710 const llvm::opt::ArgList &TCArgs,
711 const char *LinkingOutput) const override;
712
713private:
714 void AddLibGCC(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs) const;
715};
716} // end namespace MinGW
717
Tim Northover9c7e0352013-12-12 11:55:52 +0000718namespace arm {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000719enum class FloatABI {
720 Invalid,
721 Soft,
722 SoftFP,
723 Hard,
724};
725
726FloatABI getARMFloatABI(const Driver &D, const llvm::opt::ArgList &Args,
727 const llvm::Triple &Triple);
Tim Northover9c7e0352013-12-12 11:55:52 +0000728}
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000729namespace XCore {
Douglas Katzman95354292015-06-23 20:42:09 +0000730// For XCore, we do not need to instantiate tools for PreProcess, PreCompile and
731// Compile.
732// We simply use "clang -cc1" for those actions.
733class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000734public:
Douglas Katzman95354292015-06-23 20:42:09 +0000735 Assembler(const ToolChain &TC) : Tool("XCore::Assembler", "XCore-as", TC) {}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000736
737 bool hasIntegratedCPP() const override { return false; }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000738 void ConstructJob(Compilation &C, const JobAction &JA,
739 const InputInfo &Output, const InputInfoList &Inputs,
740 const llvm::opt::ArgList &TCArgs,
741 const char *LinkingOutput) const override;
742};
743
Douglas Katzman95354292015-06-23 20:42:09 +0000744class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000745public:
Douglas Katzman95354292015-06-23 20:42:09 +0000746 Linker(const ToolChain &TC) : Tool("XCore::Linker", "XCore-ld", TC) {}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000747
748 bool hasIntegratedCPP() const override { return false; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000749 bool isLinkJob() const override { return true; }
750 void ConstructJob(Compilation &C, const JobAction &JA,
751 const InputInfo &Output, const InputInfoList &Inputs,
752 const llvm::opt::ArgList &TCArgs,
753 const char *LinkingOutput) const override;
754};
755} // end namespace XCore.
Douglas Katzman95354292015-06-23 20:42:09 +0000756
Reid Klecknerbac59a12015-07-15 17:58:55 +0000757namespace CrossWindows {
758class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
759public:
760 Assembler(const ToolChain &TC) : Tool("CrossWindows::Assembler", "as", TC) {}
Douglas Katzman95354292015-06-23 20:42:09 +0000761
Reid Klecknerbac59a12015-07-15 17:58:55 +0000762 bool hasIntegratedCPP() const override { return false; }
Douglas Katzman95354292015-06-23 20:42:09 +0000763
Reid Klecknerbac59a12015-07-15 17:58:55 +0000764 void ConstructJob(Compilation &C, const JobAction &JA,
765 const InputInfo &Output, const InputInfoList &Inputs,
766 const llvm::opt::ArgList &TCArgs,
767 const char *LinkingOutput) const override;
768};
Douglas Katzman95354292015-06-23 20:42:09 +0000769
Reid Klecknerbac59a12015-07-15 17:58:55 +0000770class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
771public:
772 Linker(const ToolChain &TC)
773 : Tool("CrossWindows::Linker", "ld", TC, RF_Full) {}
Douglas Katzman95354292015-06-23 20:42:09 +0000774
Reid Klecknerbac59a12015-07-15 17:58:55 +0000775 bool hasIntegratedCPP() const override { return false; }
776 bool isLinkJob() const override { return true; }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000777
778 void ConstructJob(Compilation &C, const JobAction &JA,
779 const InputInfo &Output, const InputInfoList &Inputs,
780 const llvm::opt::ArgList &TCArgs,
781 const char *LinkingOutput) const override;
782};
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000783}
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000784
Douglas Katzman84a75642015-06-19 14:55:19 +0000785/// SHAVE tools -- Directly call moviCompile and moviAsm
786namespace SHAVE {
Douglas Katzman95354292015-06-23 20:42:09 +0000787class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
Douglas Katzman84a75642015-06-19 14:55:19 +0000788public:
Douglas Katzman95354292015-06-23 20:42:09 +0000789 Compiler(const ToolChain &TC) : Tool("moviCompile", "movicompile", TC) {}
Douglas Katzman84a75642015-06-19 14:55:19 +0000790
791 bool hasIntegratedCPP() const override { return true; }
792
793 void ConstructJob(Compilation &C, const JobAction &JA,
794 const InputInfo &Output, const InputInfoList &Inputs,
795 const llvm::opt::ArgList &TCArgs,
796 const char *LinkingOutput) const override;
797};
798
Douglas Katzman95354292015-06-23 20:42:09 +0000799class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
Douglas Katzman84a75642015-06-19 14:55:19 +0000800public:
Douglas Katzman95354292015-06-23 20:42:09 +0000801 Assembler(const ToolChain &TC) : Tool("moviAsm", "moviAsm", TC) {}
Douglas Katzman84a75642015-06-19 14:55:19 +0000802
803 bool hasIntegratedCPP() const override { return false; } // not sure.
804
805 void ConstructJob(Compilation &C, const JobAction &JA,
806 const InputInfo &Output, const InputInfoList &Inputs,
807 const llvm::opt::ArgList &TCArgs,
808 const char *LinkingOutput) const override;
809};
810} // end namespace SHAVE
811
Douglas Katzmand6e597c2015-09-17 19:56:40 +0000812/// The Myriad toolchain uses tools that are in two different namespaces.
813/// The Compiler and Assembler as defined above are in the SHAVE namespace,
814/// whereas the linker, which accepts code for a mixture of Sparc and SHAVE,
815/// is in the Myriad namespace.
816namespace Myriad {
817class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
818public:
819 Linker(const ToolChain &TC) : GnuTool("shave::Linker", "ld", TC) {}
820 bool hasIntegratedCPP() const override { return false; }
821 bool isLinkJob() const override { return true; }
822 void ConstructJob(Compilation &C, const JobAction &JA,
823 const InputInfo &Output, const InputInfoList &Inputs,
824 const llvm::opt::ArgList &TCArgs,
825 const char *LinkingOutput) const override;
826};
827} // end namespace Myriad
828
Douglas Katzman9dc5fbb2015-06-03 16:56:50 +0000829} // end namespace tools
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000830} // end namespace driver
831} // end namespace clang
832
Benjamin Kramer2f5db8b2014-08-13 16:25:19 +0000833#endif