blob: 0420eea1237eb2498cd835fa3a08e52cee0b27b1 [file] [log] [blame]
Daniel Dunbar5903d8c2009-03-17 22:07:58 +00001//===--- Tools.h - Tool Implementations -------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Benjamin Kramer2f5db8b2014-08-13 16:25:19 +000010#ifndef LLVM_CLANG_LIB_DRIVER_TOOLS_H
11#define LLVM_CLANG_LIB_DRIVER_TOOLS_H
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000012
David Majnemere11d3732015-06-08 00:22:46 +000013#include "clang/Basic/VersionTuple.h"
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000014#include "clang/Driver/Tool.h"
Daniel Dunbare6adeee2009-03-29 17:08:39 +000015#include "clang/Driver/Types.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000016#include "clang/Driver/Util.h"
Joerg Sonnenberger637603a2011-05-16 13:35:02 +000017#include "llvm/ADT/Triple.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000018#include "llvm/Option/Option.h"
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000019#include "llvm/Support/Compiler.h"
20
21namespace clang {
John McCall5fb5df92012-06-20 06:18:46 +000022 class ObjCRuntime;
23
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000024namespace driver {
Hans Wennborg87cfa712013-09-19 20:32:16 +000025 class Command;
Douglas Gregor111af7d2009-04-18 00:34:01 +000026 class Driver;
27
Daniel Dunbarc1964212009-03-26 16:23:12 +000028namespace toolchains {
Tim Northover157d9112014-01-16 08:48:16 +000029 class MachO;
Daniel Dunbarc1964212009-03-26 16:23:12 +000030}
31
Daniel Dunbar15abb2e2009-03-17 22:18:43 +000032namespace tools {
Hans Wennborg1da044a2014-06-26 19:59:02 +000033
34namespace visualstudio {
35 class Compile;
36}
37
Reid Kleckner898229a2013-06-14 17:17:23 +000038using llvm::opt::ArgStringList;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000039
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +000040 /// \brief Clang compiler tool.
Duncan Sandsaf260b92010-05-11 20:16:05 +000041 class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
Eric Christopher45f2e712012-12-18 00:31:10 +000042 public:
Reid Kleckner724c21c2013-06-17 13:59:19 +000043 static const char *getBaseInputName(const llvm::opt::ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +000044 const InputInfo &Input);
Reid Kleckner724c21c2013-06-17 13:59:19 +000045 static const char *getBaseInputStem(const llvm::opt::ArgList &Args,
Bob Wilsondecc03e2012-11-23 06:14:39 +000046 const InputInfoList &Inputs);
Reid Kleckner724c21c2013-06-17 13:59:19 +000047 static const char *getDependencyFileName(const llvm::opt::ArgList &Args,
Bob Wilsondecc03e2012-11-23 06:14:39 +000048 const InputInfoList &Inputs);
49
Eric Christopher45f2e712012-12-18 00:31:10 +000050 private:
Reid Kleckner724c21c2013-06-17 13:59:19 +000051 void AddPreprocessingOptions(Compilation &C, const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +000052 const Driver &D,
Reid Kleckner724c21c2013-06-17 13:59:19 +000053 const llvm::opt::ArgList &Args,
54 llvm::opt::ArgStringList &CmdArgs,
Daniel Dunbard067f7f2009-04-08 23:54:23 +000055 const InputInfo &Output,
56 const InputInfoList &Inputs) const;
57
Amara Emerson703da2e2013-10-31 09:32:33 +000058 void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
59 llvm::opt::ArgStringList &CmdArgs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +000060 void AddARMTargetArgs(const llvm::opt::ArgList &Args,
61 llvm::opt::ArgStringList &CmdArgs,
Daniel Dunbarc9388c12011-03-17 17:10:06 +000062 bool KernelOrKext) const;
Tim Northovera2ee4332014-03-29 15:09:45 +000063 void AddARM64TargetArgs(const llvm::opt::ArgList &Args,
64 llvm::opt::ArgStringList &CmdArgs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +000065 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
66 llvm::opt::ArgStringList &CmdArgs) const;
Ulrich Weigand8afad612014-07-28 13:17:52 +000067 void AddPPCTargetArgs(const llvm::opt::ArgList &Args,
68 llvm::opt::ArgStringList &CmdArgs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +000069 void AddR600TargetArgs(const llvm::opt::ArgList &Args,
70 llvm::opt::ArgStringList &CmdArgs) const;
71 void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
72 llvm::opt::ArgStringList &CmdArgs) const;
Richard Sandiford4652d892013-07-19 16:51:51 +000073 void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
74 llvm::opt::ArgStringList &CmdArgs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +000075 void AddX86TargetArgs(const llvm::opt::ArgList &Args,
76 llvm::opt::ArgStringList &CmdArgs) const;
77 void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
78 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbar3b3191f2009-09-09 22:33:08 +000079
John McCall5fb5df92012-06-20 06:18:46 +000080 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
81
Reid Kleckner724c21c2013-06-17 13:59:19 +000082 ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
83 llvm::opt::ArgStringList &cmdArgs,
John McCall5fb5df92012-06-20 06:18:46 +000084 RewriteKind rewrite) const;
85
Hans Wennborg75958c42013-08-08 00:17:41 +000086 void AddClangCLArgs(const llvm::opt::ArgList &Args,
87 llvm::opt::ArgStringList &CmdArgs) const;
88
Hans Wennborg1da044a2014-06-26 19:59:02 +000089 visualstudio::Compile *getCLFallback() const;
90
91 mutable std::unique_ptr<visualstudio::Compile> CLFallback;
92
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000093 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +000094 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC, RF_Full) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000095
Craig Topperb45acb82014-03-14 06:02:07 +000096 bool hasGoodDiagnostics() const override { return true; }
97 bool hasIntegratedAssembler() const override { return true; }
98 bool hasIntegratedCPP() const override { return true; }
Bob Wilson23a55f12014-12-21 07:00:00 +000099 bool canEmitIR() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000100
Craig Topperb45acb82014-03-14 06:02:07 +0000101 void ConstructJob(Compilation &C, const JobAction &JA,
102 const InputInfo &Output, const InputInfoList &Inputs,
103 const llvm::opt::ArgList &TCArgs,
104 const char *LinkingOutput) const override;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000105 };
106
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000107 /// \brief Clang integrated assembler tool.
108 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
109 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000110 ClangAs(const ToolChain &TC) : Tool("clang::as",
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000111 "clang integrated assembler", TC,
112 RF_Full) {}
Daniel Sanders7f933f42015-01-30 17:35:23 +0000113 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
114 llvm::opt::ArgStringList &CmdArgs) const;
Craig Topperb45acb82014-03-14 06:02:07 +0000115 bool hasGoodDiagnostics() const override { return true; }
116 bool hasIntegratedAssembler() const override { return false; }
117 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000118
Craig Topperb45acb82014-03-14 06:02:07 +0000119 void ConstructJob(Compilation &C, const JobAction &JA,
120 const InputInfo &Output, const InputInfoList &Inputs,
121 const llvm::opt::ArgList &TCArgs,
122 const char *LinkingOutput) const override;
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000123 };
124
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000125 /// \brief Base class for all GNU tools that provide the same behavior when
126 /// it comes to response files support
127 class GnuTool : public Tool {
128 virtual void anchor();
129
130 public:
131 GnuTool(const char *Name, const char *ShortName, const ToolChain &TC)
132 : Tool(Name, ShortName, TC, RF_Full, llvm::sys::WEM_CurrentCodePage) {}
133 };
134
Daniel Dunbar82116f82009-03-17 22:45:24 +0000135 /// gcc - Generic GCC tool implementations.
136namespace gcc {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000137 class LLVM_LIBRARY_VISIBILITY Common : public GnuTool {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000138 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000139 Common(const char *Name, const char *ShortName,
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000140 const ToolChain &TC) : GnuTool(Name, ShortName, TC) {}
Daniel Dunbara3246a02009-03-18 08:07:30 +0000141
Craig Topperb45acb82014-03-14 06:02:07 +0000142 void ConstructJob(Compilation &C, const JobAction &JA,
143 const InputInfo &Output,
144 const InputInfoList &Inputs,
145 const llvm::opt::ArgList &TCArgs,
146 const char *LinkingOutput) const override;
Daniel Dunbara3246a02009-03-18 08:07:30 +0000147
148 /// RenderExtraToolArgs - Render any arguments necessary to force
149 /// the particular tool mode.
Reid Kleckner724c21c2013-06-17 13:59:19 +0000150 virtual void
151 RenderExtraToolArgs(const JobAction &JA,
152 llvm::opt::ArgStringList &CmdArgs) const = 0;
Daniel Dunbara3246a02009-03-18 08:07:30 +0000153 };
154
Duncan Sandsaf260b92010-05-11 20:16:05 +0000155 class LLVM_LIBRARY_VISIBILITY Preprocess : public Common {
Daniel Dunbara3246a02009-03-18 08:07:30 +0000156 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000157 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess",
158 "gcc preprocessor", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000159
Craig Topperb45acb82014-03-14 06:02:07 +0000160 bool hasGoodDiagnostics() const override { return true; }
161 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000162
Craig Topperb45acb82014-03-14 06:02:07 +0000163 void RenderExtraToolArgs(const JobAction &JA,
164 llvm::opt::ArgStringList &CmdArgs) const override;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000165 };
166
Duncan Sandsaf260b92010-05-11 20:16:05 +0000167 class LLVM_LIBRARY_VISIBILITY Compile : public Common {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000168 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000169 Compile(const ToolChain &TC) : Common("gcc::Compile",
170 "gcc frontend", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000171
Craig Topperb45acb82014-03-14 06:02:07 +0000172 bool hasGoodDiagnostics() const override { return true; }
173 bool hasIntegratedCPP() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000174
Craig Topperb45acb82014-03-14 06:02:07 +0000175 void RenderExtraToolArgs(const JobAction &JA,
176 llvm::opt::ArgStringList &CmdArgs) const override;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000177 };
178
Duncan Sandsaf260b92010-05-11 20:16:05 +0000179 class LLVM_LIBRARY_VISIBILITY Link : public Common {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000180 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000181 Link(const ToolChain &TC) : Common("gcc::Link",
182 "linker (via gcc)", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000183
Craig Topperb45acb82014-03-14 06:02:07 +0000184 bool hasIntegratedCPP() const override { return false; }
185 bool isLinkJob() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000186
Craig Topperb45acb82014-03-14 06:02:07 +0000187 void RenderExtraToolArgs(const JobAction &JA,
188 llvm::opt::ArgStringList &CmdArgs) const override;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000189 };
Daniel Dunbar82116f82009-03-17 22:45:24 +0000190} // end namespace gcc
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000191
Tony Linthicum76329bf2011-12-12 21:14:55 +0000192namespace hexagon {
193 // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
194 // We simply use "clang -cc1" for those actions.
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000195 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Tony Linthicum76329bf2011-12-12 21:14:55 +0000196 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000197 Assemble(const ToolChain &TC) : GnuTool("hexagon::Assemble",
Tony Linthicum76329bf2011-12-12 21:14:55 +0000198 "hexagon-as", TC) {}
199
Craig Topperb45acb82014-03-14 06:02:07 +0000200 bool hasIntegratedCPP() const override { return false; }
Tony Linthicum76329bf2011-12-12 21:14:55 +0000201
Craig Topperf85c6ce2014-03-14 06:06:19 +0000202 void RenderExtraToolArgs(const JobAction &JA,
203 llvm::opt::ArgStringList &CmdArgs) const;
Craig Topperb45acb82014-03-14 06:02:07 +0000204 void ConstructJob(Compilation &C, const JobAction &JA,
205 const InputInfo &Output, const InputInfoList &Inputs,
206 const llvm::opt::ArgList &TCArgs,
207 const char *LinkingOutput) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +0000208 };
209
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000210 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Tony Linthicum76329bf2011-12-12 21:14:55 +0000211 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000212 Link(const ToolChain &TC) : GnuTool("hexagon::Link",
Tony Linthicum76329bf2011-12-12 21:14:55 +0000213 "hexagon-ld", TC) {}
214
Craig Topperb45acb82014-03-14 06:02:07 +0000215 bool hasIntegratedCPP() const override { return false; }
216 bool isLinkJob() const override { return true; }
Tony Linthicum76329bf2011-12-12 21:14:55 +0000217
218 virtual void RenderExtraToolArgs(const JobAction &JA,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000219 llvm::opt::ArgStringList &CmdArgs) const;
Craig Topperb45acb82014-03-14 06:02:07 +0000220 void ConstructJob(Compilation &C, const JobAction &JA,
221 const InputInfo &Output, const InputInfoList &Inputs,
222 const llvm::opt::ArgList &TCArgs,
223 const char *LinkingOutput) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +0000224 };
225} // end namespace hexagon.
226
Bernard Ogden31561762013-12-12 13:27:11 +0000227namespace arm {
Gabor Ballabas208826c2015-06-04 17:56:32 +0000228 std::string getARMTargetCPU(const llvm::opt::ArgList &Args,
229 const llvm::Triple &Triple);
Gabor Ballabascebcb3b2015-06-11 12:29:56 +0000230 const std::string getARMArch(const llvm::opt::ArgList &Args,
231 const llvm::Triple &Triple);
Bernard Ogden31561762013-12-12 13:27:11 +0000232 const char* getARMCPUForMArch(const llvm::opt::ArgList &Args,
233 const llvm::Triple &Triple);
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000234 const char* getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +0000235
236 void appendEBLinkFlags(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple);
Bernard Ogden31561762013-12-12 13:27:11 +0000237}
Tony Linthicum76329bf2011-12-12 21:14:55 +0000238
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000239namespace mips {
Petar Jovanovic1dbc3172015-04-14 12:49:08 +0000240 typedef enum {
241 NanLegacy = 1,
242 Nan2008 = 2
243 } NanEncoding;
244 NanEncoding getSupportedNanEncoding(StringRef &CPU);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +0000245 void getMipsCPUAndABI(const llvm::opt::ArgList &Args,
246 const llvm::Triple &Triple, StringRef &CPUName,
247 StringRef &ABIName);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000248 bool hasMipsAbiArg(const llvm::opt::ArgList &Args, const char *Value);
Simon Atanasyand95c67d2014-08-13 14:34:14 +0000249 bool isUCLibc(const llvm::opt::ArgList &Args);
Daniel Sanders2bf13662014-07-10 14:40:57 +0000250 bool isNaN2008(const llvm::opt::ArgList &Args, const llvm::Triple &Triple);
Daniel Sanders379d44b2014-07-16 11:52:23 +0000251 bool isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
252 StringRef ABIName);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000253}
254
Ulrich Weigand8afad612014-07-28 13:17:52 +0000255namespace ppc {
256 bool hasPPCAbiArg(const llvm::opt::ArgList &Args, const char *Value);
257}
258
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000259 /// cloudabi -- Directly call GNU Binutils linker
260namespace cloudabi {
261class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
262public:
263 Link(const ToolChain &TC) : GnuTool("cloudabi::Link", "linker", TC) {}
264
265 bool hasIntegratedCPP() const override { return false; }
266 bool isLinkJob() const override { return true; }
267
268 void ConstructJob(Compilation &C, const JobAction &JA,
269 const InputInfo &Output, const InputInfoList &Inputs,
270 const llvm::opt::ArgList &TCArgs,
271 const char *LinkingOutput) const override;
272};
273} // end namespace cloudabi
274
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000275namespace darwin {
Tim Northover157d9112014-01-16 08:48:16 +0000276 llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
277 void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
Rafael Espindoladcbf6982012-10-31 18:51:07 +0000278
Tim Northover157d9112014-01-16 08:48:16 +0000279 class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
David Blaikie68e081d2011-12-20 02:48:34 +0000280 virtual void anchor();
Daniel Dunbare9ded432009-09-09 18:36:20 +0000281 protected:
Tim Northover157d9112014-01-16 08:48:16 +0000282 void AddMachOArch(const llvm::opt::ArgList &Args,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000283 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbare9ded432009-09-09 18:36:20 +0000284
Tim Northover157d9112014-01-16 08:48:16 +0000285 const toolchains::MachO &getMachOToolChain() const {
286 return reinterpret_cast<const toolchains::MachO&>(getToolChain());
Daniel Dunbare9ded432009-09-09 18:36:20 +0000287 }
288
289 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000290 MachOTool(
291 const char *Name, const char *ShortName, const ToolChain &TC,
292 ResponseFileSupport ResponseSupport = RF_None,
293 llvm::sys::WindowsEncodingMethod ResponseEncoding = llvm::sys::WEM_UTF8,
294 const char *ResponseFlag = "@")
295 : Tool(Name, ShortName, TC, ResponseSupport, ResponseEncoding,
296 ResponseFlag) {}
Daniel Dunbare9ded432009-09-09 18:36:20 +0000297 };
298
Tim Northover157d9112014-01-16 08:48:16 +0000299 class LLVM_LIBRARY_VISIBILITY Assemble : public MachOTool {
Daniel Dunbarbe220842009-03-20 16:06:39 +0000300 public:
Tim Northover157d9112014-01-16 08:48:16 +0000301 Assemble(const ToolChain &TC) : MachOTool("darwin::Assemble",
302 "assembler", TC) {}
Daniel Dunbarbe220842009-03-20 16:06:39 +0000303
Craig Topperb45acb82014-03-14 06:02:07 +0000304 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarbe220842009-03-20 16:06:39 +0000305
Craig Topperb45acb82014-03-14 06:02:07 +0000306 void ConstructJob(Compilation &C, const JobAction &JA,
307 const InputInfo &Output, const InputInfoList &Inputs,
308 const llvm::opt::ArgList &TCArgs,
309 const char *LinkingOutput) const override;
Daniel Dunbarbe220842009-03-20 16:06:39 +0000310 };
311
Tim Northover157d9112014-01-16 08:48:16 +0000312 class LLVM_LIBRARY_VISIBILITY Link : public MachOTool {
Bill Wendling3b2000f2012-10-02 18:02:50 +0000313 bool NeedsTempPath(const InputInfoList &Inputs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +0000314 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
315 llvm::opt::ArgStringList &CmdArgs,
316 const InputInfoList &Inputs) const;
Daniel Dunbarc1964212009-03-26 16:23:12 +0000317
Daniel Dunbarc1964212009-03-26 16:23:12 +0000318 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000319 Link(const ToolChain &TC) : MachOTool("darwin::Link", "linker", TC,
320 RF_FileList, llvm::sys::WEM_UTF8,
321 "-filelist") {}
Daniel Dunbarc1964212009-03-26 16:23:12 +0000322
Craig Topperb45acb82014-03-14 06:02:07 +0000323 bool hasIntegratedCPP() const override { return false; }
324 bool isLinkJob() const override { return true; }
Daniel Dunbarc1964212009-03-26 16:23:12 +0000325
Craig Topperb45acb82014-03-14 06:02:07 +0000326 void ConstructJob(Compilation &C, const JobAction &JA,
327 const InputInfo &Output, const InputInfoList &Inputs,
328 const llvm::opt::ArgList &TCArgs,
329 const char *LinkingOutput) const override;
Daniel Dunbarc1964212009-03-26 16:23:12 +0000330 };
331
Tim Northover157d9112014-01-16 08:48:16 +0000332 class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000333 public:
Tim Northover157d9112014-01-16 08:48:16 +0000334 Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000335
Craig Topperb45acb82014-03-14 06:02:07 +0000336 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000337
Craig Topperb45acb82014-03-14 06:02:07 +0000338 void ConstructJob(Compilation &C, const JobAction &JA,
339 const InputInfo &Output, const InputInfoList &Inputs,
340 const llvm::opt::ArgList &TCArgs,
341 const char *LinkingOutput) const override;
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000342 };
Daniel Dunbar88299622010-06-04 18:28:36 +0000343
Tim Northover157d9112014-01-16 08:48:16 +0000344 class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool {
Daniel Dunbar88299622010-06-04 18:28:36 +0000345 public:
Tim Northover157d9112014-01-16 08:48:16 +0000346 Dsymutil(const ToolChain &TC) : MachOTool("darwin::Dsymutil",
347 "dsymutil", TC) {}
Daniel Dunbar88299622010-06-04 18:28:36 +0000348
Craig Topperb45acb82014-03-14 06:02:07 +0000349 bool hasIntegratedCPP() const override { return false; }
350 bool isDsymutilJob() const override { return true; }
Daniel Dunbar88299622010-06-04 18:28:36 +0000351
Craig Topperb45acb82014-03-14 06:02:07 +0000352 void ConstructJob(Compilation &C, const JobAction &JA,
353 const InputInfo &Output,
354 const InputInfoList &Inputs,
355 const llvm::opt::ArgList &TCArgs,
356 const char *LinkingOutput) const override;
Daniel Dunbar88299622010-06-04 18:28:36 +0000357 };
Eric Christopher551ef452011-08-23 17:56:55 +0000358
Tim Northover157d9112014-01-16 08:48:16 +0000359 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool {
Eric Christopher551ef452011-08-23 17:56:55 +0000360 public:
Tim Northover157d9112014-01-16 08:48:16 +0000361 VerifyDebug(const ToolChain &TC) : MachOTool("darwin::VerifyDebug",
362 "dwarfdump", TC) {}
Eric Christopher551ef452011-08-23 17:56:55 +0000363
Craig Topperb45acb82014-03-14 06:02:07 +0000364 bool hasIntegratedCPP() const override { return false; }
Eric Christopher551ef452011-08-23 17:56:55 +0000365
Craig Topperb45acb82014-03-14 06:02:07 +0000366 void ConstructJob(Compilation &C, const JobAction &JA,
367 const InputInfo &Output, const InputInfoList &Inputs,
368 const llvm::opt::ArgList &TCArgs,
369 const char *LinkingOutput) const override;
Eric Christopher551ef452011-08-23 17:56:55 +0000370 };
371
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000372}
373
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000374 /// openbsd -- Directly call GNU Binutils assembler and linker
375namespace openbsd {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000376 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000377 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000378 Assemble(const ToolChain &TC) : GnuTool("openbsd::Assemble", "assembler",
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000379 TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000380
Craig Topperb45acb82014-03-14 06:02:07 +0000381 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000382
Craig Topperb45acb82014-03-14 06:02:07 +0000383 void ConstructJob(Compilation &C, const JobAction &JA,
384 const InputInfo &Output,
385 const InputInfoList &Inputs,
386 const llvm::opt::ArgList &TCArgs,
387 const char *LinkingOutput) const override;
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000388 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000389 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000390 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000391 Link(const ToolChain &TC) : GnuTool("openbsd::Link", "linker", TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000392
Craig Topperb45acb82014-03-14 06:02:07 +0000393 bool hasIntegratedCPP() const override { return false; }
394 bool isLinkJob() const override { return true; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000395
Craig Topperb45acb82014-03-14 06:02:07 +0000396 void ConstructJob(Compilation &C, const JobAction &JA,
397 const InputInfo &Output, const InputInfoList &Inputs,
398 const llvm::opt::ArgList &TCArgs,
399 const char *LinkingOutput) const override;
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000400 };
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000401} // end namespace openbsd
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000402
Eli Friedman9fa28852012-08-08 23:57:20 +0000403 /// bitrig -- Directly call GNU Binutils assembler and linker
404namespace bitrig {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000405 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Eli Friedman9fa28852012-08-08 23:57:20 +0000406 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000407 Assemble(const ToolChain &TC) : GnuTool("bitrig::Assemble", "assembler",
Eli Friedman9fa28852012-08-08 23:57:20 +0000408 TC) {}
409
Craig Topperb45acb82014-03-14 06:02:07 +0000410 bool hasIntegratedCPP() const override { return false; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000411
Craig Topperb45acb82014-03-14 06:02:07 +0000412 void ConstructJob(Compilation &C, const JobAction &JA,
413 const InputInfo &Output, const InputInfoList &Inputs,
414 const llvm::opt::ArgList &TCArgs,
415 const char *LinkingOutput) const override;
Eli Friedman9fa28852012-08-08 23:57:20 +0000416 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000417 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Eli Friedman9fa28852012-08-08 23:57:20 +0000418 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000419 Link(const ToolChain &TC) : GnuTool("bitrig::Link", "linker", TC) {}
Eli Friedman9fa28852012-08-08 23:57:20 +0000420
Craig Topperb45acb82014-03-14 06:02:07 +0000421 bool hasIntegratedCPP() const override { return false; }
422 bool isLinkJob() const override { return true; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000423
Craig Topperb45acb82014-03-14 06:02:07 +0000424 void ConstructJob(Compilation &C, const JobAction &JA,
425 const InputInfo &Output, const InputInfoList &Inputs,
426 const llvm::opt::ArgList &TCArgs,
427 const char *LinkingOutput) const override;
Eli Friedman9fa28852012-08-08 23:57:20 +0000428 };
429} // end namespace bitrig
430
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000431 /// freebsd -- Directly call GNU Binutils assembler and linker
432namespace freebsd {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000433 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000434 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000435 Assemble(const ToolChain &TC) : GnuTool("freebsd::Assemble", "assembler",
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000436 TC) {}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000437
Craig Topperb45acb82014-03-14 06:02:07 +0000438 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000439
Craig Topperb45acb82014-03-14 06:02:07 +0000440 void ConstructJob(Compilation &C, const JobAction &JA,
441 const InputInfo &Output, const InputInfoList &Inputs,
442 const llvm::opt::ArgList &TCArgs,
443 const char *LinkingOutput) const override;
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000444 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000445 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000446 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000447 Link(const ToolChain &TC) : GnuTool("freebsd::Link", "linker", TC) {}
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000448
Craig Topperb45acb82014-03-14 06:02:07 +0000449 bool hasIntegratedCPP() const override { return false; }
450 bool isLinkJob() const override { return true; }
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000451
Craig Topperb45acb82014-03-14 06:02:07 +0000452 void ConstructJob(Compilation &C, const JobAction &JA,
453 const InputInfo &Output, const InputInfoList &Inputs,
454 const llvm::opt::ArgList &TCArgs,
455 const char *LinkingOutput) const override;
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000456 };
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000457} // end namespace freebsd
458
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000459 /// netbsd -- Directly call GNU Binutils assembler and linker
460namespace netbsd {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000461 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Joerg Sonnenberger637603a2011-05-16 13:35:02 +0000462
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000463 public:
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +0000464 Assemble(const ToolChain &TC)
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000465 : GnuTool("netbsd::Assemble", "assembler", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000466
Craig Topperb45acb82014-03-14 06:02:07 +0000467 bool hasIntegratedCPP() const override { return false; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000468
Craig Topperb45acb82014-03-14 06:02:07 +0000469 void ConstructJob(Compilation &C, const JobAction &JA,
470 const InputInfo &Output, const InputInfoList &Inputs,
471 const llvm::opt::ArgList &TCArgs,
472 const char *LinkingOutput) const override;
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000473 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000474 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Joerg Sonnenberger637603a2011-05-16 13:35:02 +0000475
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000476 public:
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +0000477 Link(const ToolChain &TC)
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000478 : GnuTool("netbsd::Link", "linker", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000479
Craig Topperb45acb82014-03-14 06:02:07 +0000480 bool hasIntegratedCPP() const override { return false; }
481 bool isLinkJob() const override { return true; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000482
Craig Topperb45acb82014-03-14 06:02:07 +0000483 void ConstructJob(Compilation &C, const JobAction &JA,
484 const InputInfo &Output, const InputInfoList &Inputs,
485 const llvm::opt::ArgList &TCArgs,
486 const char *LinkingOutput) const override;
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000487 };
488} // end namespace netbsd
489
Thomas Schwinge4e555262013-03-28 19:04:25 +0000490 /// Directly call GNU Binutils' assembler and linker.
491namespace gnutools {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000492 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Rafael Espindola92b00932010-08-10 00:25:48 +0000493 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000494 Assemble(const ToolChain &TC) : GnuTool("GNU::Assemble", "assembler", TC) {}
Rafael Espindola92b00932010-08-10 00:25:48 +0000495
Craig Topperb45acb82014-03-14 06:02:07 +0000496 bool hasIntegratedCPP() const override { return false; }
Rafael Espindola92b00932010-08-10 00:25:48 +0000497
Craig Topperb45acb82014-03-14 06:02:07 +0000498 void ConstructJob(Compilation &C, const JobAction &JA,
499 const InputInfo &Output,
500 const InputInfoList &Inputs,
501 const llvm::opt::ArgList &TCArgs,
502 const char *LinkingOutput) const override;
Rafael Espindola92b00932010-08-10 00:25:48 +0000503 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000504 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000505 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000506 Link(const ToolChain &TC) : GnuTool("GNU::Link", "linker", TC) {}
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000507
Craig Topperb45acb82014-03-14 06:02:07 +0000508 bool hasIntegratedCPP() const override { return false; }
509 bool isLinkJob() const override { return true; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000510
Craig Topperb45acb82014-03-14 06:02:07 +0000511 void ConstructJob(Compilation &C, const JobAction &JA,
512 const InputInfo &Output,
513 const InputInfoList &Inputs,
514 const llvm::opt::ArgList &TCArgs,
515 const char *LinkingOutput) const override;
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000516 };
Rafael Espindola92b00932010-08-10 00:25:48 +0000517}
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000518
519namespace nacltools {
520 class LLVM_LIBRARY_VISIBILITY AssembleARM : public gnutools::Assemble {
521 public:
522 AssembleARM(const ToolChain &TC) : gnutools::Assemble(TC) {}
523
524 void ConstructJob(Compilation &C, const JobAction &JA,
525 const InputInfo &Output,
526 const InputInfoList &Inputs,
527 const llvm::opt::ArgList &TCArgs,
528 const char *LinkingOutput) const override;
529 };
530 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
531 public:
532 Link(const ToolChain &TC) : Tool("NaCl::Link", "linker", TC) {}
533
534 bool hasIntegratedCPP() const override { return false; }
535 bool isLinkJob() const override { return true; }
536
537 void ConstructJob(Compilation &C, const JobAction &JA,
538 const InputInfo &Output,
539 const InputInfoList &Inputs,
540 const llvm::opt::ArgList &TCArgs,
541 const char *LinkingOutput) const override;
542 };
543}
544
Chris Lattner3e2ee142010-07-07 16:01:42 +0000545 /// minix -- Directly call GNU Binutils assembler and linker
546namespace minix {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000547 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000548 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000549 Assemble(const ToolChain &TC) : GnuTool("minix::Assemble", "assembler",
Chris Lattner3e2ee142010-07-07 16:01:42 +0000550 TC) {}
551
Craig Topperb45acb82014-03-14 06:02:07 +0000552 bool hasIntegratedCPP() const override { return false; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000553
Craig Topperb45acb82014-03-14 06:02:07 +0000554 void ConstructJob(Compilation &C, const JobAction &JA,
555 const InputInfo &Output,
556 const InputInfoList &Inputs,
557 const llvm::opt::ArgList &TCArgs,
558 const char *LinkingOutput) const override;
Chris Lattner3e2ee142010-07-07 16:01:42 +0000559 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000560 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000561 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000562 Link(const ToolChain &TC) : GnuTool("minix::Link", "linker", TC) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000563
Craig Topperb45acb82014-03-14 06:02:07 +0000564 bool hasIntegratedCPP() const override { return false; }
565 bool isLinkJob() const override { return true; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000566
Craig Topperb45acb82014-03-14 06:02:07 +0000567 void ConstructJob(Compilation &C, const JobAction &JA,
568 const InputInfo &Output,
569 const InputInfoList &Inputs,
570 const llvm::opt::ArgList &TCArgs,
571 const char *LinkingOutput) const override;
Chris Lattner3e2ee142010-07-07 16:01:42 +0000572 };
573} // end namespace minix
574
David Chisnallf571cde2012-02-15 13:39:01 +0000575 /// solaris -- Directly call Solaris assembler and linker
576namespace solaris {
577 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
578 public:
579 Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
580 TC) {}
581
Craig Topperb45acb82014-03-14 06:02:07 +0000582 bool hasIntegratedCPP() const override { return false; }
David Chisnallf571cde2012-02-15 13:39:01 +0000583
Craig Topperb45acb82014-03-14 06:02:07 +0000584 void ConstructJob(Compilation &C, const JobAction &JA,
585 const InputInfo &Output, const InputInfoList &Inputs,
586 const llvm::opt::ArgList &TCArgs,
587 const char *LinkingOutput) const override;
David Chisnallf571cde2012-02-15 13:39:01 +0000588 };
589 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
590 public:
591 Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
592
Craig Topperb45acb82014-03-14 06:02:07 +0000593 bool hasIntegratedCPP() const override { return false; }
594 bool isLinkJob() const override { return true; }
David Chisnallf571cde2012-02-15 13:39:01 +0000595
Craig Topperb45acb82014-03-14 06:02:07 +0000596 void ConstructJob(Compilation &C, const JobAction &JA,
597 const InputInfo &Output, const InputInfoList &Inputs,
598 const llvm::opt::ArgList &TCArgs,
599 const char *LinkingOutput) const override;
David Chisnallf571cde2012-02-15 13:39:01 +0000600 };
David Chisnalla9ed5d72012-02-15 16:25:46 +0000601} // end namespace solaris
David Chisnallf571cde2012-02-15 13:39:01 +0000602
Daniel Dunbarcc912342009-05-02 18:28:39 +0000603 /// dragonfly -- Directly call GNU Binutils assembler and linker
604namespace dragonfly {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000605 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
Daniel Dunbarcc912342009-05-02 18:28:39 +0000606 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000607 Assemble(const ToolChain &TC) : GnuTool("dragonfly::Assemble", "assembler",
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000608 TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000609
Craig Topperb45acb82014-03-14 06:02:07 +0000610 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000611
Craig Topperb45acb82014-03-14 06:02:07 +0000612 void ConstructJob(Compilation &C, const JobAction &JA,
613 const InputInfo &Output, const InputInfoList &Inputs,
614 const llvm::opt::ArgList &TCArgs,
615 const char *LinkingOutput) const override;
Daniel Dunbarcc912342009-05-02 18:28:39 +0000616 };
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000617 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
Daniel Dunbarcc912342009-05-02 18:28:39 +0000618 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000619 Link(const ToolChain &TC) : GnuTool("dragonfly::Link", "linker", TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000620
Craig Topperb45acb82014-03-14 06:02:07 +0000621 bool hasIntegratedCPP() const override { return false; }
622 bool isLinkJob() const override { return true; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000623
Craig Topperb45acb82014-03-14 06:02:07 +0000624 void ConstructJob(Compilation &C, const JobAction &JA,
625 const InputInfo &Output,
626 const InputInfoList &Inputs,
627 const llvm::opt::ArgList &TCArgs,
628 const char *LinkingOutput) const override;
Daniel Dunbarcc912342009-05-02 18:28:39 +0000629 };
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000630} // end namespace dragonfly
Daniel Dunbarcc912342009-05-02 18:28:39 +0000631
Hans Wennborg1da044a2014-06-26 19:59:02 +0000632/// Visual studio tools.
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000633namespace visualstudio {
David Majnemere11d3732015-06-08 00:22:46 +0000634 VersionTuple getMSVCVersion(const Driver *D, const llvm::Triple &Triple,
635 const llvm::opt::ArgList &Args,
636 bool IsWindowsMSVC);
637
Hans Wennborg87cfa712013-09-19 20:32:16 +0000638 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000639 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000640 Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC,
641 RF_Full, llvm::sys::WEM_UTF16) {}
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000642
Craig Topperb45acb82014-03-14 06:02:07 +0000643 bool hasIntegratedCPP() const override { return false; }
644 bool isLinkJob() const override { return true; }
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000645
Craig Topperb45acb82014-03-14 06:02:07 +0000646 void ConstructJob(Compilation &C, const JobAction &JA,
647 const InputInfo &Output, const InputInfoList &Inputs,
648 const llvm::opt::ArgList &TCArgs,
649 const char *LinkingOutput) const override;
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000650 };
Hans Wennborg87cfa712013-09-19 20:32:16 +0000651
652 class LLVM_LIBRARY_VISIBILITY Compile : public Tool {
653 public:
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000654 Compile(const ToolChain &TC) : Tool("visualstudio::Compile", "compiler", TC,
655 RF_Full, llvm::sys::WEM_UTF16) {}
Hans Wennborg87cfa712013-09-19 20:32:16 +0000656
Craig Topperb45acb82014-03-14 06:02:07 +0000657 bool hasIntegratedAssembler() const override { return true; }
658 bool hasIntegratedCPP() const override { return true; }
659 bool isLinkJob() const override { return false; }
Hans Wennborg87cfa712013-09-19 20:32:16 +0000660
Craig Topperb45acb82014-03-14 06:02:07 +0000661 void ConstructJob(Compilation &C, const JobAction &JA,
662 const InputInfo &Output, const InputInfoList &Inputs,
663 const llvm::opt::ArgList &TCArgs,
664 const char *LinkingOutput) const override;
Hans Wennborg87cfa712013-09-19 20:32:16 +0000665
David Blaikiec11bf802014-09-04 16:04:28 +0000666 std::unique_ptr<Command> GetCommand(Compilation &C, const JobAction &JA,
667 const InputInfo &Output,
668 const InputInfoList &Inputs,
669 const llvm::opt::ArgList &TCArgs,
670 const char *LinkingOutput) const;
Hans Wennborg87cfa712013-09-19 20:32:16 +0000671 };
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000672} // end namespace visualstudio
673
Tim Northover9c7e0352013-12-12 11:55:52 +0000674namespace arm {
675 StringRef getARMFloatABI(const Driver &D, const llvm::opt::ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000676 const llvm::Triple &Triple);
Tim Northover9c7e0352013-12-12 11:55:52 +0000677}
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000678namespace XCore {
679 // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
680 // We simply use "clang -cc1" for those actions.
681 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
682 public:
683 Assemble(const ToolChain &TC) : Tool("XCore::Assemble",
684 "XCore-as", TC) {}
685
Craig Topperb45acb82014-03-14 06:02:07 +0000686 bool hasIntegratedCPP() const override { return false; }
687 void ConstructJob(Compilation &C, const JobAction &JA,
688 const InputInfo &Output, const InputInfoList &Inputs,
689 const llvm::opt::ArgList &TCArgs,
690 const char *LinkingOutput) const override;
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000691 };
692
693 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
694 public:
695 Link(const ToolChain &TC) : Tool("XCore::Link",
696 "XCore-ld", TC) {}
697
Craig Topperb45acb82014-03-14 06:02:07 +0000698 bool hasIntegratedCPP() const override { return false; }
699 bool isLinkJob() const override { return true; }
700 void ConstructJob(Compilation &C, const JobAction &JA,
701 const InputInfo &Output, const InputInfoList &Inputs,
702 const llvm::opt::ArgList &TCArgs,
703 const char *LinkingOutput) const override;
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000704 };
705} // end namespace XCore.
706
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000707namespace CrossWindows {
708class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
709public:
710 Assemble(const ToolChain &TC) : Tool("CrossWindows::Assemble", "as", TC) { }
711
712 bool hasIntegratedCPP() const override { return false; }
713
714 void ConstructJob(Compilation &C, const JobAction &JA,
715 const InputInfo &Output, const InputInfoList &Inputs,
716 const llvm::opt::ArgList &TCArgs,
717 const char *LinkingOutput) const override;
718};
719
720class LLVM_LIBRARY_VISIBILITY Link : public Tool {
721public:
722 Link(const ToolChain &TC) : Tool("CrossWindows::Link", "ld", TC, RF_Full) {}
723
724 bool hasIntegratedCPP() const override { return false; }
725 bool isLinkJob() const override { return true; }
726
727 void ConstructJob(Compilation &C, const JobAction &JA,
728 const InputInfo &Output, const InputInfoList &Inputs,
729 const llvm::opt::ArgList &TCArgs,
730 const char *LinkingOutput) const override;
731};
732}
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000733
Douglas Katzman9dc5fbb2015-06-03 16:56:50 +0000734} // end namespace tools
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000735} // end namespace driver
736} // end namespace clang
737
Benjamin Kramer2f5db8b2014-08-13 16:25:19 +0000738#endif