blob: e8edaebbaceaa7a4efc11d7107417ca539005feb [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
13#include "clang/Driver/Tool.h"
Daniel Dunbare6adeee2009-03-29 17:08:39 +000014#include "clang/Driver/Types.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000015#include "clang/Driver/Util.h"
Joerg Sonnenberger637603a2011-05-16 13:35:02 +000016#include "llvm/ADT/Triple.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000017#include "llvm/Option/Option.h"
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000018#include "llvm/Support/Compiler.h"
19
20namespace clang {
John McCall5fb5df92012-06-20 06:18:46 +000021 class ObjCRuntime;
22
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000023namespace driver {
Hans Wennborg87cfa712013-09-19 20:32:16 +000024 class Command;
Douglas Gregor111af7d2009-04-18 00:34:01 +000025 class Driver;
26
Daniel Dunbarc1964212009-03-26 16:23:12 +000027namespace toolchains {
Tim Northover157d9112014-01-16 08:48:16 +000028 class MachO;
Daniel Dunbarc1964212009-03-26 16:23:12 +000029}
30
Daniel Dunbar15abb2e2009-03-17 22:18:43 +000031namespace tools {
Hans Wennborg1da044a2014-06-26 19:59:02 +000032
33namespace visualstudio {
34 class Compile;
35}
36
Reid Kleckner898229a2013-06-14 17:17:23 +000037using llvm::opt::ArgStringList;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000038
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +000039 /// \brief Clang compiler tool.
Duncan Sandsaf260b92010-05-11 20:16:05 +000040 class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
Eric Christopher45f2e712012-12-18 00:31:10 +000041 public:
Reid Kleckner724c21c2013-06-17 13:59:19 +000042 static const char *getBaseInputName(const llvm::opt::ArgList &Args,
Bob Wilsondecc03e2012-11-23 06:14:39 +000043 const InputInfoList &Inputs);
Reid Kleckner724c21c2013-06-17 13:59:19 +000044 static const char *getBaseInputStem(const llvm::opt::ArgList &Args,
Bob Wilsondecc03e2012-11-23 06:14:39 +000045 const InputInfoList &Inputs);
Reid Kleckner724c21c2013-06-17 13:59:19 +000046 static const char *getDependencyFileName(const llvm::opt::ArgList &Args,
Bob Wilsondecc03e2012-11-23 06:14:39 +000047 const InputInfoList &Inputs);
48
Eric Christopher45f2e712012-12-18 00:31:10 +000049 private:
Reid Kleckner724c21c2013-06-17 13:59:19 +000050 void AddPreprocessingOptions(Compilation &C, const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +000051 const Driver &D,
Reid Kleckner724c21c2013-06-17 13:59:19 +000052 const llvm::opt::ArgList &Args,
53 llvm::opt::ArgStringList &CmdArgs,
Daniel Dunbard067f7f2009-04-08 23:54:23 +000054 const InputInfo &Output,
55 const InputInfoList &Inputs) const;
56
Amara Emerson703da2e2013-10-31 09:32:33 +000057 void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
58 llvm::opt::ArgStringList &CmdArgs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +000059 void AddARMTargetArgs(const llvm::opt::ArgList &Args,
60 llvm::opt::ArgStringList &CmdArgs,
Daniel Dunbarc9388c12011-03-17 17:10:06 +000061 bool KernelOrKext) const;
Tim Northovera2ee4332014-03-29 15:09:45 +000062 void AddARM64TargetArgs(const llvm::opt::ArgList &Args,
63 llvm::opt::ArgStringList &CmdArgs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +000064 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
65 llvm::opt::ArgStringList &CmdArgs) const;
Ulrich Weigand8afad612014-07-28 13:17:52 +000066 void AddPPCTargetArgs(const llvm::opt::ArgList &Args,
67 llvm::opt::ArgStringList &CmdArgs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +000068 void AddR600TargetArgs(const llvm::opt::ArgList &Args,
69 llvm::opt::ArgStringList &CmdArgs) const;
70 void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
71 llvm::opt::ArgStringList &CmdArgs) const;
Richard Sandiford4652d892013-07-19 16:51:51 +000072 void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
73 llvm::opt::ArgStringList &CmdArgs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +000074 void AddX86TargetArgs(const llvm::opt::ArgList &Args,
75 llvm::opt::ArgStringList &CmdArgs) const;
76 void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
77 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbar3b3191f2009-09-09 22:33:08 +000078
John McCall5fb5df92012-06-20 06:18:46 +000079 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
80
Reid Kleckner724c21c2013-06-17 13:59:19 +000081 ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
82 llvm::opt::ArgStringList &cmdArgs,
John McCall5fb5df92012-06-20 06:18:46 +000083 RewriteKind rewrite) const;
84
Hans Wennborg75958c42013-08-08 00:17:41 +000085 void AddClangCLArgs(const llvm::opt::ArgList &Args,
86 llvm::opt::ArgStringList &CmdArgs) const;
87
Hans Wennborg1da044a2014-06-26 19:59:02 +000088 visualstudio::Compile *getCLFallback() const;
89
90 mutable std::unique_ptr<visualstudio::Compile> CLFallback;
91
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000092 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +000093 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC, RF_Full) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000094
Craig Topperb45acb82014-03-14 06:02:07 +000095 bool hasGoodDiagnostics() const override { return true; }
96 bool hasIntegratedAssembler() const override { return true; }
97 bool hasIntegratedCPP() const override { return true; }
Bob Wilson23a55f12014-12-21 07:00:00 +000098 bool canEmitIR() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +000099
Craig Topperb45acb82014-03-14 06:02:07 +0000100 void ConstructJob(Compilation &C, const JobAction &JA,
101 const InputInfo &Output, const InputInfoList &Inputs,
102 const llvm::opt::ArgList &TCArgs,
103 const char *LinkingOutput) const override;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000104 };
105
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000106 /// \brief Clang integrated assembler tool.
107 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
108 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000109 ClangAs(const ToolChain &TC) : Tool("clang::as",
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000110 "clang integrated assembler", TC,
111 RF_Full) {}
Daniel Sanders7f933f42015-01-30 17:35:23 +0000112 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
113 llvm::opt::ArgStringList &CmdArgs) const;
Craig Topperb45acb82014-03-14 06:02:07 +0000114 bool hasGoodDiagnostics() const override { return true; }
115 bool hasIntegratedAssembler() const override { return false; }
116 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000117
Craig Topperb45acb82014-03-14 06:02:07 +0000118 void ConstructJob(Compilation &C, const JobAction &JA,
119 const InputInfo &Output, const InputInfoList &Inputs,
120 const llvm::opt::ArgList &TCArgs,
121 const char *LinkingOutput) const override;
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000122 };
123
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000124 /// \brief Base class for all GNU tools that provide the same behavior when
125 /// it comes to response files support
126 class GnuTool : public Tool {
127 virtual void anchor();
128
129 public:
130 GnuTool(const char *Name, const char *ShortName, const ToolChain &TC)
131 : Tool(Name, ShortName, TC, RF_Full, llvm::sys::WEM_CurrentCodePage) {}
132 };
133
Daniel Dunbar82116f82009-03-17 22:45:24 +0000134 /// gcc - Generic GCC tool implementations.
135namespace gcc {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000136 class LLVM_LIBRARY_VISIBILITY Common : public GnuTool {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000137 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000138 Common(const char *Name, const char *ShortName,
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000139 const ToolChain &TC) : GnuTool(Name, ShortName, TC) {}
Daniel Dunbara3246a02009-03-18 08:07:30 +0000140
Craig Topperb45acb82014-03-14 06:02:07 +0000141 void ConstructJob(Compilation &C, const JobAction &JA,
142 const InputInfo &Output,
143 const InputInfoList &Inputs,
144 const llvm::opt::ArgList &TCArgs,
145 const char *LinkingOutput) const override;
Daniel Dunbara3246a02009-03-18 08:07:30 +0000146
147 /// RenderExtraToolArgs - Render any arguments necessary to force
148 /// the particular tool mode.
Reid Kleckner724c21c2013-06-17 13:59:19 +0000149 virtual void
150 RenderExtraToolArgs(const JobAction &JA,
151 llvm::opt::ArgStringList &CmdArgs) const = 0;
Daniel Dunbara3246a02009-03-18 08:07:30 +0000152 };
153
Duncan Sandsaf260b92010-05-11 20:16:05 +0000154 class LLVM_LIBRARY_VISIBILITY Preprocess : public Common {
Daniel Dunbara3246a02009-03-18 08:07:30 +0000155 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000156 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess",
157 "gcc preprocessor", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000158
Craig Topperb45acb82014-03-14 06:02:07 +0000159 bool hasGoodDiagnostics() const override { return true; }
160 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000161
Craig Topperb45acb82014-03-14 06:02:07 +0000162 void RenderExtraToolArgs(const JobAction &JA,
163 llvm::opt::ArgStringList &CmdArgs) const override;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000164 };
165
Duncan Sandsaf260b92010-05-11 20:16:05 +0000166 class LLVM_LIBRARY_VISIBILITY Compile : public Common {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000167 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000168 Compile(const ToolChain &TC) : Common("gcc::Compile",
169 "gcc frontend", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000170
Craig Topperb45acb82014-03-14 06:02:07 +0000171 bool hasGoodDiagnostics() const override { return true; }
172 bool hasIntegratedCPP() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000173
Craig Topperb45acb82014-03-14 06:02:07 +0000174 void RenderExtraToolArgs(const JobAction &JA,
175 llvm::opt::ArgStringList &CmdArgs) const override;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000176 };
177
Duncan Sandsaf260b92010-05-11 20:16:05 +0000178 class LLVM_LIBRARY_VISIBILITY Link : public Common {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000179 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000180 Link(const ToolChain &TC) : Common("gcc::Link",
181 "linker (via gcc)", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000182
Craig Topperb45acb82014-03-14 06:02:07 +0000183 bool hasIntegratedCPP() const override { return false; }
184 bool isLinkJob() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000185
Craig Topperb45acb82014-03-14 06:02:07 +0000186 void RenderExtraToolArgs(const JobAction &JA,
187 llvm::opt::ArgStringList &CmdArgs) const override;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000188 };
Daniel Dunbar82116f82009-03-17 22:45:24 +0000189} // end namespace gcc
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000190
Tony Linthicum76329bf2011-12-12 21:14:55 +0000191namespace hexagon {
192 // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
193 // We simply use "clang -cc1" for those actions.
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000194 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Tony Linthicum76329bf2011-12-12 21:14:55 +0000195 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000196 Assemble(const ToolChain &TC) : GnuTool("hexagon::Assemble",
Tony Linthicum76329bf2011-12-12 21:14:55 +0000197 "hexagon-as", TC) {}
198
Craig Topperb45acb82014-03-14 06:02:07 +0000199 bool hasIntegratedCPP() const override { return false; }
Tony Linthicum76329bf2011-12-12 21:14:55 +0000200
Craig Topperf85c6ce2014-03-14 06:06:19 +0000201 void RenderExtraToolArgs(const JobAction &JA,
202 llvm::opt::ArgStringList &CmdArgs) const;
Craig Topperb45acb82014-03-14 06:02:07 +0000203 void ConstructJob(Compilation &C, const JobAction &JA,
204 const InputInfo &Output, const InputInfoList &Inputs,
205 const llvm::opt::ArgList &TCArgs,
206 const char *LinkingOutput) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +0000207 };
208
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000209 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Tony Linthicum76329bf2011-12-12 21:14:55 +0000210 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000211 Link(const ToolChain &TC) : GnuTool("hexagon::Link",
Tony Linthicum76329bf2011-12-12 21:14:55 +0000212 "hexagon-ld", TC) {}
213
Craig Topperb45acb82014-03-14 06:02:07 +0000214 bool hasIntegratedCPP() const override { return false; }
215 bool isLinkJob() const override { return true; }
Tony Linthicum76329bf2011-12-12 21:14:55 +0000216
217 virtual void RenderExtraToolArgs(const JobAction &JA,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000218 llvm::opt::ArgStringList &CmdArgs) const;
Craig Topperb45acb82014-03-14 06:02:07 +0000219 void ConstructJob(Compilation &C, const JobAction &JA,
220 const InputInfo &Output, const InputInfoList &Inputs,
221 const llvm::opt::ArgList &TCArgs,
222 const char *LinkingOutput) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +0000223 };
224} // end namespace hexagon.
225
Bernard Ogden31561762013-12-12 13:27:11 +0000226namespace arm {
Rafael Espindola80d333b2013-12-12 15:48:19 +0000227 StringRef getARMTargetCPU(const llvm::opt::ArgList &Args,
228 const llvm::Triple &Triple);
Bernard Ogden31561762013-12-12 13:27:11 +0000229 const char* getARMCPUForMArch(const llvm::opt::ArgList &Args,
230 const llvm::Triple &Triple);
231 const char* getLLVMArchSuffixForARM(StringRef CPU);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +0000232
233 void appendEBLinkFlags(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple);
Bernard Ogden31561762013-12-12 13:27:11 +0000234}
Tony Linthicum76329bf2011-12-12 21:14:55 +0000235
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000236namespace mips {
Simon Atanasyan7018e1d2014-07-16 12:29:22 +0000237 void getMipsCPUAndABI(const llvm::opt::ArgList &Args,
238 const llvm::Triple &Triple, StringRef &CPUName,
239 StringRef &ABIName);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000240 bool hasMipsAbiArg(const llvm::opt::ArgList &Args, const char *Value);
Simon Atanasyand95c67d2014-08-13 14:34:14 +0000241 bool isUCLibc(const llvm::opt::ArgList &Args);
Daniel Sanders2bf13662014-07-10 14:40:57 +0000242 bool isNaN2008(const llvm::opt::ArgList &Args, const llvm::Triple &Triple);
Daniel Sanders379d44b2014-07-16 11:52:23 +0000243 bool isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
244 StringRef ABIName);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000245}
246
Ulrich Weigand8afad612014-07-28 13:17:52 +0000247namespace ppc {
248 bool hasPPCAbiArg(const llvm::opt::ArgList &Args, const char *Value);
249}
250
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000251 /// cloudabi -- Directly call GNU Binutils linker
252namespace cloudabi {
253class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
254public:
255 Link(const ToolChain &TC) : GnuTool("cloudabi::Link", "linker", TC) {}
256
257 bool hasIntegratedCPP() const override { return false; }
258 bool isLinkJob() const override { return true; }
259
260 void ConstructJob(Compilation &C, const JobAction &JA,
261 const InputInfo &Output, const InputInfoList &Inputs,
262 const llvm::opt::ArgList &TCArgs,
263 const char *LinkingOutput) const override;
264};
265} // end namespace cloudabi
266
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000267namespace darwin {
Tim Northover157d9112014-01-16 08:48:16 +0000268 llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
269 void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
Rafael Espindoladcbf6982012-10-31 18:51:07 +0000270
Tim Northover157d9112014-01-16 08:48:16 +0000271 class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
David Blaikie68e081d2011-12-20 02:48:34 +0000272 virtual void anchor();
Daniel Dunbare9ded432009-09-09 18:36:20 +0000273 protected:
Tim Northover157d9112014-01-16 08:48:16 +0000274 void AddMachOArch(const llvm::opt::ArgList &Args,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000275 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbare9ded432009-09-09 18:36:20 +0000276
Tim Northover157d9112014-01-16 08:48:16 +0000277 const toolchains::MachO &getMachOToolChain() const {
278 return reinterpret_cast<const toolchains::MachO&>(getToolChain());
Daniel Dunbare9ded432009-09-09 18:36:20 +0000279 }
280
281 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000282 MachOTool(
283 const char *Name, const char *ShortName, const ToolChain &TC,
284 ResponseFileSupport ResponseSupport = RF_None,
285 llvm::sys::WindowsEncodingMethod ResponseEncoding = llvm::sys::WEM_UTF8,
286 const char *ResponseFlag = "@")
287 : Tool(Name, ShortName, TC, ResponseSupport, ResponseEncoding,
288 ResponseFlag) {}
Daniel Dunbare9ded432009-09-09 18:36:20 +0000289 };
290
Tim Northover157d9112014-01-16 08:48:16 +0000291 class LLVM_LIBRARY_VISIBILITY Assemble : public MachOTool {
Daniel Dunbarbe220842009-03-20 16:06:39 +0000292 public:
Tim Northover157d9112014-01-16 08:48:16 +0000293 Assemble(const ToolChain &TC) : MachOTool("darwin::Assemble",
294 "assembler", TC) {}
Daniel Dunbarbe220842009-03-20 16:06:39 +0000295
Craig Topperb45acb82014-03-14 06:02:07 +0000296 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarbe220842009-03-20 16:06:39 +0000297
Craig Topperb45acb82014-03-14 06:02:07 +0000298 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;
Daniel Dunbarbe220842009-03-20 16:06:39 +0000302 };
303
Tim Northover157d9112014-01-16 08:48:16 +0000304 class LLVM_LIBRARY_VISIBILITY Link : public MachOTool {
Bill Wendling3b2000f2012-10-02 18:02:50 +0000305 bool NeedsTempPath(const InputInfoList &Inputs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +0000306 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
307 llvm::opt::ArgStringList &CmdArgs,
308 const InputInfoList &Inputs) const;
Daniel Dunbarc1964212009-03-26 16:23:12 +0000309
Daniel Dunbarc1964212009-03-26 16:23:12 +0000310 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000311 Link(const ToolChain &TC) : MachOTool("darwin::Link", "linker", TC,
312 RF_FileList, llvm::sys::WEM_UTF8,
313 "-filelist") {}
Daniel Dunbarc1964212009-03-26 16:23:12 +0000314
Craig Topperb45acb82014-03-14 06:02:07 +0000315 bool hasIntegratedCPP() const override { return false; }
316 bool isLinkJob() const override { return true; }
Daniel Dunbarc1964212009-03-26 16:23:12 +0000317
Craig Topperb45acb82014-03-14 06:02:07 +0000318 void ConstructJob(Compilation &C, const JobAction &JA,
319 const InputInfo &Output, const InputInfoList &Inputs,
320 const llvm::opt::ArgList &TCArgs,
321 const char *LinkingOutput) const override;
Daniel Dunbarc1964212009-03-26 16:23:12 +0000322 };
323
Tim Northover157d9112014-01-16 08:48:16 +0000324 class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000325 public:
Tim Northover157d9112014-01-16 08:48:16 +0000326 Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000327
Craig Topperb45acb82014-03-14 06:02:07 +0000328 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000329
Craig Topperb45acb82014-03-14 06:02:07 +0000330 void ConstructJob(Compilation &C, const JobAction &JA,
331 const InputInfo &Output, const InputInfoList &Inputs,
332 const llvm::opt::ArgList &TCArgs,
333 const char *LinkingOutput) const override;
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000334 };
Daniel Dunbar88299622010-06-04 18:28:36 +0000335
Tim Northover157d9112014-01-16 08:48:16 +0000336 class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool {
Daniel Dunbar88299622010-06-04 18:28:36 +0000337 public:
Tim Northover157d9112014-01-16 08:48:16 +0000338 Dsymutil(const ToolChain &TC) : MachOTool("darwin::Dsymutil",
339 "dsymutil", TC) {}
Daniel Dunbar88299622010-06-04 18:28:36 +0000340
Craig Topperb45acb82014-03-14 06:02:07 +0000341 bool hasIntegratedCPP() const override { return false; }
342 bool isDsymutilJob() const override { return true; }
Daniel Dunbar88299622010-06-04 18:28:36 +0000343
Craig Topperb45acb82014-03-14 06:02:07 +0000344 void ConstructJob(Compilation &C, const JobAction &JA,
345 const InputInfo &Output,
346 const InputInfoList &Inputs,
347 const llvm::opt::ArgList &TCArgs,
348 const char *LinkingOutput) const override;
Daniel Dunbar88299622010-06-04 18:28:36 +0000349 };
Eric Christopher551ef452011-08-23 17:56:55 +0000350
Tim Northover157d9112014-01-16 08:48:16 +0000351 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool {
Eric Christopher551ef452011-08-23 17:56:55 +0000352 public:
Tim Northover157d9112014-01-16 08:48:16 +0000353 VerifyDebug(const ToolChain &TC) : MachOTool("darwin::VerifyDebug",
354 "dwarfdump", TC) {}
Eric Christopher551ef452011-08-23 17:56:55 +0000355
Craig Topperb45acb82014-03-14 06:02:07 +0000356 bool hasIntegratedCPP() const override { return false; }
Eric Christopher551ef452011-08-23 17:56:55 +0000357
Craig Topperb45acb82014-03-14 06:02:07 +0000358 void ConstructJob(Compilation &C, const JobAction &JA,
359 const InputInfo &Output, const InputInfoList &Inputs,
360 const llvm::opt::ArgList &TCArgs,
361 const char *LinkingOutput) const override;
Eric Christopher551ef452011-08-23 17:56:55 +0000362 };
363
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000364}
365
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000366 /// openbsd -- Directly call GNU Binutils assembler and linker
367namespace openbsd {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000368 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000369 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000370 Assemble(const ToolChain &TC) : GnuTool("openbsd::Assemble", "assembler",
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000371 TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000372
Craig Topperb45acb82014-03-14 06:02:07 +0000373 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000374
Craig Topperb45acb82014-03-14 06:02:07 +0000375 void ConstructJob(Compilation &C, const JobAction &JA,
376 const InputInfo &Output,
377 const InputInfoList &Inputs,
378 const llvm::opt::ArgList &TCArgs,
379 const char *LinkingOutput) const override;
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000380 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000381 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000382 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000383 Link(const ToolChain &TC) : GnuTool("openbsd::Link", "linker", TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000384
Craig Topperb45acb82014-03-14 06:02:07 +0000385 bool hasIntegratedCPP() const override { return false; }
386 bool isLinkJob() const override { return true; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000387
Craig Topperb45acb82014-03-14 06:02:07 +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;
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000392 };
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000393} // end namespace openbsd
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000394
Eli Friedman9fa28852012-08-08 23:57:20 +0000395 /// bitrig -- Directly call GNU Binutils assembler and linker
396namespace bitrig {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000397 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Eli Friedman9fa28852012-08-08 23:57:20 +0000398 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000399 Assemble(const ToolChain &TC) : GnuTool("bitrig::Assemble", "assembler",
Eli Friedman9fa28852012-08-08 23:57:20 +0000400 TC) {}
401
Craig Topperb45acb82014-03-14 06:02:07 +0000402 bool hasIntegratedCPP() const override { return false; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000403
Craig Topperb45acb82014-03-14 06:02:07 +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;
Eli Friedman9fa28852012-08-08 23:57:20 +0000408 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000409 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Eli Friedman9fa28852012-08-08 23:57:20 +0000410 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000411 Link(const ToolChain &TC) : GnuTool("bitrig::Link", "linker", TC) {}
Eli Friedman9fa28852012-08-08 23:57:20 +0000412
Craig Topperb45acb82014-03-14 06:02:07 +0000413 bool hasIntegratedCPP() const override { return false; }
414 bool isLinkJob() const override { return true; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000415
Craig Topperb45acb82014-03-14 06:02:07 +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;
Eli Friedman9fa28852012-08-08 23:57:20 +0000420 };
421} // end namespace bitrig
422
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000423 /// freebsd -- Directly call GNU Binutils assembler and linker
424namespace freebsd {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000425 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000426 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000427 Assemble(const ToolChain &TC) : GnuTool("freebsd::Assemble", "assembler",
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000428 TC) {}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000429
Craig Topperb45acb82014-03-14 06:02:07 +0000430 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000431
Craig Topperb45acb82014-03-14 06:02:07 +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;
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000436 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000437 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000438 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000439 Link(const ToolChain &TC) : GnuTool("freebsd::Link", "linker", TC) {}
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000440
Craig Topperb45acb82014-03-14 06:02:07 +0000441 bool hasIntegratedCPP() const override { return false; }
442 bool isLinkJob() const override { return true; }
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000443
Craig Topperb45acb82014-03-14 06:02:07 +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;
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000448 };
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000449} // end namespace freebsd
450
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000451 /// netbsd -- Directly call GNU Binutils assembler and linker
452namespace netbsd {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000453 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Joerg Sonnenberger637603a2011-05-16 13:35:02 +0000454
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000455 public:
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +0000456 Assemble(const ToolChain &TC)
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000457 : GnuTool("netbsd::Assemble", "assembler", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000458
Craig Topperb45acb82014-03-14 06:02:07 +0000459 bool hasIntegratedCPP() const override { return false; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000460
Craig Topperb45acb82014-03-14 06:02:07 +0000461 void ConstructJob(Compilation &C, const JobAction &JA,
462 const InputInfo &Output, const InputInfoList &Inputs,
463 const llvm::opt::ArgList &TCArgs,
464 const char *LinkingOutput) const override;
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000465 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000466 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Joerg Sonnenberger637603a2011-05-16 13:35:02 +0000467
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000468 public:
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +0000469 Link(const ToolChain &TC)
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000470 : GnuTool("netbsd::Link", "linker", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000471
Craig Topperb45acb82014-03-14 06:02:07 +0000472 bool hasIntegratedCPP() const override { return false; }
473 bool isLinkJob() const override { return true; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000474
Craig Topperb45acb82014-03-14 06:02:07 +0000475 void ConstructJob(Compilation &C, const JobAction &JA,
476 const InputInfo &Output, const InputInfoList &Inputs,
477 const llvm::opt::ArgList &TCArgs,
478 const char *LinkingOutput) const override;
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000479 };
480} // end namespace netbsd
481
Thomas Schwinge4e555262013-03-28 19:04:25 +0000482 /// Directly call GNU Binutils' assembler and linker.
483namespace gnutools {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000484 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Rafael Espindola92b00932010-08-10 00:25:48 +0000485 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000486 Assemble(const ToolChain &TC) : GnuTool("GNU::Assemble", "assembler", TC) {}
Rafael Espindola92b00932010-08-10 00:25:48 +0000487
Craig Topperb45acb82014-03-14 06:02:07 +0000488 bool hasIntegratedCPP() const override { return false; }
Rafael Espindola92b00932010-08-10 00:25:48 +0000489
Craig Topperb45acb82014-03-14 06:02:07 +0000490 void ConstructJob(Compilation &C, const JobAction &JA,
491 const InputInfo &Output,
492 const InputInfoList &Inputs,
493 const llvm::opt::ArgList &TCArgs,
494 const char *LinkingOutput) const override;
Rafael Espindola92b00932010-08-10 00:25:48 +0000495 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000496 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000497 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000498 Link(const ToolChain &TC) : GnuTool("GNU::Link", "linker", TC) {}
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000499
Craig Topperb45acb82014-03-14 06:02:07 +0000500 bool hasIntegratedCPP() const override { return false; }
501 bool isLinkJob() const override { return true; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000502
Craig Topperb45acb82014-03-14 06:02:07 +0000503 void ConstructJob(Compilation &C, const JobAction &JA,
504 const InputInfo &Output,
505 const InputInfoList &Inputs,
506 const llvm::opt::ArgList &TCArgs,
507 const char *LinkingOutput) const override;
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000508 };
Rafael Espindola92b00932010-08-10 00:25:48 +0000509}
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000510
511namespace nacltools {
512 class LLVM_LIBRARY_VISIBILITY AssembleARM : public gnutools::Assemble {
513 public:
514 AssembleARM(const ToolChain &TC) : gnutools::Assemble(TC) {}
515
516 void ConstructJob(Compilation &C, const JobAction &JA,
517 const InputInfo &Output,
518 const InputInfoList &Inputs,
519 const llvm::opt::ArgList &TCArgs,
520 const char *LinkingOutput) const override;
521 };
522 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
523 public:
524 Link(const ToolChain &TC) : Tool("NaCl::Link", "linker", TC) {}
525
526 bool hasIntegratedCPP() const override { return false; }
527 bool isLinkJob() const override { return true; }
528
529 void ConstructJob(Compilation &C, const JobAction &JA,
530 const InputInfo &Output,
531 const InputInfoList &Inputs,
532 const llvm::opt::ArgList &TCArgs,
533 const char *LinkingOutput) const override;
534 };
535}
536
Chris Lattner3e2ee142010-07-07 16:01:42 +0000537 /// minix -- Directly call GNU Binutils assembler and linker
538namespace minix {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000539 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000540 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000541 Assemble(const ToolChain &TC) : GnuTool("minix::Assemble", "assembler",
Chris Lattner3e2ee142010-07-07 16:01:42 +0000542 TC) {}
543
Craig Topperb45acb82014-03-14 06:02:07 +0000544 bool hasIntegratedCPP() const override { return false; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000545
Craig Topperb45acb82014-03-14 06:02:07 +0000546 void ConstructJob(Compilation &C, const JobAction &JA,
547 const InputInfo &Output,
548 const InputInfoList &Inputs,
549 const llvm::opt::ArgList &TCArgs,
550 const char *LinkingOutput) const override;
Chris Lattner3e2ee142010-07-07 16:01:42 +0000551 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000552 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000553 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000554 Link(const ToolChain &TC) : GnuTool("minix::Link", "linker", TC) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000555
Craig Topperb45acb82014-03-14 06:02:07 +0000556 bool hasIntegratedCPP() const override { return false; }
557 bool isLinkJob() const override { return true; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000558
Craig Topperb45acb82014-03-14 06:02:07 +0000559 void ConstructJob(Compilation &C, const JobAction &JA,
560 const InputInfo &Output,
561 const InputInfoList &Inputs,
562 const llvm::opt::ArgList &TCArgs,
563 const char *LinkingOutput) const override;
Chris Lattner3e2ee142010-07-07 16:01:42 +0000564 };
565} // end namespace minix
566
David Chisnallf571cde2012-02-15 13:39:01 +0000567 /// solaris -- Directly call Solaris assembler and linker
568namespace solaris {
569 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
570 public:
571 Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
572 TC) {}
573
Craig Topperb45acb82014-03-14 06:02:07 +0000574 bool hasIntegratedCPP() const override { return false; }
David Chisnallf571cde2012-02-15 13:39:01 +0000575
Craig Topperb45acb82014-03-14 06:02:07 +0000576 void ConstructJob(Compilation &C, const JobAction &JA,
577 const InputInfo &Output, const InputInfoList &Inputs,
578 const llvm::opt::ArgList &TCArgs,
579 const char *LinkingOutput) const override;
David Chisnallf571cde2012-02-15 13:39:01 +0000580 };
581 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
582 public:
583 Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
584
Craig Topperb45acb82014-03-14 06:02:07 +0000585 bool hasIntegratedCPP() const override { return false; }
586 bool isLinkJob() const override { return true; }
David Chisnallf571cde2012-02-15 13:39:01 +0000587
Craig Topperb45acb82014-03-14 06:02:07 +0000588 void ConstructJob(Compilation &C, const JobAction &JA,
589 const InputInfo &Output, const InputInfoList &Inputs,
590 const llvm::opt::ArgList &TCArgs,
591 const char *LinkingOutput) const override;
David Chisnallf571cde2012-02-15 13:39:01 +0000592 };
David Chisnalla9ed5d72012-02-15 16:25:46 +0000593} // end namespace solaris
David Chisnallf571cde2012-02-15 13:39:01 +0000594
Daniel Dunbarcc912342009-05-02 18:28:39 +0000595 /// dragonfly -- Directly call GNU Binutils assembler and linker
596namespace dragonfly {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000597 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Daniel Dunbarcc912342009-05-02 18:28:39 +0000598 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000599 Assemble(const ToolChain &TC) : GnuTool("dragonfly::Assemble", "assembler",
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000600 TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000601
Craig Topperb45acb82014-03-14 06:02:07 +0000602 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000603
Craig Topperb45acb82014-03-14 06:02:07 +0000604 void ConstructJob(Compilation &C, const JobAction &JA,
605 const InputInfo &Output, const InputInfoList &Inputs,
606 const llvm::opt::ArgList &TCArgs,
607 const char *LinkingOutput) const override;
Daniel Dunbarcc912342009-05-02 18:28:39 +0000608 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000609 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Daniel Dunbarcc912342009-05-02 18:28:39 +0000610 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000611 Link(const ToolChain &TC) : GnuTool("dragonfly::Link", "linker", TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000612
Craig Topperb45acb82014-03-14 06:02:07 +0000613 bool hasIntegratedCPP() const override { return false; }
614 bool isLinkJob() const override { return true; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000615
Craig Topperb45acb82014-03-14 06:02:07 +0000616 void ConstructJob(Compilation &C, const JobAction &JA,
617 const InputInfo &Output,
618 const InputInfoList &Inputs,
619 const llvm::opt::ArgList &TCArgs,
620 const char *LinkingOutput) const override;
Daniel Dunbarcc912342009-05-02 18:28:39 +0000621 };
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000622} // end namespace dragonfly
Daniel Dunbarcc912342009-05-02 18:28:39 +0000623
Hans Wennborg1da044a2014-06-26 19:59:02 +0000624/// Visual studio tools.
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000625namespace visualstudio {
Hans Wennborg87cfa712013-09-19 20:32:16 +0000626 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000627 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000628 Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC,
629 RF_Full, llvm::sys::WEM_UTF16) {}
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000630
Craig Topperb45acb82014-03-14 06:02:07 +0000631 bool hasIntegratedCPP() const override { return false; }
632 bool isLinkJob() const override { return true; }
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000633
Craig Topperb45acb82014-03-14 06:02:07 +0000634 void ConstructJob(Compilation &C, const JobAction &JA,
635 const InputInfo &Output, const InputInfoList &Inputs,
636 const llvm::opt::ArgList &TCArgs,
637 const char *LinkingOutput) const override;
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000638 };
Hans Wennborg87cfa712013-09-19 20:32:16 +0000639
640 class LLVM_LIBRARY_VISIBILITY Compile : public Tool {
641 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000642 Compile(const ToolChain &TC) : Tool("visualstudio::Compile", "compiler", TC,
643 RF_Full, llvm::sys::WEM_UTF16) {}
Hans Wennborg87cfa712013-09-19 20:32:16 +0000644
Craig Topperb45acb82014-03-14 06:02:07 +0000645 bool hasIntegratedAssembler() const override { return true; }
646 bool hasIntegratedCPP() const override { return true; }
647 bool isLinkJob() const override { return false; }
Hans Wennborg87cfa712013-09-19 20:32:16 +0000648
Craig Topperb45acb82014-03-14 06:02:07 +0000649 void ConstructJob(Compilation &C, const JobAction &JA,
650 const InputInfo &Output, const InputInfoList &Inputs,
651 const llvm::opt::ArgList &TCArgs,
652 const char *LinkingOutput) const override;
Hans Wennborg87cfa712013-09-19 20:32:16 +0000653
David Blaikiec11bf802014-09-04 16:04:28 +0000654 std::unique_ptr<Command> GetCommand(Compilation &C, const JobAction &JA,
655 const InputInfo &Output,
656 const InputInfoList &Inputs,
657 const llvm::opt::ArgList &TCArgs,
658 const char *LinkingOutput) const;
Hans Wennborg87cfa712013-09-19 20:32:16 +0000659 };
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000660} // end namespace visualstudio
661
Tim Northover9c7e0352013-12-12 11:55:52 +0000662namespace arm {
663 StringRef getARMFloatABI(const Driver &D, const llvm::opt::ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000664 const llvm::Triple &Triple);
Tim Northover9c7e0352013-12-12 11:55:52 +0000665}
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000666namespace XCore {
667 // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
668 // We simply use "clang -cc1" for those actions.
669 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
670 public:
671 Assemble(const ToolChain &TC) : Tool("XCore::Assemble",
672 "XCore-as", TC) {}
673
Craig Topperb45acb82014-03-14 06:02:07 +0000674 bool hasIntegratedCPP() const override { return false; }
675 void ConstructJob(Compilation &C, const JobAction &JA,
676 const InputInfo &Output, const InputInfoList &Inputs,
677 const llvm::opt::ArgList &TCArgs,
678 const char *LinkingOutput) const override;
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000679 };
680
681 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
682 public:
683 Link(const ToolChain &TC) : Tool("XCore::Link",
684 "XCore-ld", TC) {}
685
Craig Topperb45acb82014-03-14 06:02:07 +0000686 bool hasIntegratedCPP() const override { return false; }
687 bool isLinkJob() const override { return true; }
688 void ConstructJob(Compilation &C, const JobAction &JA,
689 const InputInfo &Output, const InputInfoList &Inputs,
690 const llvm::opt::ArgList &TCArgs,
691 const char *LinkingOutput) const override;
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000692 };
693} // end namespace XCore.
694
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000695namespace CrossWindows {
696class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
697public:
698 Assemble(const ToolChain &TC) : Tool("CrossWindows::Assemble", "as", TC) { }
699
700 bool hasIntegratedCPP() const override { return false; }
701
702 void ConstructJob(Compilation &C, const JobAction &JA,
703 const InputInfo &Output, const InputInfoList &Inputs,
704 const llvm::opt::ArgList &TCArgs,
705 const char *LinkingOutput) const override;
706};
707
708class LLVM_LIBRARY_VISIBILITY Link : public Tool {
709public:
710 Link(const ToolChain &TC) : Tool("CrossWindows::Link", "ld", TC, RF_Full) {}
711
712 bool hasIntegratedCPP() const override { return false; }
713 bool isLinkJob() const override { return true; }
714
715 void ConstructJob(Compilation &C, const JobAction &JA,
716 const InputInfo &Output, const InputInfoList &Inputs,
717 const llvm::opt::ArgList &TCArgs,
718 const char *LinkingOutput) const override;
719};
720}
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000721
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000722} // end namespace toolchains
723} // end namespace driver
724} // end namespace clang
725
Benjamin Kramer2f5db8b2014-08-13 16:25:19 +0000726#endif