blob: 6647f39ce817ffe891927c7f73f66340ab5fffd8 [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 Dunbar4f5e79c2010-05-20 21:30:13 +0000112
Craig Topperb45acb82014-03-14 06:02:07 +0000113 bool hasGoodDiagnostics() const override { return true; }
114 bool hasIntegratedAssembler() const override { return false; }
115 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000116
Craig Topperb45acb82014-03-14 06:02:07 +0000117 void ConstructJob(Compilation &C, const JobAction &JA,
118 const InputInfo &Output, const InputInfoList &Inputs,
119 const llvm::opt::ArgList &TCArgs,
120 const char *LinkingOutput) const override;
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000121 };
122
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000123 /// \brief Base class for all GNU tools that provide the same behavior when
124 /// it comes to response files support
125 class GnuTool : public Tool {
126 virtual void anchor();
127
128 public:
129 GnuTool(const char *Name, const char *ShortName, const ToolChain &TC)
130 : Tool(Name, ShortName, TC, RF_Full, llvm::sys::WEM_CurrentCodePage) {}
131 };
132
Daniel Dunbar82116f82009-03-17 22:45:24 +0000133 /// gcc - Generic GCC tool implementations.
134namespace gcc {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000135 class LLVM_LIBRARY_VISIBILITY Common : public GnuTool {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000136 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000137 Common(const char *Name, const char *ShortName,
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000138 const ToolChain &TC) : GnuTool(Name, ShortName, TC) {}
Daniel Dunbara3246a02009-03-18 08:07:30 +0000139
Craig Topperb45acb82014-03-14 06:02:07 +0000140 void ConstructJob(Compilation &C, const JobAction &JA,
141 const InputInfo &Output,
142 const InputInfoList &Inputs,
143 const llvm::opt::ArgList &TCArgs,
144 const char *LinkingOutput) const override;
Daniel Dunbara3246a02009-03-18 08:07:30 +0000145
146 /// RenderExtraToolArgs - Render any arguments necessary to force
147 /// the particular tool mode.
Reid Kleckner724c21c2013-06-17 13:59:19 +0000148 virtual void
149 RenderExtraToolArgs(const JobAction &JA,
150 llvm::opt::ArgStringList &CmdArgs) const = 0;
Daniel Dunbara3246a02009-03-18 08:07:30 +0000151 };
152
Duncan Sandsaf260b92010-05-11 20:16:05 +0000153 class LLVM_LIBRARY_VISIBILITY Preprocess : public Common {
Daniel Dunbara3246a02009-03-18 08:07:30 +0000154 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000155 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess",
156 "gcc preprocessor", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000157
Craig Topperb45acb82014-03-14 06:02:07 +0000158 bool hasGoodDiagnostics() const override { return true; }
159 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000160
Craig Topperb45acb82014-03-14 06:02:07 +0000161 void RenderExtraToolArgs(const JobAction &JA,
162 llvm::opt::ArgStringList &CmdArgs) const override;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000163 };
164
Duncan Sandsaf260b92010-05-11 20:16:05 +0000165 class LLVM_LIBRARY_VISIBILITY Compile : public Common {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000166 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000167 Compile(const ToolChain &TC) : Common("gcc::Compile",
168 "gcc frontend", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000169
Craig Topperb45acb82014-03-14 06:02:07 +0000170 bool hasGoodDiagnostics() const override { return true; }
171 bool hasIntegratedCPP() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000172
Craig Topperb45acb82014-03-14 06:02:07 +0000173 void RenderExtraToolArgs(const JobAction &JA,
174 llvm::opt::ArgStringList &CmdArgs) const override;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000175 };
176
Duncan Sandsaf260b92010-05-11 20:16:05 +0000177 class LLVM_LIBRARY_VISIBILITY Link : public Common {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000178 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000179 Link(const ToolChain &TC) : Common("gcc::Link",
180 "linker (via gcc)", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000181
Craig Topperb45acb82014-03-14 06:02:07 +0000182 bool hasIntegratedCPP() const override { return false; }
183 bool isLinkJob() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000184
Craig Topperb45acb82014-03-14 06:02:07 +0000185 void RenderExtraToolArgs(const JobAction &JA,
186 llvm::opt::ArgStringList &CmdArgs) const override;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000187 };
Daniel Dunbar82116f82009-03-17 22:45:24 +0000188} // end namespace gcc
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000189
Tony Linthicum76329bf2011-12-12 21:14:55 +0000190namespace hexagon {
191 // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
192 // We simply use "clang -cc1" for those actions.
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000193 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Tony Linthicum76329bf2011-12-12 21:14:55 +0000194 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000195 Assemble(const ToolChain &TC) : GnuTool("hexagon::Assemble",
Tony Linthicum76329bf2011-12-12 21:14:55 +0000196 "hexagon-as", TC) {}
197
Craig Topperb45acb82014-03-14 06:02:07 +0000198 bool hasIntegratedCPP() const override { return false; }
Tony Linthicum76329bf2011-12-12 21:14:55 +0000199
Craig Topperf85c6ce2014-03-14 06:06:19 +0000200 void RenderExtraToolArgs(const JobAction &JA,
201 llvm::opt::ArgStringList &CmdArgs) const;
Craig Topperb45acb82014-03-14 06:02:07 +0000202 void ConstructJob(Compilation &C, const JobAction &JA,
203 const InputInfo &Output, const InputInfoList &Inputs,
204 const llvm::opt::ArgList &TCArgs,
205 const char *LinkingOutput) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +0000206 };
207
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000208 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Tony Linthicum76329bf2011-12-12 21:14:55 +0000209 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000210 Link(const ToolChain &TC) : GnuTool("hexagon::Link",
Tony Linthicum76329bf2011-12-12 21:14:55 +0000211 "hexagon-ld", TC) {}
212
Craig Topperb45acb82014-03-14 06:02:07 +0000213 bool hasIntegratedCPP() const override { return false; }
214 bool isLinkJob() const override { return true; }
Tony Linthicum76329bf2011-12-12 21:14:55 +0000215
216 virtual void RenderExtraToolArgs(const JobAction &JA,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000217 llvm::opt::ArgStringList &CmdArgs) const;
Craig Topperb45acb82014-03-14 06:02:07 +0000218 void ConstructJob(Compilation &C, const JobAction &JA,
219 const InputInfo &Output, const InputInfoList &Inputs,
220 const llvm::opt::ArgList &TCArgs,
221 const char *LinkingOutput) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +0000222 };
223} // end namespace hexagon.
224
Bernard Ogden31561762013-12-12 13:27:11 +0000225namespace arm {
Rafael Espindola80d333b2013-12-12 15:48:19 +0000226 StringRef getARMTargetCPU(const llvm::opt::ArgList &Args,
227 const llvm::Triple &Triple);
Bernard Ogden31561762013-12-12 13:27:11 +0000228 const char* getARMCPUForMArch(const llvm::opt::ArgList &Args,
229 const llvm::Triple &Triple);
230 const char* getLLVMArchSuffixForARM(StringRef CPU);
231}
Tony Linthicum76329bf2011-12-12 21:14:55 +0000232
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000233namespace mips {
Simon Atanasyan7018e1d2014-07-16 12:29:22 +0000234 void getMipsCPUAndABI(const llvm::opt::ArgList &Args,
235 const llvm::Triple &Triple, StringRef &CPUName,
236 StringRef &ABIName);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000237 bool hasMipsAbiArg(const llvm::opt::ArgList &Args, const char *Value);
Simon Atanasyand95c67d2014-08-13 14:34:14 +0000238 bool isUCLibc(const llvm::opt::ArgList &Args);
Daniel Sanders2bf13662014-07-10 14:40:57 +0000239 bool isNaN2008(const llvm::opt::ArgList &Args, const llvm::Triple &Triple);
Daniel Sanders379d44b2014-07-16 11:52:23 +0000240 bool isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
241 StringRef ABIName);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000242}
243
Ulrich Weigand8afad612014-07-28 13:17:52 +0000244namespace ppc {
245 bool hasPPCAbiArg(const llvm::opt::ArgList &Args, const char *Value);
246}
247
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000248namespace darwin {
Tim Northover157d9112014-01-16 08:48:16 +0000249 llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
250 void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
Rafael Espindoladcbf6982012-10-31 18:51:07 +0000251
Tim Northover157d9112014-01-16 08:48:16 +0000252 class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
David Blaikie68e081d2011-12-20 02:48:34 +0000253 virtual void anchor();
Daniel Dunbare9ded432009-09-09 18:36:20 +0000254 protected:
Tim Northover157d9112014-01-16 08:48:16 +0000255 void AddMachOArch(const llvm::opt::ArgList &Args,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000256 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbare9ded432009-09-09 18:36:20 +0000257
Tim Northover157d9112014-01-16 08:48:16 +0000258 const toolchains::MachO &getMachOToolChain() const {
259 return reinterpret_cast<const toolchains::MachO&>(getToolChain());
Daniel Dunbare9ded432009-09-09 18:36:20 +0000260 }
261
262 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000263 MachOTool(
264 const char *Name, const char *ShortName, const ToolChain &TC,
265 ResponseFileSupport ResponseSupport = RF_None,
266 llvm::sys::WindowsEncodingMethod ResponseEncoding = llvm::sys::WEM_UTF8,
267 const char *ResponseFlag = "@")
268 : Tool(Name, ShortName, TC, ResponseSupport, ResponseEncoding,
269 ResponseFlag) {}
Daniel Dunbare9ded432009-09-09 18:36:20 +0000270 };
271
Tim Northover157d9112014-01-16 08:48:16 +0000272 class LLVM_LIBRARY_VISIBILITY Assemble : public MachOTool {
Daniel Dunbarbe220842009-03-20 16:06:39 +0000273 public:
Tim Northover157d9112014-01-16 08:48:16 +0000274 Assemble(const ToolChain &TC) : MachOTool("darwin::Assemble",
275 "assembler", TC) {}
Daniel Dunbarbe220842009-03-20 16:06:39 +0000276
Craig Topperb45acb82014-03-14 06:02:07 +0000277 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarbe220842009-03-20 16:06:39 +0000278
Craig Topperb45acb82014-03-14 06:02:07 +0000279 void ConstructJob(Compilation &C, const JobAction &JA,
280 const InputInfo &Output, const InputInfoList &Inputs,
281 const llvm::opt::ArgList &TCArgs,
282 const char *LinkingOutput) const override;
Daniel Dunbarbe220842009-03-20 16:06:39 +0000283 };
284
Tim Northover157d9112014-01-16 08:48:16 +0000285 class LLVM_LIBRARY_VISIBILITY Link : public MachOTool {
Bill Wendling3b2000f2012-10-02 18:02:50 +0000286 bool NeedsTempPath(const InputInfoList &Inputs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +0000287 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
288 llvm::opt::ArgStringList &CmdArgs,
289 const InputInfoList &Inputs) const;
Daniel Dunbarc1964212009-03-26 16:23:12 +0000290
Daniel Dunbarc1964212009-03-26 16:23:12 +0000291 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000292 Link(const ToolChain &TC) : MachOTool("darwin::Link", "linker", TC,
293 RF_FileList, llvm::sys::WEM_UTF8,
294 "-filelist") {}
Daniel Dunbarc1964212009-03-26 16:23:12 +0000295
Craig Topperb45acb82014-03-14 06:02:07 +0000296 bool hasIntegratedCPP() const override { return false; }
297 bool isLinkJob() const override { return true; }
Daniel Dunbarc1964212009-03-26 16:23:12 +0000298
Craig Topperb45acb82014-03-14 06:02:07 +0000299 void ConstructJob(Compilation &C, const JobAction &JA,
300 const InputInfo &Output, const InputInfoList &Inputs,
301 const llvm::opt::ArgList &TCArgs,
302 const char *LinkingOutput) const override;
Daniel Dunbarc1964212009-03-26 16:23:12 +0000303 };
304
Tim Northover157d9112014-01-16 08:48:16 +0000305 class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000306 public:
Tim Northover157d9112014-01-16 08:48:16 +0000307 Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000308
Craig Topperb45acb82014-03-14 06:02:07 +0000309 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000310
Craig Topperb45acb82014-03-14 06:02:07 +0000311 void ConstructJob(Compilation &C, const JobAction &JA,
312 const InputInfo &Output, const InputInfoList &Inputs,
313 const llvm::opt::ArgList &TCArgs,
314 const char *LinkingOutput) const override;
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000315 };
Daniel Dunbar88299622010-06-04 18:28:36 +0000316
Tim Northover157d9112014-01-16 08:48:16 +0000317 class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool {
Daniel Dunbar88299622010-06-04 18:28:36 +0000318 public:
Tim Northover157d9112014-01-16 08:48:16 +0000319 Dsymutil(const ToolChain &TC) : MachOTool("darwin::Dsymutil",
320 "dsymutil", TC) {}
Daniel Dunbar88299622010-06-04 18:28:36 +0000321
Craig Topperb45acb82014-03-14 06:02:07 +0000322 bool hasIntegratedCPP() const override { return false; }
323 bool isDsymutilJob() const override { return true; }
Daniel Dunbar88299622010-06-04 18:28:36 +0000324
Craig Topperb45acb82014-03-14 06:02:07 +0000325 void ConstructJob(Compilation &C, const JobAction &JA,
326 const InputInfo &Output,
327 const InputInfoList &Inputs,
328 const llvm::opt::ArgList &TCArgs,
329 const char *LinkingOutput) const override;
Daniel Dunbar88299622010-06-04 18:28:36 +0000330 };
Eric Christopher551ef452011-08-23 17:56:55 +0000331
Tim Northover157d9112014-01-16 08:48:16 +0000332 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool {
Eric Christopher551ef452011-08-23 17:56:55 +0000333 public:
Tim Northover157d9112014-01-16 08:48:16 +0000334 VerifyDebug(const ToolChain &TC) : MachOTool("darwin::VerifyDebug",
335 "dwarfdump", TC) {}
Eric Christopher551ef452011-08-23 17:56:55 +0000336
Craig Topperb45acb82014-03-14 06:02:07 +0000337 bool hasIntegratedCPP() const override { return false; }
Eric Christopher551ef452011-08-23 17:56:55 +0000338
Craig Topperb45acb82014-03-14 06:02:07 +0000339 void ConstructJob(Compilation &C, const JobAction &JA,
340 const InputInfo &Output, const InputInfoList &Inputs,
341 const llvm::opt::ArgList &TCArgs,
342 const char *LinkingOutput) const override;
Eric Christopher551ef452011-08-23 17:56:55 +0000343 };
344
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000345}
346
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000347 /// openbsd -- Directly call GNU Binutils assembler and linker
348namespace openbsd {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000349 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000350 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000351 Assemble(const ToolChain &TC) : GnuTool("openbsd::Assemble", "assembler",
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000352 TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000353
Craig Topperb45acb82014-03-14 06:02:07 +0000354 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000355
Craig Topperb45acb82014-03-14 06:02:07 +0000356 void ConstructJob(Compilation &C, const JobAction &JA,
357 const InputInfo &Output,
358 const InputInfoList &Inputs,
359 const llvm::opt::ArgList &TCArgs,
360 const char *LinkingOutput) const override;
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000361 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000362 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000363 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000364 Link(const ToolChain &TC) : GnuTool("openbsd::Link", "linker", TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000365
Craig Topperb45acb82014-03-14 06:02:07 +0000366 bool hasIntegratedCPP() const override { return false; }
367 bool isLinkJob() const override { return true; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000368
Craig Topperb45acb82014-03-14 06:02:07 +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;
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000373 };
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000374} // end namespace openbsd
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000375
Eli Friedman9fa28852012-08-08 23:57:20 +0000376 /// bitrig -- Directly call GNU Binutils assembler and linker
377namespace bitrig {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000378 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Eli Friedman9fa28852012-08-08 23:57:20 +0000379 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000380 Assemble(const ToolChain &TC) : GnuTool("bitrig::Assemble", "assembler",
Eli Friedman9fa28852012-08-08 23:57:20 +0000381 TC) {}
382
Craig Topperb45acb82014-03-14 06:02:07 +0000383 bool hasIntegratedCPP() const override { return false; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000384
Craig Topperb45acb82014-03-14 06:02:07 +0000385 void ConstructJob(Compilation &C, const JobAction &JA,
386 const InputInfo &Output, const InputInfoList &Inputs,
387 const llvm::opt::ArgList &TCArgs,
388 const char *LinkingOutput) const override;
Eli Friedman9fa28852012-08-08 23:57:20 +0000389 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000390 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Eli Friedman9fa28852012-08-08 23:57:20 +0000391 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000392 Link(const ToolChain &TC) : GnuTool("bitrig::Link", "linker", TC) {}
Eli Friedman9fa28852012-08-08 23:57:20 +0000393
Craig Topperb45acb82014-03-14 06:02:07 +0000394 bool hasIntegratedCPP() const override { return false; }
395 bool isLinkJob() const override { return true; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000396
Craig Topperb45acb82014-03-14 06:02:07 +0000397 void ConstructJob(Compilation &C, const JobAction &JA,
398 const InputInfo &Output, const InputInfoList &Inputs,
399 const llvm::opt::ArgList &TCArgs,
400 const char *LinkingOutput) const override;
Eli Friedman9fa28852012-08-08 23:57:20 +0000401 };
402} // end namespace bitrig
403
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000404 /// freebsd -- Directly call GNU Binutils assembler and linker
405namespace freebsd {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000406 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000407 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000408 Assemble(const ToolChain &TC) : GnuTool("freebsd::Assemble", "assembler",
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000409 TC) {}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000410
Craig Topperb45acb82014-03-14 06:02:07 +0000411 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000412
Craig Topperb45acb82014-03-14 06:02:07 +0000413 void ConstructJob(Compilation &C, const JobAction &JA,
414 const InputInfo &Output, const InputInfoList &Inputs,
415 const llvm::opt::ArgList &TCArgs,
416 const char *LinkingOutput) const override;
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000417 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000418 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000419 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000420 Link(const ToolChain &TC) : GnuTool("freebsd::Link", "linker", TC) {}
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000421
Craig Topperb45acb82014-03-14 06:02:07 +0000422 bool hasIntegratedCPP() const override { return false; }
423 bool isLinkJob() const override { return true; }
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000424
Craig Topperb45acb82014-03-14 06:02:07 +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;
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000429 };
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000430} // end namespace freebsd
431
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000432 /// netbsd -- Directly call GNU Binutils assembler and linker
433namespace netbsd {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000434 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Joerg Sonnenberger637603a2011-05-16 13:35:02 +0000435
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000436 public:
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +0000437 Assemble(const ToolChain &TC)
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000438 : GnuTool("netbsd::Assemble", "assembler", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000439
Craig Topperb45acb82014-03-14 06:02:07 +0000440 bool hasIntegratedCPP() const override { return false; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000441
Craig Topperb45acb82014-03-14 06:02:07 +0000442 void ConstructJob(Compilation &C, const JobAction &JA,
443 const InputInfo &Output, const InputInfoList &Inputs,
444 const llvm::opt::ArgList &TCArgs,
445 const char *LinkingOutput) const override;
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000446 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000447 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Joerg Sonnenberger637603a2011-05-16 13:35:02 +0000448
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000449 public:
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +0000450 Link(const ToolChain &TC)
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000451 : GnuTool("netbsd::Link", "linker", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000452
Craig Topperb45acb82014-03-14 06:02:07 +0000453 bool hasIntegratedCPP() const override { return false; }
454 bool isLinkJob() const override { return true; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000455
Craig Topperb45acb82014-03-14 06:02:07 +0000456 void ConstructJob(Compilation &C, const JobAction &JA,
457 const InputInfo &Output, const InputInfoList &Inputs,
458 const llvm::opt::ArgList &TCArgs,
459 const char *LinkingOutput) const override;
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000460 };
461} // end namespace netbsd
462
Thomas Schwinge4e555262013-03-28 19:04:25 +0000463 /// Directly call GNU Binutils' assembler and linker.
464namespace gnutools {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000465 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Rafael Espindola92b00932010-08-10 00:25:48 +0000466 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000467 Assemble(const ToolChain &TC) : GnuTool("GNU::Assemble", "assembler", TC) {}
Rafael Espindola92b00932010-08-10 00:25:48 +0000468
Craig Topperb45acb82014-03-14 06:02:07 +0000469 bool hasIntegratedCPP() const override { return false; }
Rafael Espindola92b00932010-08-10 00:25:48 +0000470
Craig Topperb45acb82014-03-14 06:02:07 +0000471 void ConstructJob(Compilation &C, const JobAction &JA,
472 const InputInfo &Output,
473 const InputInfoList &Inputs,
474 const llvm::opt::ArgList &TCArgs,
475 const char *LinkingOutput) const override;
Rafael Espindola92b00932010-08-10 00:25:48 +0000476 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000477 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000478 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000479 Link(const ToolChain &TC) : GnuTool("GNU::Link", "linker", TC) {}
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000480
Craig Topperb45acb82014-03-14 06:02:07 +0000481 bool hasIntegratedCPP() const override { return false; }
482 bool isLinkJob() const override { return true; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000483
Craig Topperb45acb82014-03-14 06:02:07 +0000484 void ConstructJob(Compilation &C, const JobAction &JA,
485 const InputInfo &Output,
486 const InputInfoList &Inputs,
487 const llvm::opt::ArgList &TCArgs,
488 const char *LinkingOutput) const override;
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000489 };
Rafael Espindola92b00932010-08-10 00:25:48 +0000490}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000491 /// minix -- Directly call GNU Binutils assembler and linker
492namespace minix {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000493 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000494 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000495 Assemble(const ToolChain &TC) : GnuTool("minix::Assemble", "assembler",
Chris Lattner3e2ee142010-07-07 16:01:42 +0000496 TC) {}
497
Craig Topperb45acb82014-03-14 06:02:07 +0000498 bool hasIntegratedCPP() const override { return false; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000499
Craig Topperb45acb82014-03-14 06:02:07 +0000500 void ConstructJob(Compilation &C, const JobAction &JA,
501 const InputInfo &Output,
502 const InputInfoList &Inputs,
503 const llvm::opt::ArgList &TCArgs,
504 const char *LinkingOutput) const override;
Chris Lattner3e2ee142010-07-07 16:01:42 +0000505 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000506 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000507 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000508 Link(const ToolChain &TC) : GnuTool("minix::Link", "linker", TC) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000509
Craig Topperb45acb82014-03-14 06:02:07 +0000510 bool hasIntegratedCPP() const override { return false; }
511 bool isLinkJob() const override { return true; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000512
Craig Topperb45acb82014-03-14 06:02:07 +0000513 void ConstructJob(Compilation &C, const JobAction &JA,
514 const InputInfo &Output,
515 const InputInfoList &Inputs,
516 const llvm::opt::ArgList &TCArgs,
517 const char *LinkingOutput) const override;
Chris Lattner3e2ee142010-07-07 16:01:42 +0000518 };
519} // end namespace minix
520
David Chisnallf571cde2012-02-15 13:39:01 +0000521 /// solaris -- Directly call Solaris assembler and linker
522namespace solaris {
523 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
524 public:
525 Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
526 TC) {}
527
Craig Topperb45acb82014-03-14 06:02:07 +0000528 bool hasIntegratedCPP() const override { return false; }
David Chisnallf571cde2012-02-15 13:39:01 +0000529
Craig Topperb45acb82014-03-14 06:02:07 +0000530 void ConstructJob(Compilation &C, const JobAction &JA,
531 const InputInfo &Output, const InputInfoList &Inputs,
532 const llvm::opt::ArgList &TCArgs,
533 const char *LinkingOutput) const override;
David Chisnallf571cde2012-02-15 13:39:01 +0000534 };
535 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
536 public:
537 Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
538
Craig Topperb45acb82014-03-14 06:02:07 +0000539 bool hasIntegratedCPP() const override { return false; }
540 bool isLinkJob() const override { return true; }
David Chisnallf571cde2012-02-15 13:39:01 +0000541
Craig Topperb45acb82014-03-14 06:02:07 +0000542 void ConstructJob(Compilation &C, const JobAction &JA,
543 const InputInfo &Output, const InputInfoList &Inputs,
544 const llvm::opt::ArgList &TCArgs,
545 const char *LinkingOutput) const override;
David Chisnallf571cde2012-02-15 13:39:01 +0000546 };
David Chisnalla9ed5d72012-02-15 16:25:46 +0000547} // end namespace solaris
David Chisnallf571cde2012-02-15 13:39:01 +0000548
Daniel Dunbarcc912342009-05-02 18:28:39 +0000549 /// dragonfly -- Directly call GNU Binutils assembler and linker
550namespace dragonfly {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000551 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Daniel Dunbarcc912342009-05-02 18:28:39 +0000552 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000553 Assemble(const ToolChain &TC) : GnuTool("dragonfly::Assemble", "assembler",
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000554 TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000555
Craig Topperb45acb82014-03-14 06:02:07 +0000556 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000557
Craig Topperb45acb82014-03-14 06:02:07 +0000558 void ConstructJob(Compilation &C, const JobAction &JA,
559 const InputInfo &Output, const InputInfoList &Inputs,
560 const llvm::opt::ArgList &TCArgs,
561 const char *LinkingOutput) const override;
Daniel Dunbarcc912342009-05-02 18:28:39 +0000562 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000563 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Daniel Dunbarcc912342009-05-02 18:28:39 +0000564 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000565 Link(const ToolChain &TC) : GnuTool("dragonfly::Link", "linker", TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000566
Craig Topperb45acb82014-03-14 06:02:07 +0000567 bool hasIntegratedCPP() const override { return false; }
568 bool isLinkJob() const override { return true; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000569
Craig Topperb45acb82014-03-14 06:02:07 +0000570 void ConstructJob(Compilation &C, const JobAction &JA,
571 const InputInfo &Output,
572 const InputInfoList &Inputs,
573 const llvm::opt::ArgList &TCArgs,
574 const char *LinkingOutput) const override;
Daniel Dunbarcc912342009-05-02 18:28:39 +0000575 };
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000576} // end namespace dragonfly
Daniel Dunbarcc912342009-05-02 18:28:39 +0000577
Hans Wennborg1da044a2014-06-26 19:59:02 +0000578/// Visual studio tools.
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000579namespace visualstudio {
Hans Wennborg87cfa712013-09-19 20:32:16 +0000580 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000581 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000582 Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC,
583 RF_Full, llvm::sys::WEM_UTF16) {}
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000584
Craig Topperb45acb82014-03-14 06:02:07 +0000585 bool hasIntegratedCPP() const override { return false; }
586 bool isLinkJob() const override { return true; }
Michael J. Spencerb186bc32010-08-21 21:55:07 +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;
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000592 };
Hans Wennborg87cfa712013-09-19 20:32:16 +0000593
594 class LLVM_LIBRARY_VISIBILITY Compile : public Tool {
595 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000596 Compile(const ToolChain &TC) : Tool("visualstudio::Compile", "compiler", TC,
597 RF_Full, llvm::sys::WEM_UTF16) {}
Hans Wennborg87cfa712013-09-19 20:32:16 +0000598
Craig Topperb45acb82014-03-14 06:02:07 +0000599 bool hasIntegratedAssembler() const override { return true; }
600 bool hasIntegratedCPP() const override { return true; }
601 bool isLinkJob() const override { return false; }
Hans Wennborg87cfa712013-09-19 20:32:16 +0000602
Craig Topperb45acb82014-03-14 06:02:07 +0000603 void ConstructJob(Compilation &C, const JobAction &JA,
604 const InputInfo &Output, const InputInfoList &Inputs,
605 const llvm::opt::ArgList &TCArgs,
606 const char *LinkingOutput) const override;
Hans Wennborg87cfa712013-09-19 20:32:16 +0000607
David Blaikiec11bf802014-09-04 16:04:28 +0000608 std::unique_ptr<Command> GetCommand(Compilation &C, const JobAction &JA,
609 const InputInfo &Output,
610 const InputInfoList &Inputs,
611 const llvm::opt::ArgList &TCArgs,
612 const char *LinkingOutput) const;
Hans Wennborg87cfa712013-09-19 20:32:16 +0000613 };
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000614} // end namespace visualstudio
615
Tim Northover9c7e0352013-12-12 11:55:52 +0000616namespace arm {
617 StringRef getARMFloatABI(const Driver &D, const llvm::opt::ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000618 const llvm::Triple &Triple);
Tim Northover9c7e0352013-12-12 11:55:52 +0000619}
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000620namespace XCore {
621 // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
622 // We simply use "clang -cc1" for those actions.
623 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
624 public:
625 Assemble(const ToolChain &TC) : Tool("XCore::Assemble",
626 "XCore-as", TC) {}
627
Craig Topperb45acb82014-03-14 06:02:07 +0000628 bool hasIntegratedCPP() const override { return false; }
629 void ConstructJob(Compilation &C, const JobAction &JA,
630 const InputInfo &Output, const InputInfoList &Inputs,
631 const llvm::opt::ArgList &TCArgs,
632 const char *LinkingOutput) const override;
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000633 };
634
635 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
636 public:
637 Link(const ToolChain &TC) : Tool("XCore::Link",
638 "XCore-ld", TC) {}
639
Craig Topperb45acb82014-03-14 06:02:07 +0000640 bool hasIntegratedCPP() const override { return false; }
641 bool isLinkJob() const override { return true; }
642 void ConstructJob(Compilation &C, const JobAction &JA,
643 const InputInfo &Output, const InputInfoList &Inputs,
644 const llvm::opt::ArgList &TCArgs,
645 const char *LinkingOutput) const override;
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000646 };
647} // end namespace XCore.
648
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000649namespace CrossWindows {
650class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
651public:
652 Assemble(const ToolChain &TC) : Tool("CrossWindows::Assemble", "as", TC) { }
653
654 bool hasIntegratedCPP() const override { return false; }
655
656 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;
660};
661
662class LLVM_LIBRARY_VISIBILITY Link : public Tool {
663public:
664 Link(const ToolChain &TC) : Tool("CrossWindows::Link", "ld", TC, RF_Full) {}
665
666 bool hasIntegratedCPP() const override { return false; }
667 bool isLinkJob() const override { return true; }
668
669 void ConstructJob(Compilation &C, const JobAction &JA,
670 const InputInfo &Output, const InputInfoList &Inputs,
671 const llvm::opt::ArgList &TCArgs,
672 const char *LinkingOutput) const override;
673};
674}
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000675
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000676} // end namespace toolchains
677} // end namespace driver
678} // end namespace clang
679
Benjamin Kramer2f5db8b2014-08-13 16:25:19 +0000680#endif