blob: be68ff134b24f37b68e4af635f229e1a1ef99b9d [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,
60 const InputInfoList &Inputs) const;
Daniel Dunbard067f7f2009-04-08 23:54:23 +000061
Reid Klecknerbac59a12015-07-15 17:58:55 +000062 void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
Tim Northovera2ee4332014-03-29 15:09:45 +000063 llvm::opt::ArgStringList &CmdArgs) const;
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +000064 void AddARMTargetArgs(const llvm::Triple &Triple,
65 const llvm::opt::ArgList &Args,
Reid Klecknerbac59a12015-07-15 17:58:55 +000066 llvm::opt::ArgStringList &CmdArgs,
67 bool KernelOrKext) const;
68 void AddARM64TargetArgs(const llvm::opt::ArgList &Args,
Ulrich Weigand8afad612014-07-28 13:17:52 +000069 llvm::opt::ArgStringList &CmdArgs) const;
Reid Klecknerbac59a12015-07-15 17:58:55 +000070 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
71 llvm::opt::ArgStringList &CmdArgs) const;
72 void AddPPCTargetArgs(const llvm::opt::ArgList &Args,
Hans Wennborg75958c42013-08-08 00:17:41 +000073 llvm::opt::ArgStringList &CmdArgs) const;
Reid Klecknerbac59a12015-07-15 17:58:55 +000074 void AddR600TargetArgs(const llvm::opt::ArgList &Args,
75 llvm::opt::ArgStringList &CmdArgs) const;
76 void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
77 llvm::opt::ArgStringList &CmdArgs) const;
78 void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
79 llvm::opt::ArgStringList &CmdArgs) const;
80 void AddX86TargetArgs(const llvm::opt::ArgList &Args,
81 llvm::opt::ArgStringList &CmdArgs) const;
82 void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
83 llvm::opt::ArgStringList &CmdArgs) const;
Hans Wennborg75958c42013-08-08 00:17:41 +000084
Reid Klecknerbac59a12015-07-15 17:58:55 +000085 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
Hans Wennborg1da044a2014-06-26 19:59:02 +000086
Reid Klecknerbac59a12015-07-15 17:58:55 +000087 ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
88 llvm::opt::ArgStringList &cmdArgs,
89 RewriteKind rewrite) const;
Hans Wennborg1da044a2014-06-26 19:59:02 +000090
Reid Klecknerbac59a12015-07-15 17:58:55 +000091 void AddClangCLArgs(const llvm::opt::ArgList &Args,
Douglas Katzman3459ce22015-10-08 04:24:12 +000092 llvm::opt::ArgStringList &CmdArgs,
93 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
94 bool *EmitCodeView) const;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000095
Reid Klecknerbac59a12015-07-15 17:58:55 +000096 visualstudio::Compiler *getCLFallback() const;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000097
Reid Klecknerbac59a12015-07-15 17:58:55 +000098 mutable std::unique_ptr<visualstudio::Compiler> CLFallback;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000099
Reid Klecknerbac59a12015-07-15 17:58:55 +0000100public:
101 // CAUTION! The first constructor argument ("clang") is not arbitrary,
102 // as it is for other tools. Some operations on a Tool actually test
103 // whether that tool is Clang based on the Tool's Name as a string.
104 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC, RF_Full) {}
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000105
Reid Klecknerbac59a12015-07-15 17:58:55 +0000106 bool hasGoodDiagnostics() const override { return true; }
107 bool hasIntegratedAssembler() const override { return true; }
108 bool hasIntegratedCPP() const override { return true; }
109 bool canEmitIR() const override { return true; }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000110
Reid Klecknerbac59a12015-07-15 17:58:55 +0000111 void ConstructJob(Compilation &C, const JobAction &JA,
112 const InputInfo &Output, const InputInfoList &Inputs,
113 const llvm::opt::ArgList &TCArgs,
114 const char *LinkingOutput) const override;
115};
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000116
Reid Klecknerbac59a12015-07-15 17:58:55 +0000117/// \brief Clang integrated assembler tool.
118class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
119public:
120 ClangAs(const ToolChain &TC)
121 : Tool("clang::as", "clang integrated assembler", TC, RF_Full) {}
122 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
123 llvm::opt::ArgStringList &CmdArgs) const;
124 bool hasGoodDiagnostics() const override { return true; }
125 bool hasIntegratedAssembler() const override { return false; }
126 bool hasIntegratedCPP() const override { return false; }
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000127
Reid Klecknerbac59a12015-07-15 17:58:55 +0000128 void ConstructJob(Compilation &C, const JobAction &JA,
129 const InputInfo &Output, const InputInfoList &Inputs,
130 const llvm::opt::ArgList &TCArgs,
131 const char *LinkingOutput) const override;
132};
133
134/// \brief Base class for all GNU tools that provide the same behavior when
135/// it comes to response files support
136class LLVM_LIBRARY_VISIBILITY GnuTool : public Tool {
137 virtual void anchor();
138
139public:
140 GnuTool(const char *Name, const char *ShortName, const ToolChain &TC)
141 : Tool(Name, ShortName, TC, RF_Full, llvm::sys::WEM_CurrentCodePage) {}
142};
143
144/// gcc - Generic GCC tool implementations.
Daniel Dunbar82116f82009-03-17 22:45:24 +0000145namespace gcc {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000146class LLVM_LIBRARY_VISIBILITY Common : public GnuTool {
147public:
148 Common(const char *Name, const char *ShortName, const ToolChain &TC)
149 : GnuTool(Name, ShortName, TC) {}
Daniel Dunbara3246a02009-03-18 08:07:30 +0000150
Reid Klecknerbac59a12015-07-15 17:58:55 +0000151 void ConstructJob(Compilation &C, const JobAction &JA,
152 const InputInfo &Output, const InputInfoList &Inputs,
153 const llvm::opt::ArgList &TCArgs,
154 const char *LinkingOutput) const override;
Daniel Dunbara3246a02009-03-18 08:07:30 +0000155
Reid Klecknerbac59a12015-07-15 17:58:55 +0000156 /// RenderExtraToolArgs - Render any arguments necessary to force
157 /// the particular tool mode.
158 virtual void RenderExtraToolArgs(const JobAction &JA,
159 llvm::opt::ArgStringList &CmdArgs) const = 0;
160};
Daniel Dunbara3246a02009-03-18 08:07:30 +0000161
Reid Klecknerbac59a12015-07-15 17:58:55 +0000162class LLVM_LIBRARY_VISIBILITY Preprocessor : public Common {
163public:
164 Preprocessor(const ToolChain &TC)
165 : Common("gcc::Preprocessor", "gcc preprocessor", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000166
Reid Klecknerbac59a12015-07-15 17:58:55 +0000167 bool hasGoodDiagnostics() const override { return true; }
168 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000169
Reid Klecknerbac59a12015-07-15 17:58:55 +0000170 void RenderExtraToolArgs(const JobAction &JA,
171 llvm::opt::ArgStringList &CmdArgs) const override;
172};
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000173
Reid Klecknerbac59a12015-07-15 17:58:55 +0000174class LLVM_LIBRARY_VISIBILITY Compiler : public Common {
175public:
176 Compiler(const ToolChain &TC) : Common("gcc::Compiler", "gcc frontend", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000177
Reid Klecknerbac59a12015-07-15 17:58:55 +0000178 bool hasGoodDiagnostics() const override { return true; }
179 bool hasIntegratedCPP() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000180
Reid Klecknerbac59a12015-07-15 17:58:55 +0000181 void RenderExtraToolArgs(const JobAction &JA,
182 llvm::opt::ArgStringList &CmdArgs) const override;
183};
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000184
Reid Klecknerbac59a12015-07-15 17:58:55 +0000185class LLVM_LIBRARY_VISIBILITY Linker : public Common {
186public:
187 Linker(const ToolChain &TC) : Common("gcc::Linker", "linker (via gcc)", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000188
Reid Klecknerbac59a12015-07-15 17:58:55 +0000189 bool hasIntegratedCPP() const override { return false; }
190 bool isLinkJob() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000191
Reid Klecknerbac59a12015-07-15 17:58:55 +0000192 void RenderExtraToolArgs(const JobAction &JA,
193 llvm::opt::ArgStringList &CmdArgs) const override;
194};
Daniel Dunbar82116f82009-03-17 22:45:24 +0000195} // end namespace gcc
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000196
Tony Linthicum76329bf2011-12-12 21:14:55 +0000197namespace hexagon {
Douglas Katzman95354292015-06-23 20:42:09 +0000198// For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile
199// and Compile.
200// We simply use "clang -cc1" for those actions.
201class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
202public:
203 Assembler(const ToolChain &TC)
204 : GnuTool("hexagon::Assembler", "hexagon-as", TC) {}
Tony Linthicum76329bf2011-12-12 21:14:55 +0000205
Douglas Katzman95354292015-06-23 20:42:09 +0000206 bool hasIntegratedCPP() const override { return false; }
Tony Linthicum76329bf2011-12-12 21:14:55 +0000207
Reid Klecknerbac59a12015-07-15 17:58:55 +0000208 void RenderExtraToolArgs(const JobAction &JA,
209 llvm::opt::ArgStringList &CmdArgs) const;
210 void ConstructJob(Compilation &C, const JobAction &JA,
211 const InputInfo &Output, const InputInfoList &Inputs,
212 const llvm::opt::ArgList &TCArgs,
213 const char *LinkingOutput) const override;
Douglas Katzman95354292015-06-23 20:42:09 +0000214};
Tony Linthicum76329bf2011-12-12 21:14:55 +0000215
Douglas Katzman95354292015-06-23 20:42:09 +0000216class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
217public:
218 Linker(const ToolChain &TC) : GnuTool("hexagon::Linker", "hexagon-ld", TC) {}
Tony Linthicum76329bf2011-12-12 21:14:55 +0000219
Douglas Katzman95354292015-06-23 20:42:09 +0000220 bool hasIntegratedCPP() const override { return false; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000221 bool isLinkJob() const override { return true; }
Tony Linthicum76329bf2011-12-12 21:14:55 +0000222
Reid Klecknerbac59a12015-07-15 17:58:55 +0000223 virtual void RenderExtraToolArgs(const JobAction &JA,
224 llvm::opt::ArgStringList &CmdArgs) const;
225 void ConstructJob(Compilation &C, const JobAction &JA,
226 const InputInfo &Output, const InputInfoList &Inputs,
227 const llvm::opt::ArgList &TCArgs,
228 const char *LinkingOutput) const override;
229};
Tony Linthicum76329bf2011-12-12 21:14:55 +0000230} // end namespace hexagon.
231
Tom Stellard8fa33092015-07-18 01:49:05 +0000232namespace amdgpu {
233
234class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
235public:
236 Linker(const ToolChain &TC) : GnuTool("amdgpu::Linker", "lld", TC) {}
237 bool isLinkJob() const override { return true; }
238 bool hasIntegratedCPP() const override { return false; }
239 void ConstructJob(Compilation &C, const JobAction &JA,
240 const InputInfo &Output, const InputInfoList &Inputs,
241 const llvm::opt::ArgList &TCArgs,
242 const char *LinkingOutput) const override;
243};
244
245} // end namespace amdgpu
246
Bernard Ogden31561762013-12-12 13:27:11 +0000247namespace arm {
Renato Goline17c5802015-07-27 23:44:42 +0000248std::string getARMTargetCPU(StringRef CPU, StringRef Arch,
Reid Klecknerbac59a12015-07-15 17:58:55 +0000249 const llvm::Triple &Triple);
Renato Goline17c5802015-07-27 23:44:42 +0000250const std::string getARMArch(StringRef Arch,
Reid Klecknerbac59a12015-07-15 17:58:55 +0000251 const llvm::Triple &Triple);
Chandler Carruthd96f37a2015-08-30 07:51:18 +0000252StringRef getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple);
Vladimir Sukharev64f68242015-09-23 09:29:32 +0000253StringRef getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
254 const llvm::Triple &Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +0000255
Reid Klecknerbac59a12015-07-15 17:58:55 +0000256void appendEBLinkFlags(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs,
257 const llvm::Triple &Triple);
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000258} // end namespace arm
Tony Linthicum76329bf2011-12-12 21:14:55 +0000259
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000260namespace mips {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000261typedef enum { NanLegacy = 1, Nan2008 = 2 } NanEncoding;
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +0000262
263enum class FloatABI {
264 Invalid,
265 Soft,
266 Hard,
267};
268
Reid Klecknerbac59a12015-07-15 17:58:55 +0000269NanEncoding getSupportedNanEncoding(StringRef &CPU);
270void getMipsCPUAndABI(const llvm::opt::ArgList &Args,
271 const llvm::Triple &Triple, StringRef &CPUName,
272 StringRef &ABIName);
Vasileios Kalintirisc744e122015-11-12 15:26:54 +0000273std::string getMipsABILibSuffix(const llvm::opt::ArgList &Args,
274 const llvm::Triple &Triple);
Reid Klecknerbac59a12015-07-15 17:58:55 +0000275bool hasMipsAbiArg(const llvm::opt::ArgList &Args, const char *Value);
276bool isUCLibc(const llvm::opt::ArgList &Args);
277bool isNaN2008(const llvm::opt::ArgList &Args, const llvm::Triple &Triple);
278bool isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +0000279 StringRef ABIName, mips::FloatABI FloatABI);
Reid Klecknerbac59a12015-07-15 17:58:55 +0000280bool shouldUseFPXX(const llvm::opt::ArgList &Args, const llvm::Triple &Triple,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +0000281 StringRef CPUName, StringRef ABIName,
282 mips::FloatABI FloatABI);
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000283} // end namespace mips
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000284
Ulrich Weigand8afad612014-07-28 13:17:52 +0000285namespace ppc {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000286bool hasPPCAbiArg(const llvm::opt::ArgList &Args, const char *Value);
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000287} // end namespace ppc
Ulrich Weigand8afad612014-07-28 13:17:52 +0000288
Douglas Katzman95354292015-06-23 20:42:09 +0000289/// cloudabi -- Directly call GNU Binutils linker
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000290namespace cloudabi {
Douglas Katzman95354292015-06-23 20:42:09 +0000291class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000292public:
Douglas Katzman95354292015-06-23 20:42:09 +0000293 Linker(const ToolChain &TC) : GnuTool("cloudabi::Linker", "linker", TC) {}
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000294
295 bool hasIntegratedCPP() const override { return false; }
296 bool isLinkJob() const override { return true; }
297
298 void ConstructJob(Compilation &C, const JobAction &JA,
299 const InputInfo &Output, const InputInfoList &Inputs,
300 const llvm::opt::ArgList &TCArgs,
301 const char *LinkingOutput) const override;
302};
303} // end namespace cloudabi
304
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000305namespace darwin {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000306llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
307void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
Rafael Espindoladcbf6982012-10-31 18:51:07 +0000308
Reid Klecknerbac59a12015-07-15 17:58:55 +0000309class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
310 virtual void anchor();
Daniel Dunbare9ded432009-09-09 18:36:20 +0000311
Reid Klecknerbac59a12015-07-15 17:58:55 +0000312protected:
313 void AddMachOArch(const llvm::opt::ArgList &Args,
314 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbare9ded432009-09-09 18:36:20 +0000315
Reid Klecknerbac59a12015-07-15 17:58:55 +0000316 const toolchains::MachO &getMachOToolChain() const {
317 return reinterpret_cast<const toolchains::MachO &>(getToolChain());
318 }
Daniel Dunbare9ded432009-09-09 18:36:20 +0000319
Reid Klecknerbac59a12015-07-15 17:58:55 +0000320public:
321 MachOTool(
322 const char *Name, const char *ShortName, const ToolChain &TC,
323 ResponseFileSupport ResponseSupport = RF_None,
324 llvm::sys::WindowsEncodingMethod ResponseEncoding = llvm::sys::WEM_UTF8,
325 const char *ResponseFlag = "@")
326 : Tool(Name, ShortName, TC, ResponseSupport, ResponseEncoding,
327 ResponseFlag) {}
328};
Daniel Dunbarbe220842009-03-20 16:06:39 +0000329
Reid Klecknerbac59a12015-07-15 17:58:55 +0000330class LLVM_LIBRARY_VISIBILITY Assembler : public MachOTool {
331public:
332 Assembler(const ToolChain &TC)
333 : MachOTool("darwin::Assembler", "assembler", TC) {}
Daniel Dunbarbe220842009-03-20 16:06:39 +0000334
Reid Klecknerbac59a12015-07-15 17:58:55 +0000335 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarbe220842009-03-20 16:06:39 +0000336
Reid Klecknerbac59a12015-07-15 17:58:55 +0000337 void ConstructJob(Compilation &C, const JobAction &JA,
338 const InputInfo &Output, const InputInfoList &Inputs,
339 const llvm::opt::ArgList &TCArgs,
340 const char *LinkingOutput) const override;
341};
Daniel Dunbarc1964212009-03-26 16:23:12 +0000342
Reid Klecknerbac59a12015-07-15 17:58:55 +0000343class LLVM_LIBRARY_VISIBILITY Linker : public MachOTool {
344 bool NeedsTempPath(const InputInfoList &Inputs) const;
345 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
346 llvm::opt::ArgStringList &CmdArgs,
347 const InputInfoList &Inputs) const;
Daniel Dunbarc1964212009-03-26 16:23:12 +0000348
Reid Klecknerbac59a12015-07-15 17:58:55 +0000349public:
350 Linker(const ToolChain &TC)
351 : MachOTool("darwin::Linker", "linker", TC, RF_FileList,
352 llvm::sys::WEM_UTF8, "-filelist") {}
Daniel Dunbarc1964212009-03-26 16:23:12 +0000353
Reid Klecknerbac59a12015-07-15 17:58:55 +0000354 bool hasIntegratedCPP() const override { return false; }
355 bool isLinkJob() const override { return true; }
Daniel Dunbarc1964212009-03-26 16:23:12 +0000356
Reid Klecknerbac59a12015-07-15 17:58:55 +0000357 void ConstructJob(Compilation &C, const JobAction &JA,
358 const InputInfo &Output, const InputInfoList &Inputs,
359 const llvm::opt::ArgList &TCArgs,
360 const char *LinkingOutput) const override;
361};
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000362
Reid Klecknerbac59a12015-07-15 17:58:55 +0000363class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool {
364public:
365 Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000366
Reid Klecknerbac59a12015-07-15 17:58:55 +0000367 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar88299622010-06-04 18:28:36 +0000368
Reid Klecknerbac59a12015-07-15 17:58:55 +0000369 void ConstructJob(Compilation &C, const JobAction &JA,
370 const InputInfo &Output, const InputInfoList &Inputs,
371 const llvm::opt::ArgList &TCArgs,
372 const char *LinkingOutput) const override;
373};
Daniel Dunbar88299622010-06-04 18:28:36 +0000374
Reid Klecknerbac59a12015-07-15 17:58:55 +0000375class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool {
376public:
377 Dsymutil(const ToolChain &TC)
378 : MachOTool("darwin::Dsymutil", "dsymutil", TC) {}
Daniel Dunbar88299622010-06-04 18:28:36 +0000379
Reid Klecknerbac59a12015-07-15 17:58:55 +0000380 bool hasIntegratedCPP() const override { return false; }
381 bool isDsymutilJob() const override { return true; }
Eric Christopher551ef452011-08-23 17:56:55 +0000382
Reid Klecknerbac59a12015-07-15 17:58:55 +0000383 void ConstructJob(Compilation &C, const JobAction &JA,
384 const InputInfo &Output, const InputInfoList &Inputs,
385 const llvm::opt::ArgList &TCArgs,
386 const char *LinkingOutput) const override;
387};
Eric Christopher551ef452011-08-23 17:56:55 +0000388
Reid Klecknerbac59a12015-07-15 17:58:55 +0000389class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool {
390public:
391 VerifyDebug(const ToolChain &TC)
392 : MachOTool("darwin::VerifyDebug", "dwarfdump", TC) {}
Eric Christopher551ef452011-08-23 17:56:55 +0000393
Reid Klecknerbac59a12015-07-15 17:58:55 +0000394 bool hasIntegratedCPP() const override { return false; }
Eric Christopher551ef452011-08-23 17:56:55 +0000395
Reid Klecknerbac59a12015-07-15 17:58:55 +0000396 void ConstructJob(Compilation &C, const JobAction &JA,
397 const InputInfo &Output, const InputInfoList &Inputs,
398 const llvm::opt::ArgList &TCArgs,
399 const char *LinkingOutput) const override;
400};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000401} // end namespace darwin
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000402
Douglas Katzman95354292015-06-23 20:42:09 +0000403/// openbsd -- Directly call GNU Binutils assembler and linker
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000404namespace openbsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000405class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
406public:
407 Assembler(const ToolChain &TC)
408 : GnuTool("openbsd::Assembler", "assembler", TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000409
Douglas Katzman95354292015-06-23 20:42:09 +0000410 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000411
Douglas Katzman95354292015-06-23 20:42:09 +0000412 void ConstructJob(Compilation &C, const JobAction &JA,
413 const InputInfo &Output, const InputInfoList &Inputs,
414 const llvm::opt::ArgList &TCArgs,
415 const char *LinkingOutput) const override;
416};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000417
Douglas Katzman95354292015-06-23 20:42:09 +0000418class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
419public:
420 Linker(const ToolChain &TC) : GnuTool("openbsd::Linker", "linker", TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000421
Douglas Katzman95354292015-06-23 20:42:09 +0000422 bool hasIntegratedCPP() const override { return false; }
423 bool isLinkJob() const override { return true; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000424
Reid Klecknerbac59a12015-07-15 17:58:55 +0000425 void ConstructJob(Compilation &C, const JobAction &JA,
426 const InputInfo &Output, const InputInfoList &Inputs,
427 const llvm::opt::ArgList &TCArgs,
428 const char *LinkingOutput) const override;
429};
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000430} // end namespace openbsd
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000431
Douglas Katzman95354292015-06-23 20:42:09 +0000432/// bitrig -- Directly call GNU Binutils assembler and linker
Eli Friedman9fa28852012-08-08 23:57:20 +0000433namespace bitrig {
Douglas Katzman95354292015-06-23 20:42:09 +0000434class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
435public:
436 Assembler(const ToolChain &TC)
437 : GnuTool("bitrig::Assembler", "assembler", TC) {}
Eli Friedman9fa28852012-08-08 23:57:20 +0000438
Douglas Katzman95354292015-06-23 20:42:09 +0000439 bool hasIntegratedCPP() const override { return false; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000440
Douglas Katzman95354292015-06-23 20:42:09 +0000441 void ConstructJob(Compilation &C, const JobAction &JA,
442 const InputInfo &Output, const InputInfoList &Inputs,
443 const llvm::opt::ArgList &TCArgs,
444 const char *LinkingOutput) const override;
445};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000446
Douglas Katzman95354292015-06-23 20:42:09 +0000447class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
448public:
449 Linker(const ToolChain &TC) : GnuTool("bitrig::Linker", "linker", TC) {}
Eli Friedman9fa28852012-08-08 23:57:20 +0000450
Douglas Katzman95354292015-06-23 20:42:09 +0000451 bool hasIntegratedCPP() const override { return false; }
452 bool isLinkJob() const override { return true; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000453
Reid Klecknerbac59a12015-07-15 17:58:55 +0000454 void ConstructJob(Compilation &C, const JobAction &JA,
455 const InputInfo &Output, const InputInfoList &Inputs,
456 const llvm::opt::ArgList &TCArgs,
457 const char *LinkingOutput) const override;
458};
Eli Friedman9fa28852012-08-08 23:57:20 +0000459} // end namespace bitrig
460
Douglas Katzman95354292015-06-23 20:42:09 +0000461/// freebsd -- Directly call GNU Binutils assembler and linker
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000462namespace freebsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000463class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
464public:
465 Assembler(const ToolChain &TC)
466 : GnuTool("freebsd::Assembler", "assembler", TC) {}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000467
Douglas Katzman95354292015-06-23 20:42:09 +0000468 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000469
Douglas Katzman95354292015-06-23 20:42:09 +0000470 void ConstructJob(Compilation &C, const JobAction &JA,
471 const InputInfo &Output, const InputInfoList &Inputs,
472 const llvm::opt::ArgList &TCArgs,
473 const char *LinkingOutput) const override;
474};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000475
Douglas Katzman95354292015-06-23 20:42:09 +0000476class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
477public:
478 Linker(const ToolChain &TC) : GnuTool("freebsd::Linker", "linker", TC) {}
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000479
Douglas Katzman95354292015-06-23 20:42:09 +0000480 bool hasIntegratedCPP() const override { return false; }
481 bool isLinkJob() const override { return true; }
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000482
Reid Klecknerbac59a12015-07-15 17:58:55 +0000483 void ConstructJob(Compilation &C, const JobAction &JA,
484 const InputInfo &Output, const InputInfoList &Inputs,
485 const llvm::opt::ArgList &TCArgs,
486 const char *LinkingOutput) const override;
487};
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000488} // end namespace freebsd
489
Douglas Katzman95354292015-06-23 20:42:09 +0000490/// netbsd -- Directly call GNU Binutils assembler and linker
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000491namespace netbsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000492class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
Douglas Katzman95354292015-06-23 20:42:09 +0000493public:
494 Assembler(const ToolChain &TC)
495 : GnuTool("netbsd::Assembler", "assembler", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000496
Douglas Katzman95354292015-06-23 20:42:09 +0000497 bool hasIntegratedCPP() const override { return false; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000498
Douglas Katzman95354292015-06-23 20:42:09 +0000499 void ConstructJob(Compilation &C, const JobAction &JA,
500 const InputInfo &Output, const InputInfoList &Inputs,
501 const llvm::opt::ArgList &TCArgs,
502 const char *LinkingOutput) const override;
503};
Joerg Sonnenberger637603a2011-05-16 13:35:02 +0000504
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000505class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
Douglas Katzman95354292015-06-23 20:42:09 +0000506public:
507 Linker(const ToolChain &TC) : GnuTool("netbsd::Linker", "linker", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000508
Douglas Katzman95354292015-06-23 20:42:09 +0000509 bool hasIntegratedCPP() const override { return false; }
510 bool isLinkJob() const override { return true; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000511
Reid Klecknerbac59a12015-07-15 17:58:55 +0000512 void ConstructJob(Compilation &C, const JobAction &JA,
513 const InputInfo &Output, const InputInfoList &Inputs,
514 const llvm::opt::ArgList &TCArgs,
515 const char *LinkingOutput) const override;
516};
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000517} // end namespace netbsd
518
Douglas Katzman95354292015-06-23 20:42:09 +0000519/// Directly call GNU Binutils' assembler and linker.
Thomas Schwinge4e555262013-03-28 19:04:25 +0000520namespace gnutools {
Douglas Katzman95354292015-06-23 20:42:09 +0000521class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
522public:
523 Assembler(const ToolChain &TC) : GnuTool("GNU::Assembler", "assembler", TC) {}
Rafael Espindola92b00932010-08-10 00:25:48 +0000524
Douglas Katzman95354292015-06-23 20:42:09 +0000525 bool hasIntegratedCPP() const override { return false; }
526
527 void ConstructJob(Compilation &C, const JobAction &JA,
528 const InputInfo &Output, const InputInfoList &Inputs,
529 const llvm::opt::ArgList &TCArgs,
530 const char *LinkingOutput) const override;
531};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000532
Douglas Katzman95354292015-06-23 20:42:09 +0000533class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
534public:
535 Linker(const ToolChain &TC) : GnuTool("GNU::Linker", "linker", TC) {}
536
537 bool hasIntegratedCPP() const override { return false; }
538 bool isLinkJob() const override { return true; }
Rafael Espindola92b00932010-08-10 00:25:48 +0000539
Reid Klecknerbac59a12015-07-15 17:58:55 +0000540 void ConstructJob(Compilation &C, const JobAction &JA,
541 const InputInfo &Output, const InputInfoList &Inputs,
542 const llvm::opt::ArgList &TCArgs,
543 const char *LinkingOutput) const override;
544};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000545} // end namespace gnutools
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000546
Reid Klecknerbac59a12015-07-15 17:58:55 +0000547namespace nacltools {
548class LLVM_LIBRARY_VISIBILITY AssemblerARM : public gnutools::Assembler {
549public:
550 AssemblerARM(const ToolChain &TC) : gnutools::Assembler(TC) {}
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000551
Reid Klecknerbac59a12015-07-15 17:58:55 +0000552 void ConstructJob(Compilation &C, const JobAction &JA,
553 const InputInfo &Output, const InputInfoList &Inputs,
554 const llvm::opt::ArgList &TCArgs,
555 const char *LinkingOutput) const override;
556};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000557
Reid Klecknerbac59a12015-07-15 17:58:55 +0000558class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
559public:
560 Linker(const ToolChain &TC) : Tool("NaCl::Linker", "linker", TC) {}
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000561
Reid Klecknerbac59a12015-07-15 17:58:55 +0000562 bool hasIntegratedCPP() const override { return false; }
563 bool isLinkJob() const override { return true; }
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000564
Reid Klecknerbac59a12015-07-15 17:58:55 +0000565 void ConstructJob(Compilation &C, const JobAction &JA,
566 const InputInfo &Output, const InputInfoList &Inputs,
567 const llvm::opt::ArgList &TCArgs,
568 const char *LinkingOutput) const override;
569};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000570} // end namespace nacltools
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000571
Douglas Katzman95354292015-06-23 20:42:09 +0000572/// minix -- Directly call GNU Binutils assembler and linker
Chris Lattner3e2ee142010-07-07 16:01:42 +0000573namespace minix {
Douglas Katzman95354292015-06-23 20:42:09 +0000574class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
575public:
576 Assembler(const ToolChain &TC)
577 : GnuTool("minix::Assembler", "assembler", TC) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000578
Douglas Katzman95354292015-06-23 20:42:09 +0000579 bool hasIntegratedCPP() const override { return false; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000580
Douglas Katzman95354292015-06-23 20:42:09 +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};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000586
Douglas Katzman95354292015-06-23 20:42:09 +0000587class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
588public:
589 Linker(const ToolChain &TC) : GnuTool("minix::Linker", "linker", TC) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000590
Douglas Katzman95354292015-06-23 20:42:09 +0000591 bool hasIntegratedCPP() const override { return false; }
592 bool isLinkJob() const override { return true; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000593
Reid Klecknerbac59a12015-07-15 17:58:55 +0000594 void ConstructJob(Compilation &C, const JobAction &JA,
595 const InputInfo &Output, const InputInfoList &Inputs,
596 const llvm::opt::ArgList &TCArgs,
597 const char *LinkingOutput) const override;
598};
Chris Lattner3e2ee142010-07-07 16:01:42 +0000599} // end namespace minix
600
Douglas Katzman95354292015-06-23 20:42:09 +0000601/// solaris -- Directly call Solaris assembler and linker
David Chisnallf571cde2012-02-15 13:39:01 +0000602namespace solaris {
Douglas Katzman95354292015-06-23 20:42:09 +0000603class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
604public:
605 Assembler(const ToolChain &TC)
606 : Tool("solaris::Assembler", "assembler", TC) {}
David Chisnallf571cde2012-02-15 13:39:01 +0000607
Douglas Katzman95354292015-06-23 20:42:09 +0000608 bool hasIntegratedCPP() const override { return false; }
David Chisnallf571cde2012-02-15 13:39:01 +0000609
Douglas Katzman95354292015-06-23 20:42:09 +0000610 void ConstructJob(Compilation &C, const JobAction &JA,
611 const InputInfo &Output, const InputInfoList &Inputs,
612 const llvm::opt::ArgList &TCArgs,
613 const char *LinkingOutput) const override;
614};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000615
Douglas Katzman95354292015-06-23 20:42:09 +0000616class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
617public:
618 Linker(const ToolChain &TC) : Tool("solaris::Linker", "linker", TC) {}
David Chisnallf571cde2012-02-15 13:39:01 +0000619
Douglas Katzman95354292015-06-23 20:42:09 +0000620 bool hasIntegratedCPP() const override { return false; }
621 bool isLinkJob() const override { return true; }
David Chisnallf571cde2012-02-15 13:39:01 +0000622
Reid Klecknerbac59a12015-07-15 17:58:55 +0000623 void ConstructJob(Compilation &C, const JobAction &JA,
624 const InputInfo &Output, const InputInfoList &Inputs,
625 const llvm::opt::ArgList &TCArgs,
626 const char *LinkingOutput) const override;
627};
David Chisnalla9ed5d72012-02-15 16:25:46 +0000628} // end namespace solaris
David Chisnallf571cde2012-02-15 13:39:01 +0000629
Douglas Katzman95354292015-06-23 20:42:09 +0000630/// dragonfly -- Directly call GNU Binutils assembler and linker
Daniel Dunbarcc912342009-05-02 18:28:39 +0000631namespace dragonfly {
Douglas Katzman95354292015-06-23 20:42:09 +0000632class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
633public:
634 Assembler(const ToolChain &TC)
635 : GnuTool("dragonfly::Assembler", "assembler", TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000636
Douglas Katzman95354292015-06-23 20:42:09 +0000637 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000638
Douglas Katzman95354292015-06-23 20:42:09 +0000639 void ConstructJob(Compilation &C, const JobAction &JA,
640 const InputInfo &Output, const InputInfoList &Inputs,
641 const llvm::opt::ArgList &TCArgs,
642 const char *LinkingOutput) const override;
643};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000644
Douglas Katzman95354292015-06-23 20:42:09 +0000645class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
646public:
647 Linker(const ToolChain &TC) : GnuTool("dragonfly::Linker", "linker", TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000648
Douglas Katzman95354292015-06-23 20:42:09 +0000649 bool hasIntegratedCPP() const override { return false; }
650 bool isLinkJob() const override { return true; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000651
Reid Klecknerbac59a12015-07-15 17:58:55 +0000652 void ConstructJob(Compilation &C, const JobAction &JA,
653 const InputInfo &Output, const InputInfoList &Inputs,
654 const llvm::opt::ArgList &TCArgs,
655 const char *LinkingOutput) const override;
656};
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000657} // end namespace dragonfly
Daniel Dunbarcc912342009-05-02 18:28:39 +0000658
Hans Wennborg1da044a2014-06-26 19:59:02 +0000659/// Visual studio tools.
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000660namespace visualstudio {
Douglas Katzman95354292015-06-23 20:42:09 +0000661VersionTuple getMSVCVersion(const Driver *D, const llvm::Triple &Triple,
662 const llvm::opt::ArgList &Args, bool IsWindowsMSVC);
David Majnemere11d3732015-06-08 00:22:46 +0000663
Douglas Katzman95354292015-06-23 20:42:09 +0000664class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
665public:
666 Linker(const ToolChain &TC)
667 : Tool("visualstudio::Linker", "linker", TC, RF_Full,
668 llvm::sys::WEM_UTF16) {}
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000669
Douglas Katzman95354292015-06-23 20:42:09 +0000670 bool hasIntegratedCPP() const override { return false; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000671 bool isLinkJob() const override { return true; }
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000672
Reid Klecknerbac59a12015-07-15 17:58:55 +0000673 void ConstructJob(Compilation &C, const JobAction &JA,
674 const InputInfo &Output, const InputInfoList &Inputs,
675 const llvm::opt::ArgList &TCArgs,
676 const char *LinkingOutput) const override;
Douglas Katzman95354292015-06-23 20:42:09 +0000677};
Hans Wennborg87cfa712013-09-19 20:32:16 +0000678
Douglas Katzman95354292015-06-23 20:42:09 +0000679class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
680public:
681 Compiler(const ToolChain &TC)
682 : Tool("visualstudio::Compiler", "compiler", TC, RF_Full,
683 llvm::sys::WEM_UTF16) {}
Hans Wennborg87cfa712013-09-19 20:32:16 +0000684
Douglas Katzman95354292015-06-23 20:42:09 +0000685 bool hasIntegratedAssembler() const override { return true; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000686 bool hasIntegratedCPP() const override { return true; }
687 bool isLinkJob() const override { return false; }
Hans Wennborg87cfa712013-09-19 20:32:16 +0000688
Reid Klecknerbac59a12015-07-15 17:58:55 +0000689 void ConstructJob(Compilation &C, const JobAction &JA,
690 const InputInfo &Output, const InputInfoList &Inputs,
691 const llvm::opt::ArgList &TCArgs,
692 const char *LinkingOutput) const override;
Hans Wennborg87cfa712013-09-19 20:32:16 +0000693
Reid Klecknerbac59a12015-07-15 17:58:55 +0000694 std::unique_ptr<Command> GetCommand(Compilation &C, const JobAction &JA,
695 const InputInfo &Output,
696 const InputInfoList &Inputs,
697 const llvm::opt::ArgList &TCArgs,
698 const char *LinkingOutput) const;
699};
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000700} // end namespace visualstudio
701
Yaron Keren1c0070c2015-07-02 04:45:27 +0000702/// MinGW -- Directly call GNU Binutils assembler and linker
703namespace MinGW {
704class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
705public:
706 Assembler(const ToolChain &TC) : Tool("MinGW::Assemble", "assembler", TC) {}
707
708 bool hasIntegratedCPP() const override { return false; }
709
710 void ConstructJob(Compilation &C, const JobAction &JA,
711 const InputInfo &Output, const InputInfoList &Inputs,
712 const llvm::opt::ArgList &TCArgs,
713 const char *LinkingOutput) const override;
714};
715
716class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
717public:
718 Linker(const ToolChain &TC) : Tool("MinGW::Linker", "linker", TC) {}
719
720 bool hasIntegratedCPP() const override { return false; }
721 bool isLinkJob() const override { return true; }
722
723 void ConstructJob(Compilation &C, const JobAction &JA,
724 const InputInfo &Output, const InputInfoList &Inputs,
725 const llvm::opt::ArgList &TCArgs,
726 const char *LinkingOutput) const override;
727
728private:
729 void AddLibGCC(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs) const;
730};
731} // end namespace MinGW
732
Tim Northover9c7e0352013-12-12 11:55:52 +0000733namespace arm {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000734enum class FloatABI {
735 Invalid,
736 Soft,
737 SoftFP,
738 Hard,
739};
740
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000741FloatABI getARMFloatABI(const ToolChain &TC, const llvm::opt::ArgList &Args);
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000742} // end namespace arm
743
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000744namespace XCore {
Douglas Katzman95354292015-06-23 20:42:09 +0000745// For XCore, we do not need to instantiate tools for PreProcess, PreCompile and
746// Compile.
747// We simply use "clang -cc1" for those actions.
748class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000749public:
Douglas Katzman95354292015-06-23 20:42:09 +0000750 Assembler(const ToolChain &TC) : Tool("XCore::Assembler", "XCore-as", TC) {}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000751
752 bool hasIntegratedCPP() const override { return false; }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000753 void ConstructJob(Compilation &C, const JobAction &JA,
754 const InputInfo &Output, const InputInfoList &Inputs,
755 const llvm::opt::ArgList &TCArgs,
756 const char *LinkingOutput) const override;
757};
758
Douglas Katzman95354292015-06-23 20:42:09 +0000759class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000760public:
Douglas Katzman95354292015-06-23 20:42:09 +0000761 Linker(const ToolChain &TC) : Tool("XCore::Linker", "XCore-ld", TC) {}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000762
763 bool hasIntegratedCPP() const override { return false; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000764 bool isLinkJob() const override { return true; }
765 void ConstructJob(Compilation &C, const JobAction &JA,
766 const InputInfo &Output, const InputInfoList &Inputs,
767 const llvm::opt::ArgList &TCArgs,
768 const char *LinkingOutput) const override;
769};
770} // end namespace XCore.
Douglas Katzman95354292015-06-23 20:42:09 +0000771
Reid Klecknerbac59a12015-07-15 17:58:55 +0000772namespace CrossWindows {
773class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
774public:
775 Assembler(const ToolChain &TC) : Tool("CrossWindows::Assembler", "as", TC) {}
Douglas Katzman95354292015-06-23 20:42:09 +0000776
Reid Klecknerbac59a12015-07-15 17:58:55 +0000777 bool hasIntegratedCPP() const override { return false; }
Douglas Katzman95354292015-06-23 20:42:09 +0000778
Reid Klecknerbac59a12015-07-15 17:58:55 +0000779 void ConstructJob(Compilation &C, const JobAction &JA,
780 const InputInfo &Output, const InputInfoList &Inputs,
781 const llvm::opt::ArgList &TCArgs,
782 const char *LinkingOutput) const override;
783};
Douglas Katzman95354292015-06-23 20:42:09 +0000784
Reid Klecknerbac59a12015-07-15 17:58:55 +0000785class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
786public:
787 Linker(const ToolChain &TC)
788 : Tool("CrossWindows::Linker", "ld", TC, RF_Full) {}
Douglas Katzman95354292015-06-23 20:42:09 +0000789
Reid Klecknerbac59a12015-07-15 17:58:55 +0000790 bool hasIntegratedCPP() const override { return false; }
791 bool isLinkJob() const override { return true; }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000792
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};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000798} // end namespace CrossWindows
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000799
Douglas Katzman84a75642015-06-19 14:55:19 +0000800/// SHAVE tools -- Directly call moviCompile and moviAsm
801namespace SHAVE {
Douglas Katzman95354292015-06-23 20:42:09 +0000802class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
Douglas Katzman84a75642015-06-19 14:55:19 +0000803public:
Douglas Katzman95354292015-06-23 20:42:09 +0000804 Compiler(const ToolChain &TC) : Tool("moviCompile", "movicompile", TC) {}
Douglas Katzman84a75642015-06-19 14:55:19 +0000805
806 bool hasIntegratedCPP() const override { return true; }
807
808 void ConstructJob(Compilation &C, const JobAction &JA,
809 const InputInfo &Output, const InputInfoList &Inputs,
810 const llvm::opt::ArgList &TCArgs,
811 const char *LinkingOutput) const override;
812};
813
Douglas Katzman95354292015-06-23 20:42:09 +0000814class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
Douglas Katzman84a75642015-06-19 14:55:19 +0000815public:
Douglas Katzman95354292015-06-23 20:42:09 +0000816 Assembler(const ToolChain &TC) : Tool("moviAsm", "moviAsm", TC) {}
Douglas Katzman84a75642015-06-19 14:55:19 +0000817
818 bool hasIntegratedCPP() const override { return false; } // not sure.
819
820 void ConstructJob(Compilation &C, const JobAction &JA,
821 const InputInfo &Output, const InputInfoList &Inputs,
822 const llvm::opt::ArgList &TCArgs,
823 const char *LinkingOutput) const override;
824};
825} // end namespace SHAVE
826
Douglas Katzmand6e597c2015-09-17 19:56:40 +0000827/// The Myriad toolchain uses tools that are in two different namespaces.
828/// The Compiler and Assembler as defined above are in the SHAVE namespace,
829/// whereas the linker, which accepts code for a mixture of Sparc and SHAVE,
830/// is in the Myriad namespace.
831namespace Myriad {
832class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
833public:
834 Linker(const ToolChain &TC) : GnuTool("shave::Linker", "ld", TC) {}
835 bool hasIntegratedCPP() const override { return false; }
836 bool isLinkJob() const override { return true; }
837 void ConstructJob(Compilation &C, const JobAction &JA,
838 const InputInfo &Output, const InputInfoList &Inputs,
839 const llvm::opt::ArgList &TCArgs,
840 const char *LinkingOutput) const override;
841};
842} // end namespace Myriad
843
Filipe Cabecinhasc888e192015-10-14 12:25:43 +0000844namespace PS4cpu {
845class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
846public:
847 Assemble(const ToolChain &TC)
848 : Tool("PS4cpu::Assemble", "assembler", TC, RF_Full) {}
849
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000850 bool hasIntegratedCPP() const override { return false; }
Filipe Cabecinhasc888e192015-10-14 12:25:43 +0000851
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000852 void ConstructJob(Compilation &C, const JobAction &JA,
853 const InputInfo &Output,
854 const InputInfoList &Inputs,
855 const llvm::opt::ArgList &TCArgs,
856 const char *LinkingOutput) const override;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +0000857};
858
859class LLVM_LIBRARY_VISIBILITY Link : public Tool {
860public:
861 Link(const ToolChain &TC) : Tool("PS4cpu::Link", "linker", TC, RF_Full) {}
862
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000863 bool hasIntegratedCPP() const override { return false; }
864 bool isLinkJob() const override { return true; }
Filipe Cabecinhasc888e192015-10-14 12:25:43 +0000865
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000866 void ConstructJob(Compilation &C, const JobAction &JA,
867 const InputInfo &Output,
868 const InputInfoList &Inputs,
869 const llvm::opt::ArgList &TCArgs,
870 const char *LinkingOutput) const override;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +0000871};
872} // end namespace PS4cpu
873
Douglas Katzman9dc5fbb2015-06-03 16:56:50 +0000874} // end namespace tools
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000875} // end namespace driver
876} // end namespace clang
877
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000878#endif // LLVM_CLANG_LIB_DRIVER_TOOLS_H