blob: 1d5155285c3a3565c7fb98d0650db50c0f9cb8e5 [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,
Artem Belevichba558952015-05-06 18:20:23 +000043 const InputInfo &Input);
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 {
Gabor Ballabas208826c2015-06-04 17:56:32 +0000227 std::string getARMTargetCPU(const llvm::opt::ArgList &Args,
228 const llvm::Triple &Triple);
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000229 const StringRef getARMArch(const llvm::opt::ArgList &Args,
230 const llvm::Triple &Triple);
Bernard Ogden31561762013-12-12 13:27:11 +0000231 const char* getARMCPUForMArch(const llvm::opt::ArgList &Args,
232 const llvm::Triple &Triple);
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000233 const char* getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +0000234
235 void appendEBLinkFlags(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple);
Bernard Ogden31561762013-12-12 13:27:11 +0000236}
Tony Linthicum76329bf2011-12-12 21:14:55 +0000237
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000238namespace mips {
Petar Jovanovic1dbc3172015-04-14 12:49:08 +0000239 typedef enum {
240 NanLegacy = 1,
241 Nan2008 = 2
242 } NanEncoding;
243 NanEncoding getSupportedNanEncoding(StringRef &CPU);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +0000244 void getMipsCPUAndABI(const llvm::opt::ArgList &Args,
245 const llvm::Triple &Triple, StringRef &CPUName,
246 StringRef &ABIName);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000247 bool hasMipsAbiArg(const llvm::opt::ArgList &Args, const char *Value);
Simon Atanasyand95c67d2014-08-13 14:34:14 +0000248 bool isUCLibc(const llvm::opt::ArgList &Args);
Daniel Sanders2bf13662014-07-10 14:40:57 +0000249 bool isNaN2008(const llvm::opt::ArgList &Args, const llvm::Triple &Triple);
Daniel Sanders379d44b2014-07-16 11:52:23 +0000250 bool isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
251 StringRef ABIName);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000252}
253
Ulrich Weigand8afad612014-07-28 13:17:52 +0000254namespace ppc {
255 bool hasPPCAbiArg(const llvm::opt::ArgList &Args, const char *Value);
256}
257
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000258 /// cloudabi -- Directly call GNU Binutils linker
259namespace cloudabi {
260class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
261public:
262 Link(const ToolChain &TC) : GnuTool("cloudabi::Link", "linker", TC) {}
263
264 bool hasIntegratedCPP() const override { return false; }
265 bool isLinkJob() const override { return true; }
266
267 void ConstructJob(Compilation &C, const JobAction &JA,
268 const InputInfo &Output, const InputInfoList &Inputs,
269 const llvm::opt::ArgList &TCArgs,
270 const char *LinkingOutput) const override;
271};
272} // end namespace cloudabi
273
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000274namespace darwin {
Tim Northover157d9112014-01-16 08:48:16 +0000275 llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
276 void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
Rafael Espindoladcbf6982012-10-31 18:51:07 +0000277
Tim Northover157d9112014-01-16 08:48:16 +0000278 class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
David Blaikie68e081d2011-12-20 02:48:34 +0000279 virtual void anchor();
Daniel Dunbare9ded432009-09-09 18:36:20 +0000280 protected:
Tim Northover157d9112014-01-16 08:48:16 +0000281 void AddMachOArch(const llvm::opt::ArgList &Args,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000282 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbare9ded432009-09-09 18:36:20 +0000283
Tim Northover157d9112014-01-16 08:48:16 +0000284 const toolchains::MachO &getMachOToolChain() const {
285 return reinterpret_cast<const toolchains::MachO&>(getToolChain());
Daniel Dunbare9ded432009-09-09 18:36:20 +0000286 }
287
288 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000289 MachOTool(
290 const char *Name, const char *ShortName, const ToolChain &TC,
291 ResponseFileSupport ResponseSupport = RF_None,
292 llvm::sys::WindowsEncodingMethod ResponseEncoding = llvm::sys::WEM_UTF8,
293 const char *ResponseFlag = "@")
294 : Tool(Name, ShortName, TC, ResponseSupport, ResponseEncoding,
295 ResponseFlag) {}
Daniel Dunbare9ded432009-09-09 18:36:20 +0000296 };
297
Tim Northover157d9112014-01-16 08:48:16 +0000298 class LLVM_LIBRARY_VISIBILITY Assemble : public MachOTool {
Daniel Dunbarbe220842009-03-20 16:06:39 +0000299 public:
Tim Northover157d9112014-01-16 08:48:16 +0000300 Assemble(const ToolChain &TC) : MachOTool("darwin::Assemble",
301 "assembler", TC) {}
Daniel Dunbarbe220842009-03-20 16:06:39 +0000302
Craig Topperb45acb82014-03-14 06:02:07 +0000303 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarbe220842009-03-20 16:06:39 +0000304
Craig Topperb45acb82014-03-14 06:02:07 +0000305 void ConstructJob(Compilation &C, const JobAction &JA,
306 const InputInfo &Output, const InputInfoList &Inputs,
307 const llvm::opt::ArgList &TCArgs,
308 const char *LinkingOutput) const override;
Daniel Dunbarbe220842009-03-20 16:06:39 +0000309 };
310
Tim Northover157d9112014-01-16 08:48:16 +0000311 class LLVM_LIBRARY_VISIBILITY Link : public MachOTool {
Bill Wendling3b2000f2012-10-02 18:02:50 +0000312 bool NeedsTempPath(const InputInfoList &Inputs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +0000313 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
314 llvm::opt::ArgStringList &CmdArgs,
315 const InputInfoList &Inputs) const;
Daniel Dunbarc1964212009-03-26 16:23:12 +0000316
Daniel Dunbarc1964212009-03-26 16:23:12 +0000317 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000318 Link(const ToolChain &TC) : MachOTool("darwin::Link", "linker", TC,
319 RF_FileList, llvm::sys::WEM_UTF8,
320 "-filelist") {}
Daniel Dunbarc1964212009-03-26 16:23:12 +0000321
Craig Topperb45acb82014-03-14 06:02:07 +0000322 bool hasIntegratedCPP() const override { return false; }
323 bool isLinkJob() const override { return true; }
Daniel Dunbarc1964212009-03-26 16:23:12 +0000324
Craig Topperb45acb82014-03-14 06:02:07 +0000325 void ConstructJob(Compilation &C, const JobAction &JA,
326 const InputInfo &Output, const InputInfoList &Inputs,
327 const llvm::opt::ArgList &TCArgs,
328 const char *LinkingOutput) const override;
Daniel Dunbarc1964212009-03-26 16:23:12 +0000329 };
330
Tim Northover157d9112014-01-16 08:48:16 +0000331 class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000332 public:
Tim Northover157d9112014-01-16 08:48:16 +0000333 Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000334
Craig Topperb45acb82014-03-14 06:02:07 +0000335 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000336
Craig Topperb45acb82014-03-14 06:02:07 +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;
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000341 };
Daniel Dunbar88299622010-06-04 18:28:36 +0000342
Tim Northover157d9112014-01-16 08:48:16 +0000343 class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool {
Daniel Dunbar88299622010-06-04 18:28:36 +0000344 public:
Tim Northover157d9112014-01-16 08:48:16 +0000345 Dsymutil(const ToolChain &TC) : MachOTool("darwin::Dsymutil",
346 "dsymutil", TC) {}
Daniel Dunbar88299622010-06-04 18:28:36 +0000347
Craig Topperb45acb82014-03-14 06:02:07 +0000348 bool hasIntegratedCPP() const override { return false; }
349 bool isDsymutilJob() const override { return true; }
Daniel Dunbar88299622010-06-04 18:28:36 +0000350
Craig Topperb45acb82014-03-14 06:02:07 +0000351 void ConstructJob(Compilation &C, const JobAction &JA,
352 const InputInfo &Output,
353 const InputInfoList &Inputs,
354 const llvm::opt::ArgList &TCArgs,
355 const char *LinkingOutput) const override;
Daniel Dunbar88299622010-06-04 18:28:36 +0000356 };
Eric Christopher551ef452011-08-23 17:56:55 +0000357
Tim Northover157d9112014-01-16 08:48:16 +0000358 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool {
Eric Christopher551ef452011-08-23 17:56:55 +0000359 public:
Tim Northover157d9112014-01-16 08:48:16 +0000360 VerifyDebug(const ToolChain &TC) : MachOTool("darwin::VerifyDebug",
361 "dwarfdump", TC) {}
Eric Christopher551ef452011-08-23 17:56:55 +0000362
Craig Topperb45acb82014-03-14 06:02:07 +0000363 bool hasIntegratedCPP() const override { return false; }
Eric Christopher551ef452011-08-23 17:56:55 +0000364
Craig Topperb45acb82014-03-14 06:02:07 +0000365 void ConstructJob(Compilation &C, const JobAction &JA,
366 const InputInfo &Output, const InputInfoList &Inputs,
367 const llvm::opt::ArgList &TCArgs,
368 const char *LinkingOutput) const override;
Eric Christopher551ef452011-08-23 17:56:55 +0000369 };
370
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000371}
372
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000373 /// openbsd -- Directly call GNU Binutils assembler and linker
374namespace openbsd {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000375 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000376 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000377 Assemble(const ToolChain &TC) : GnuTool("openbsd::Assemble", "assembler",
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000378 TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000379
Craig Topperb45acb82014-03-14 06:02:07 +0000380 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000381
Craig Topperb45acb82014-03-14 06:02:07 +0000382 void ConstructJob(Compilation &C, const JobAction &JA,
383 const InputInfo &Output,
384 const InputInfoList &Inputs,
385 const llvm::opt::ArgList &TCArgs,
386 const char *LinkingOutput) const override;
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000387 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000388 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000389 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000390 Link(const ToolChain &TC) : GnuTool("openbsd::Link", "linker", TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000391
Craig Topperb45acb82014-03-14 06:02:07 +0000392 bool hasIntegratedCPP() const override { return false; }
393 bool isLinkJob() const override { return true; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000394
Craig Topperb45acb82014-03-14 06:02:07 +0000395 void ConstructJob(Compilation &C, const JobAction &JA,
396 const InputInfo &Output, const InputInfoList &Inputs,
397 const llvm::opt::ArgList &TCArgs,
398 const char *LinkingOutput) const override;
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000399 };
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000400} // end namespace openbsd
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000401
Eli Friedman9fa28852012-08-08 23:57:20 +0000402 /// bitrig -- Directly call GNU Binutils assembler and linker
403namespace bitrig {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000404 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Eli Friedman9fa28852012-08-08 23:57:20 +0000405 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000406 Assemble(const ToolChain &TC) : GnuTool("bitrig::Assemble", "assembler",
Eli Friedman9fa28852012-08-08 23:57:20 +0000407 TC) {}
408
Craig Topperb45acb82014-03-14 06:02:07 +0000409 bool hasIntegratedCPP() const override { return false; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000410
Craig Topperb45acb82014-03-14 06:02:07 +0000411 void ConstructJob(Compilation &C, const JobAction &JA,
412 const InputInfo &Output, const InputInfoList &Inputs,
413 const llvm::opt::ArgList &TCArgs,
414 const char *LinkingOutput) const override;
Eli Friedman9fa28852012-08-08 23:57:20 +0000415 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000416 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Eli Friedman9fa28852012-08-08 23:57:20 +0000417 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000418 Link(const ToolChain &TC) : GnuTool("bitrig::Link", "linker", TC) {}
Eli Friedman9fa28852012-08-08 23:57:20 +0000419
Craig Topperb45acb82014-03-14 06:02:07 +0000420 bool hasIntegratedCPP() const override { return false; }
421 bool isLinkJob() const override { return true; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000422
Craig Topperb45acb82014-03-14 06:02:07 +0000423 void ConstructJob(Compilation &C, const JobAction &JA,
424 const InputInfo &Output, const InputInfoList &Inputs,
425 const llvm::opt::ArgList &TCArgs,
426 const char *LinkingOutput) const override;
Eli Friedman9fa28852012-08-08 23:57:20 +0000427 };
428} // end namespace bitrig
429
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000430 /// freebsd -- Directly call GNU Binutils assembler and linker
431namespace freebsd {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000432 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000433 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000434 Assemble(const ToolChain &TC) : GnuTool("freebsd::Assemble", "assembler",
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000435 TC) {}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000436
Craig Topperb45acb82014-03-14 06:02:07 +0000437 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000438
Craig Topperb45acb82014-03-14 06:02:07 +0000439 void ConstructJob(Compilation &C, const JobAction &JA,
440 const InputInfo &Output, const InputInfoList &Inputs,
441 const llvm::opt::ArgList &TCArgs,
442 const char *LinkingOutput) const override;
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000443 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000444 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000445 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000446 Link(const ToolChain &TC) : GnuTool("freebsd::Link", "linker", TC) {}
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000447
Craig Topperb45acb82014-03-14 06:02:07 +0000448 bool hasIntegratedCPP() const override { return false; }
449 bool isLinkJob() const override { return true; }
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000450
Craig Topperb45acb82014-03-14 06:02:07 +0000451 void ConstructJob(Compilation &C, const JobAction &JA,
452 const InputInfo &Output, const InputInfoList &Inputs,
453 const llvm::opt::ArgList &TCArgs,
454 const char *LinkingOutput) const override;
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000455 };
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000456} // end namespace freebsd
457
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000458 /// netbsd -- Directly call GNU Binutils assembler and linker
459namespace netbsd {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000460 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Joerg Sonnenberger637603a2011-05-16 13:35:02 +0000461
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000462 public:
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +0000463 Assemble(const ToolChain &TC)
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000464 : GnuTool("netbsd::Assemble", "assembler", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000465
Craig Topperb45acb82014-03-14 06:02:07 +0000466 bool hasIntegratedCPP() const override { return false; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000467
Craig Topperb45acb82014-03-14 06:02:07 +0000468 void ConstructJob(Compilation &C, const JobAction &JA,
469 const InputInfo &Output, const InputInfoList &Inputs,
470 const llvm::opt::ArgList &TCArgs,
471 const char *LinkingOutput) const override;
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000472 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000473 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Joerg Sonnenberger637603a2011-05-16 13:35:02 +0000474
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000475 public:
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +0000476 Link(const ToolChain &TC)
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000477 : GnuTool("netbsd::Link", "linker", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000478
Craig Topperb45acb82014-03-14 06:02:07 +0000479 bool hasIntegratedCPP() const override { return false; }
480 bool isLinkJob() const override { return true; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000481
Craig Topperb45acb82014-03-14 06:02:07 +0000482 void ConstructJob(Compilation &C, const JobAction &JA,
483 const InputInfo &Output, const InputInfoList &Inputs,
484 const llvm::opt::ArgList &TCArgs,
485 const char *LinkingOutput) const override;
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000486 };
487} // end namespace netbsd
488
Thomas Schwinge4e555262013-03-28 19:04:25 +0000489 /// Directly call GNU Binutils' assembler and linker.
490namespace gnutools {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000491 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Rafael Espindola92b00932010-08-10 00:25:48 +0000492 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000493 Assemble(const ToolChain &TC) : GnuTool("GNU::Assemble", "assembler", TC) {}
Rafael Espindola92b00932010-08-10 00:25:48 +0000494
Craig Topperb45acb82014-03-14 06:02:07 +0000495 bool hasIntegratedCPP() const override { return false; }
Rafael Espindola92b00932010-08-10 00:25:48 +0000496
Craig Topperb45acb82014-03-14 06:02:07 +0000497 void ConstructJob(Compilation &C, const JobAction &JA,
498 const InputInfo &Output,
499 const InputInfoList &Inputs,
500 const llvm::opt::ArgList &TCArgs,
501 const char *LinkingOutput) const override;
Rafael Espindola92b00932010-08-10 00:25:48 +0000502 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000503 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000504 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000505 Link(const ToolChain &TC) : GnuTool("GNU::Link", "linker", TC) {}
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000506
Craig Topperb45acb82014-03-14 06:02:07 +0000507 bool hasIntegratedCPP() const override { return false; }
508 bool isLinkJob() const override { return true; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000509
Craig Topperb45acb82014-03-14 06:02:07 +0000510 void ConstructJob(Compilation &C, const JobAction &JA,
511 const InputInfo &Output,
512 const InputInfoList &Inputs,
513 const llvm::opt::ArgList &TCArgs,
514 const char *LinkingOutput) const override;
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000515 };
Rafael Espindola92b00932010-08-10 00:25:48 +0000516}
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000517
518namespace nacltools {
519 class LLVM_LIBRARY_VISIBILITY AssembleARM : public gnutools::Assemble {
520 public:
521 AssembleARM(const ToolChain &TC) : gnutools::Assemble(TC) {}
522
523 void ConstructJob(Compilation &C, const JobAction &JA,
524 const InputInfo &Output,
525 const InputInfoList &Inputs,
526 const llvm::opt::ArgList &TCArgs,
527 const char *LinkingOutput) const override;
528 };
529 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
530 public:
531 Link(const ToolChain &TC) : Tool("NaCl::Link", "linker", TC) {}
532
533 bool hasIntegratedCPP() const override { return false; }
534 bool isLinkJob() const override { return true; }
535
536 void ConstructJob(Compilation &C, const JobAction &JA,
537 const InputInfo &Output,
538 const InputInfoList &Inputs,
539 const llvm::opt::ArgList &TCArgs,
540 const char *LinkingOutput) const override;
541 };
542}
543
Chris Lattner3e2ee142010-07-07 16:01:42 +0000544 /// minix -- Directly call GNU Binutils assembler and linker
545namespace minix {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000546 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000547 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000548 Assemble(const ToolChain &TC) : GnuTool("minix::Assemble", "assembler",
Chris Lattner3e2ee142010-07-07 16:01:42 +0000549 TC) {}
550
Craig Topperb45acb82014-03-14 06:02:07 +0000551 bool hasIntegratedCPP() const override { return false; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000552
Craig Topperb45acb82014-03-14 06:02:07 +0000553 void ConstructJob(Compilation &C, const JobAction &JA,
554 const InputInfo &Output,
555 const InputInfoList &Inputs,
556 const llvm::opt::ArgList &TCArgs,
557 const char *LinkingOutput) const override;
Chris Lattner3e2ee142010-07-07 16:01:42 +0000558 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000559 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000560 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000561 Link(const ToolChain &TC) : GnuTool("minix::Link", "linker", TC) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000562
Craig Topperb45acb82014-03-14 06:02:07 +0000563 bool hasIntegratedCPP() const override { return false; }
564 bool isLinkJob() const override { return true; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000565
Craig Topperb45acb82014-03-14 06:02:07 +0000566 void ConstructJob(Compilation &C, const JobAction &JA,
567 const InputInfo &Output,
568 const InputInfoList &Inputs,
569 const llvm::opt::ArgList &TCArgs,
570 const char *LinkingOutput) const override;
Chris Lattner3e2ee142010-07-07 16:01:42 +0000571 };
572} // end namespace minix
573
David Chisnallf571cde2012-02-15 13:39:01 +0000574 /// solaris -- Directly call Solaris assembler and linker
575namespace solaris {
576 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
577 public:
578 Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
579 TC) {}
580
Craig Topperb45acb82014-03-14 06:02:07 +0000581 bool hasIntegratedCPP() const override { return false; }
David Chisnallf571cde2012-02-15 13:39:01 +0000582
Craig Topperb45acb82014-03-14 06:02:07 +0000583 void ConstructJob(Compilation &C, const JobAction &JA,
584 const InputInfo &Output, const InputInfoList &Inputs,
585 const llvm::opt::ArgList &TCArgs,
586 const char *LinkingOutput) const override;
David Chisnallf571cde2012-02-15 13:39:01 +0000587 };
588 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
589 public:
590 Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
591
Craig Topperb45acb82014-03-14 06:02:07 +0000592 bool hasIntegratedCPP() const override { return false; }
593 bool isLinkJob() const override { return true; }
David Chisnallf571cde2012-02-15 13:39:01 +0000594
Craig Topperb45acb82014-03-14 06:02:07 +0000595 void ConstructJob(Compilation &C, const JobAction &JA,
596 const InputInfo &Output, const InputInfoList &Inputs,
597 const llvm::opt::ArgList &TCArgs,
598 const char *LinkingOutput) const override;
David Chisnallf571cde2012-02-15 13:39:01 +0000599 };
David Chisnalla9ed5d72012-02-15 16:25:46 +0000600} // end namespace solaris
David Chisnallf571cde2012-02-15 13:39:01 +0000601
Daniel Dunbarcc912342009-05-02 18:28:39 +0000602 /// dragonfly -- Directly call GNU Binutils assembler and linker
603namespace dragonfly {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000604 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Daniel Dunbarcc912342009-05-02 18:28:39 +0000605 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000606 Assemble(const ToolChain &TC) : GnuTool("dragonfly::Assemble", "assembler",
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000607 TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000608
Craig Topperb45acb82014-03-14 06:02:07 +0000609 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000610
Craig Topperb45acb82014-03-14 06:02:07 +0000611 void ConstructJob(Compilation &C, const JobAction &JA,
612 const InputInfo &Output, const InputInfoList &Inputs,
613 const llvm::opt::ArgList &TCArgs,
614 const char *LinkingOutput) const override;
Daniel Dunbarcc912342009-05-02 18:28:39 +0000615 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000616 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Daniel Dunbarcc912342009-05-02 18:28:39 +0000617 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000618 Link(const ToolChain &TC) : GnuTool("dragonfly::Link", "linker", TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000619
Craig Topperb45acb82014-03-14 06:02:07 +0000620 bool hasIntegratedCPP() const override { return false; }
621 bool isLinkJob() const override { return true; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000622
Craig Topperb45acb82014-03-14 06:02:07 +0000623 void ConstructJob(Compilation &C, const JobAction &JA,
624 const InputInfo &Output,
625 const InputInfoList &Inputs,
626 const llvm::opt::ArgList &TCArgs,
627 const char *LinkingOutput) const override;
Daniel Dunbarcc912342009-05-02 18:28:39 +0000628 };
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000629} // end namespace dragonfly
Daniel Dunbarcc912342009-05-02 18:28:39 +0000630
Hans Wennborg1da044a2014-06-26 19:59:02 +0000631/// Visual studio tools.
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000632namespace visualstudio {
Hans Wennborg87cfa712013-09-19 20:32:16 +0000633 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000634 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000635 Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC,
636 RF_Full, llvm::sys::WEM_UTF16) {}
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000637
Craig Topperb45acb82014-03-14 06:02:07 +0000638 bool hasIntegratedCPP() const override { return false; }
639 bool isLinkJob() const override { return true; }
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000640
Craig Topperb45acb82014-03-14 06:02:07 +0000641 void ConstructJob(Compilation &C, const JobAction &JA,
642 const InputInfo &Output, const InputInfoList &Inputs,
643 const llvm::opt::ArgList &TCArgs,
644 const char *LinkingOutput) const override;
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000645 };
Hans Wennborg87cfa712013-09-19 20:32:16 +0000646
647 class LLVM_LIBRARY_VISIBILITY Compile : public Tool {
648 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000649 Compile(const ToolChain &TC) : Tool("visualstudio::Compile", "compiler", TC,
650 RF_Full, llvm::sys::WEM_UTF16) {}
Hans Wennborg87cfa712013-09-19 20:32:16 +0000651
Craig Topperb45acb82014-03-14 06:02:07 +0000652 bool hasIntegratedAssembler() const override { return true; }
653 bool hasIntegratedCPP() const override { return true; }
654 bool isLinkJob() const override { return false; }
Hans Wennborg87cfa712013-09-19 20:32:16 +0000655
Craig Topperb45acb82014-03-14 06:02:07 +0000656 void ConstructJob(Compilation &C, const JobAction &JA,
657 const InputInfo &Output, const InputInfoList &Inputs,
658 const llvm::opt::ArgList &TCArgs,
659 const char *LinkingOutput) const override;
Hans Wennborg87cfa712013-09-19 20:32:16 +0000660
David Blaikiec11bf802014-09-04 16:04:28 +0000661 std::unique_ptr<Command> GetCommand(Compilation &C, const JobAction &JA,
662 const InputInfo &Output,
663 const InputInfoList &Inputs,
664 const llvm::opt::ArgList &TCArgs,
665 const char *LinkingOutput) const;
Hans Wennborg87cfa712013-09-19 20:32:16 +0000666 };
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000667} // end namespace visualstudio
668
Tim Northover9c7e0352013-12-12 11:55:52 +0000669namespace arm {
670 StringRef getARMFloatABI(const Driver &D, const llvm::opt::ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000671 const llvm::Triple &Triple);
Tim Northover9c7e0352013-12-12 11:55:52 +0000672}
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000673namespace XCore {
674 // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
675 // We simply use "clang -cc1" for those actions.
676 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
677 public:
678 Assemble(const ToolChain &TC) : Tool("XCore::Assemble",
679 "XCore-as", TC) {}
680
Craig Topperb45acb82014-03-14 06:02:07 +0000681 bool hasIntegratedCPP() const override { return false; }
682 void ConstructJob(Compilation &C, const JobAction &JA,
683 const InputInfo &Output, const InputInfoList &Inputs,
684 const llvm::opt::ArgList &TCArgs,
685 const char *LinkingOutput) const override;
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000686 };
687
688 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
689 public:
690 Link(const ToolChain &TC) : Tool("XCore::Link",
691 "XCore-ld", TC) {}
692
Craig Topperb45acb82014-03-14 06:02:07 +0000693 bool hasIntegratedCPP() const override { return false; }
694 bool isLinkJob() const override { return true; }
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;
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000699 };
700} // end namespace XCore.
701
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000702namespace CrossWindows {
703class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
704public:
705 Assemble(const ToolChain &TC) : Tool("CrossWindows::Assemble", "as", TC) { }
706
707 bool hasIntegratedCPP() const override { return false; }
708
709 void ConstructJob(Compilation &C, const JobAction &JA,
710 const InputInfo &Output, const InputInfoList &Inputs,
711 const llvm::opt::ArgList &TCArgs,
712 const char *LinkingOutput) const override;
713};
714
715class LLVM_LIBRARY_VISIBILITY Link : public Tool {
716public:
717 Link(const ToolChain &TC) : Tool("CrossWindows::Link", "ld", TC, RF_Full) {}
718
719 bool hasIntegratedCPP() const override { return false; }
720 bool isLinkJob() const override { return true; }
721
722 void ConstructJob(Compilation &C, const JobAction &JA,
723 const InputInfo &Output, const InputInfoList &Inputs,
724 const llvm::opt::ArgList &TCArgs,
725 const char *LinkingOutput) const override;
726};
727}
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000728
Douglas Katzman9dc5fbb2015-06-03 16:56:50 +0000729} // end namespace tools
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000730} // end namespace driver
731} // end namespace clang
732
Benjamin Kramer2f5db8b2014-08-13 16:25:19 +0000733#endif