blob: 52ab731cbc4650d776846bf56a3a8c178a14707b [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 {
Douglas Katzman95354292015-06-23 20:42:09 +000035class Compiler;
Hans Wennborg1da044a2014-06-26 19:59:02 +000036}
37
Reid Kleckner898229a2013-06-14 17:17:23 +000038using llvm::opt::ArgStringList;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000039
Peter Collingbourne581f4382015-07-02 01:48:12 +000040SmallString<128> getCompilerRT(const ToolChain &TC, StringRef Component,
41 bool Shared = false);
42
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +000043 /// \brief Clang compiler tool.
Duncan Sandsaf260b92010-05-11 20:16:05 +000044 class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
Eric Christopher45f2e712012-12-18 00:31:10 +000045 public:
Reid Kleckner724c21c2013-06-17 13:59:19 +000046 static const char *getBaseInputName(const llvm::opt::ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +000047 const InputInfo &Input);
Reid Kleckner724c21c2013-06-17 13:59:19 +000048 static const char *getBaseInputStem(const llvm::opt::ArgList &Args,
Bob Wilsondecc03e2012-11-23 06:14:39 +000049 const InputInfoList &Inputs);
Reid Kleckner724c21c2013-06-17 13:59:19 +000050 static const char *getDependencyFileName(const llvm::opt::ArgList &Args,
Bob Wilsondecc03e2012-11-23 06:14:39 +000051 const InputInfoList &Inputs);
52
Eric Christopher45f2e712012-12-18 00:31:10 +000053 private:
Reid Kleckner724c21c2013-06-17 13:59:19 +000054 void AddPreprocessingOptions(Compilation &C, const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +000055 const Driver &D,
Reid Kleckner724c21c2013-06-17 13:59:19 +000056 const llvm::opt::ArgList &Args,
57 llvm::opt::ArgStringList &CmdArgs,
Daniel Dunbard067f7f2009-04-08 23:54:23 +000058 const InputInfo &Output,
59 const InputInfoList &Inputs) const;
60
Amara Emerson703da2e2013-10-31 09:32:33 +000061 void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
62 llvm::opt::ArgStringList &CmdArgs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +000063 void AddARMTargetArgs(const llvm::opt::ArgList &Args,
64 llvm::opt::ArgStringList &CmdArgs,
Daniel Dunbarc9388c12011-03-17 17:10:06 +000065 bool KernelOrKext) const;
Tim Northovera2ee4332014-03-29 15:09:45 +000066 void AddARM64TargetArgs(const llvm::opt::ArgList &Args,
67 llvm::opt::ArgStringList &CmdArgs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +000068 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
69 llvm::opt::ArgStringList &CmdArgs) const;
Ulrich Weigand8afad612014-07-28 13:17:52 +000070 void AddPPCTargetArgs(const llvm::opt::ArgList &Args,
71 llvm::opt::ArgStringList &CmdArgs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +000072 void AddR600TargetArgs(const llvm::opt::ArgList &Args,
73 llvm::opt::ArgStringList &CmdArgs) const;
74 void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
75 llvm::opt::ArgStringList &CmdArgs) const;
Richard Sandiford4652d892013-07-19 16:51:51 +000076 void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
77 llvm::opt::ArgStringList &CmdArgs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +000078 void AddX86TargetArgs(const llvm::opt::ArgList &Args,
79 llvm::opt::ArgStringList &CmdArgs) const;
80 void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
81 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbar3b3191f2009-09-09 22:33:08 +000082
John McCall5fb5df92012-06-20 06:18:46 +000083 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
84
Reid Kleckner724c21c2013-06-17 13:59:19 +000085 ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
86 llvm::opt::ArgStringList &cmdArgs,
John McCall5fb5df92012-06-20 06:18:46 +000087 RewriteKind rewrite) const;
88
Hans Wennborg75958c42013-08-08 00:17:41 +000089 void AddClangCLArgs(const llvm::opt::ArgList &Args,
90 llvm::opt::ArgStringList &CmdArgs) const;
91
Douglas Katzman95354292015-06-23 20:42:09 +000092 visualstudio::Compiler *getCLFallback() const;
Hans Wennborg1da044a2014-06-26 19:59:02 +000093
Douglas Katzman95354292015-06-23 20:42:09 +000094 mutable std::unique_ptr<visualstudio::Compiler> CLFallback;
Hans Wennborg1da044a2014-06-26 19:59:02 +000095
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000096 public:
Douglas Katzman95354292015-06-23 20:42:09 +000097 // CAUTION! The first constructor argument ("clang") is not arbitrary,
98 // as it is for other tools. Some operations on a Tool actually test
99 // whether that tool is Clang based on the Tool's Name as a string.
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000100 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC, RF_Full) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000101
Craig Topperb45acb82014-03-14 06:02:07 +0000102 bool hasGoodDiagnostics() const override { return true; }
103 bool hasIntegratedAssembler() const override { return true; }
104 bool hasIntegratedCPP() const override { return true; }
Bob Wilson23a55f12014-12-21 07:00:00 +0000105 bool canEmitIR() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000106
Craig Topperb45acb82014-03-14 06:02:07 +0000107 void ConstructJob(Compilation &C, const JobAction &JA,
108 const InputInfo &Output, const InputInfoList &Inputs,
109 const llvm::opt::ArgList &TCArgs,
110 const char *LinkingOutput) const override;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000111 };
112
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000113 /// \brief Clang integrated assembler tool.
114 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
115 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000116 ClangAs(const ToolChain &TC) : Tool("clang::as",
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000117 "clang integrated assembler", TC,
118 RF_Full) {}
Daniel Sanders7f933f42015-01-30 17:35:23 +0000119 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
120 llvm::opt::ArgStringList &CmdArgs) const;
Craig Topperb45acb82014-03-14 06:02:07 +0000121 bool hasGoodDiagnostics() const override { return true; }
122 bool hasIntegratedAssembler() const override { return false; }
123 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000124
Craig Topperb45acb82014-03-14 06:02:07 +0000125 void ConstructJob(Compilation &C, const JobAction &JA,
126 const InputInfo &Output, const InputInfoList &Inputs,
127 const llvm::opt::ArgList &TCArgs,
128 const char *LinkingOutput) const override;
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000129 };
130
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000131 /// \brief Base class for all GNU tools that provide the same behavior when
132 /// it comes to response files support
Benjamin Kramer452695e2015-06-23 21:15:15 +0000133 class LLVM_LIBRARY_VISIBILITY GnuTool : public Tool {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000134 virtual void anchor();
135
136 public:
137 GnuTool(const char *Name, const char *ShortName, const ToolChain &TC)
138 : Tool(Name, ShortName, TC, RF_Full, llvm::sys::WEM_CurrentCodePage) {}
139 };
140
Daniel Dunbar82116f82009-03-17 22:45:24 +0000141 /// gcc - Generic GCC tool implementations.
142namespace gcc {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000143 class LLVM_LIBRARY_VISIBILITY Common : public GnuTool {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000144 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000145 Common(const char *Name, const char *ShortName,
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000146 const ToolChain &TC) : GnuTool(Name, ShortName, TC) {}
Daniel Dunbara3246a02009-03-18 08:07:30 +0000147
Craig Topperb45acb82014-03-14 06:02:07 +0000148 void ConstructJob(Compilation &C, const JobAction &JA,
149 const InputInfo &Output,
150 const InputInfoList &Inputs,
151 const llvm::opt::ArgList &TCArgs,
152 const char *LinkingOutput) const override;
Daniel Dunbara3246a02009-03-18 08:07:30 +0000153
154 /// RenderExtraToolArgs - Render any arguments necessary to force
155 /// the particular tool mode.
Reid Kleckner724c21c2013-06-17 13:59:19 +0000156 virtual void
Douglas Katzman95354292015-06-23 20:42:09 +0000157 RenderExtraToolArgs(const JobAction &JA,
158 llvm::opt::ArgStringList &CmdArgs) const = 0;
Daniel Dunbara3246a02009-03-18 08:07:30 +0000159 };
160
Douglas Katzman95354292015-06-23 20:42:09 +0000161 class LLVM_LIBRARY_VISIBILITY Preprocessor : public Common {
Daniel Dunbara3246a02009-03-18 08:07:30 +0000162 public:
Douglas Katzman95354292015-06-23 20:42:09 +0000163 Preprocessor(const ToolChain &TC)
164 : Common("gcc::Preprocessor", "gcc preprocessor", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000165
Craig Topperb45acb82014-03-14 06:02:07 +0000166 bool hasGoodDiagnostics() const override { return true; }
167 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000168
Craig Topperb45acb82014-03-14 06:02:07 +0000169 void RenderExtraToolArgs(const JobAction &JA,
170 llvm::opt::ArgStringList &CmdArgs) const override;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000171 };
172
Douglas Katzman95354292015-06-23 20:42:09 +0000173 class LLVM_LIBRARY_VISIBILITY Compiler : public Common {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000174 public:
Douglas Katzman95354292015-06-23 20:42:09 +0000175 Compiler(const ToolChain &TC)
176 : Common("gcc::Compiler", "gcc frontend", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000177
Craig Topperb45acb82014-03-14 06:02:07 +0000178 bool hasGoodDiagnostics() const override { return true; }
179 bool hasIntegratedCPP() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000180
Craig Topperb45acb82014-03-14 06:02:07 +0000181 void RenderExtraToolArgs(const JobAction &JA,
182 llvm::opt::ArgStringList &CmdArgs) const override;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000183 };
184
Douglas Katzman95354292015-06-23 20:42:09 +0000185 class LLVM_LIBRARY_VISIBILITY Linker : public Common {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000186 public:
Douglas Katzman95354292015-06-23 20:42:09 +0000187 Linker(const ToolChain &TC)
188 : Common("gcc::Linker", "linker (via gcc)", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000189
Craig Topperb45acb82014-03-14 06:02:07 +0000190 bool hasIntegratedCPP() const override { return false; }
191 bool isLinkJob() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000192
Craig Topperb45acb82014-03-14 06:02:07 +0000193 void RenderExtraToolArgs(const JobAction &JA,
194 llvm::opt::ArgStringList &CmdArgs) const override;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000195 };
Daniel Dunbar82116f82009-03-17 22:45:24 +0000196} // end namespace gcc
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000197
Tony Linthicum76329bf2011-12-12 21:14:55 +0000198namespace hexagon {
Douglas Katzman95354292015-06-23 20:42:09 +0000199// For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile
200// and Compile.
201// We simply use "clang -cc1" for those actions.
202class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
203public:
204 Assembler(const ToolChain &TC)
205 : GnuTool("hexagon::Assembler", "hexagon-as", TC) {}
Tony Linthicum76329bf2011-12-12 21:14:55 +0000206
Douglas Katzman95354292015-06-23 20:42:09 +0000207 bool hasIntegratedCPP() const override { return false; }
Tony Linthicum76329bf2011-12-12 21:14:55 +0000208
Craig Topperf85c6ce2014-03-14 06:06:19 +0000209 void RenderExtraToolArgs(const JobAction &JA,
210 llvm::opt::ArgStringList &CmdArgs) const;
Craig Topperb45acb82014-03-14 06:02:07 +0000211 void ConstructJob(Compilation &C, const JobAction &JA,
212 const InputInfo &Output, const InputInfoList &Inputs,
213 const llvm::opt::ArgList &TCArgs,
214 const char *LinkingOutput) const override;
Douglas Katzman95354292015-06-23 20:42:09 +0000215};
Tony Linthicum76329bf2011-12-12 21:14:55 +0000216
Douglas Katzman95354292015-06-23 20:42:09 +0000217class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
218public:
219 Linker(const ToolChain &TC) : GnuTool("hexagon::Linker", "hexagon-ld", TC) {}
Tony Linthicum76329bf2011-12-12 21:14:55 +0000220
Douglas Katzman95354292015-06-23 20:42:09 +0000221 bool hasIntegratedCPP() const override { return false; }
Craig Topperb45acb82014-03-14 06:02:07 +0000222 bool isLinkJob() const override { return true; }
Tony Linthicum76329bf2011-12-12 21:14:55 +0000223
224 virtual void RenderExtraToolArgs(const JobAction &JA,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000225 llvm::opt::ArgStringList &CmdArgs) const;
Craig Topperb45acb82014-03-14 06:02:07 +0000226 void ConstructJob(Compilation &C, const JobAction &JA,
227 const InputInfo &Output, const InputInfoList &Inputs,
228 const llvm::opt::ArgList &TCArgs,
229 const char *LinkingOutput) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +0000230 };
231} // end namespace hexagon.
232
Bernard Ogden31561762013-12-12 13:27:11 +0000233namespace arm {
Gabor Ballabas208826c2015-06-04 17:56:32 +0000234 std::string getARMTargetCPU(const llvm::opt::ArgList &Args,
235 const llvm::Triple &Triple);
Gabor Ballabascebcb3b2015-06-11 12:29:56 +0000236 const std::string getARMArch(const llvm::opt::ArgList &Args,
237 const llvm::Triple &Triple);
Bernard Ogden31561762013-12-12 13:27:11 +0000238 const char* getARMCPUForMArch(const llvm::opt::ArgList &Args,
239 const llvm::Triple &Triple);
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000240 const char* getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +0000241
242 void appendEBLinkFlags(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple);
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000243}
Tony Linthicum76329bf2011-12-12 21:14:55 +0000244
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000245namespace mips {
Petar Jovanovic1dbc3172015-04-14 12:49:08 +0000246 typedef enum {
247 NanLegacy = 1,
248 Nan2008 = 2
249 } NanEncoding;
250 NanEncoding getSupportedNanEncoding(StringRef &CPU);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +0000251 void getMipsCPUAndABI(const llvm::opt::ArgList &Args,
252 const llvm::Triple &Triple, StringRef &CPUName,
253 StringRef &ABIName);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000254 bool hasMipsAbiArg(const llvm::opt::ArgList &Args, const char *Value);
Simon Atanasyand95c67d2014-08-13 14:34:14 +0000255 bool isUCLibc(const llvm::opt::ArgList &Args);
Daniel Sanders2bf13662014-07-10 14:40:57 +0000256 bool isNaN2008(const llvm::opt::ArgList &Args, const llvm::Triple &Triple);
Daniel Sanders379d44b2014-07-16 11:52:23 +0000257 bool isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Toma Tabacu94ea6862015-06-16 13:54:13 +0000258 StringRef ABIName, StringRef FloatABI);
259 bool shouldUseFPXX(const llvm::opt::ArgList &Args, const llvm::Triple &Triple,
260 StringRef CPUName, StringRef ABIName, StringRef FloatABI);
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000261}
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000262
Ulrich Weigand8afad612014-07-28 13:17:52 +0000263namespace ppc {
264 bool hasPPCAbiArg(const llvm::opt::ArgList &Args, const char *Value);
265}
266
Douglas Katzman95354292015-06-23 20:42:09 +0000267/// cloudabi -- Directly call GNU Binutils linker
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000268namespace cloudabi {
Douglas Katzman95354292015-06-23 20:42:09 +0000269class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000270public:
Douglas Katzman95354292015-06-23 20:42:09 +0000271 Linker(const ToolChain &TC) : GnuTool("cloudabi::Linker", "linker", TC) {}
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000272
273 bool hasIntegratedCPP() const override { return false; }
274 bool isLinkJob() const override { return true; }
275
276 void ConstructJob(Compilation &C, const JobAction &JA,
277 const InputInfo &Output, const InputInfoList &Inputs,
278 const llvm::opt::ArgList &TCArgs,
279 const char *LinkingOutput) const override;
280};
281} // end namespace cloudabi
282
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000283namespace darwin {
Tim Northover157d9112014-01-16 08:48:16 +0000284 llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
285 void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
Rafael Espindoladcbf6982012-10-31 18:51:07 +0000286
Tim Northover157d9112014-01-16 08:48:16 +0000287 class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
David Blaikie68e081d2011-12-20 02:48:34 +0000288 virtual void anchor();
Daniel Dunbare9ded432009-09-09 18:36:20 +0000289 protected:
Tim Northover157d9112014-01-16 08:48:16 +0000290 void AddMachOArch(const llvm::opt::ArgList &Args,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000291 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbare9ded432009-09-09 18:36:20 +0000292
Tim Northover157d9112014-01-16 08:48:16 +0000293 const toolchains::MachO &getMachOToolChain() const {
294 return reinterpret_cast<const toolchains::MachO&>(getToolChain());
Daniel Dunbare9ded432009-09-09 18:36:20 +0000295 }
296
297 public:
Douglas Katzman95354292015-06-23 20:42:09 +0000298 MachOTool(
299 const char *Name, const char *ShortName, const ToolChain &TC,
300 ResponseFileSupport ResponseSupport = RF_None,
301 llvm::sys::WindowsEncodingMethod ResponseEncoding = llvm::sys::WEM_UTF8,
302 const char *ResponseFlag = "@")
303 : Tool(Name, ShortName, TC, ResponseSupport, ResponseEncoding,
304 ResponseFlag) {}
Daniel Dunbare9ded432009-09-09 18:36:20 +0000305 };
306
Douglas Katzman95354292015-06-23 20:42:09 +0000307 class LLVM_LIBRARY_VISIBILITY Assembler : public MachOTool {
Daniel Dunbarbe220842009-03-20 16:06:39 +0000308 public:
Douglas Katzman95354292015-06-23 20:42:09 +0000309 Assembler(const ToolChain &TC)
310 : MachOTool("darwin::Assembler", "assembler", TC) {}
Daniel Dunbarbe220842009-03-20 16:06:39 +0000311
Craig Topperb45acb82014-03-14 06:02:07 +0000312 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarbe220842009-03-20 16:06:39 +0000313
Craig Topperb45acb82014-03-14 06:02:07 +0000314 void ConstructJob(Compilation &C, const JobAction &JA,
315 const InputInfo &Output, const InputInfoList &Inputs,
316 const llvm::opt::ArgList &TCArgs,
317 const char *LinkingOutput) const override;
Daniel Dunbarbe220842009-03-20 16:06:39 +0000318 };
319
Douglas Katzman95354292015-06-23 20:42:09 +0000320 class LLVM_LIBRARY_VISIBILITY Linker : public MachOTool {
Bill Wendling3b2000f2012-10-02 18:02:50 +0000321 bool NeedsTempPath(const InputInfoList &Inputs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +0000322 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
323 llvm::opt::ArgStringList &CmdArgs,
324 const InputInfoList &Inputs) const;
Daniel Dunbarc1964212009-03-26 16:23:12 +0000325
Daniel Dunbarc1964212009-03-26 16:23:12 +0000326 public:
Douglas Katzman95354292015-06-23 20:42:09 +0000327 Linker(const ToolChain &TC)
328 : MachOTool("darwin::Linker", "linker", TC, RF_FileList,
329 llvm::sys::WEM_UTF8, "-filelist") {}
Daniel Dunbarc1964212009-03-26 16:23:12 +0000330
Craig Topperb45acb82014-03-14 06:02:07 +0000331 bool hasIntegratedCPP() const override { return false; }
332 bool isLinkJob() const override { return true; }
Daniel Dunbarc1964212009-03-26 16:23:12 +0000333
Craig Topperb45acb82014-03-14 06:02:07 +0000334 void ConstructJob(Compilation &C, const JobAction &JA,
335 const InputInfo &Output, const InputInfoList &Inputs,
336 const llvm::opt::ArgList &TCArgs,
337 const char *LinkingOutput) const override;
Daniel Dunbarc1964212009-03-26 16:23:12 +0000338 };
339
Tim Northover157d9112014-01-16 08:48:16 +0000340 class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000341 public:
Tim Northover157d9112014-01-16 08:48:16 +0000342 Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000343
Craig Topperb45acb82014-03-14 06:02:07 +0000344 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000345
Craig Topperb45acb82014-03-14 06:02:07 +0000346 void ConstructJob(Compilation &C, const JobAction &JA,
347 const InputInfo &Output, const InputInfoList &Inputs,
348 const llvm::opt::ArgList &TCArgs,
349 const char *LinkingOutput) const override;
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000350 };
Daniel Dunbar88299622010-06-04 18:28:36 +0000351
Tim Northover157d9112014-01-16 08:48:16 +0000352 class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool {
Daniel Dunbar88299622010-06-04 18:28:36 +0000353 public:
Tim Northover157d9112014-01-16 08:48:16 +0000354 Dsymutil(const ToolChain &TC) : MachOTool("darwin::Dsymutil",
355 "dsymutil", TC) {}
Daniel Dunbar88299622010-06-04 18:28:36 +0000356
Craig Topperb45acb82014-03-14 06:02:07 +0000357 bool hasIntegratedCPP() const override { return false; }
358 bool isDsymutilJob() const override { return true; }
Daniel Dunbar88299622010-06-04 18:28:36 +0000359
Craig Topperb45acb82014-03-14 06:02:07 +0000360 void ConstructJob(Compilation &C, const JobAction &JA,
361 const InputInfo &Output,
362 const InputInfoList &Inputs,
363 const llvm::opt::ArgList &TCArgs,
364 const char *LinkingOutput) const override;
Daniel Dunbar88299622010-06-04 18:28:36 +0000365 };
Eric Christopher551ef452011-08-23 17:56:55 +0000366
Tim Northover157d9112014-01-16 08:48:16 +0000367 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool {
Eric Christopher551ef452011-08-23 17:56:55 +0000368 public:
Tim Northover157d9112014-01-16 08:48:16 +0000369 VerifyDebug(const ToolChain &TC) : MachOTool("darwin::VerifyDebug",
370 "dwarfdump", TC) {}
Eric Christopher551ef452011-08-23 17:56:55 +0000371
Craig Topperb45acb82014-03-14 06:02:07 +0000372 bool hasIntegratedCPP() const override { return false; }
Eric Christopher551ef452011-08-23 17:56:55 +0000373
Craig Topperb45acb82014-03-14 06:02:07 +0000374 void ConstructJob(Compilation &C, const JobAction &JA,
375 const InputInfo &Output, const InputInfoList &Inputs,
376 const llvm::opt::ArgList &TCArgs,
377 const char *LinkingOutput) const override;
Eric Christopher551ef452011-08-23 17:56:55 +0000378 };
379
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000380}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000381
Douglas Katzman95354292015-06-23 20:42:09 +0000382/// openbsd -- Directly call GNU Binutils assembler and linker
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000383namespace openbsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000384class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
385public:
386 Assembler(const ToolChain &TC)
387 : GnuTool("openbsd::Assembler", "assembler", TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000388
Douglas Katzman95354292015-06-23 20:42:09 +0000389 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000390
Douglas Katzman95354292015-06-23 20:42:09 +0000391 void ConstructJob(Compilation &C, const JobAction &JA,
392 const InputInfo &Output, const InputInfoList &Inputs,
393 const llvm::opt::ArgList &TCArgs,
394 const char *LinkingOutput) const override;
395};
396class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
397public:
398 Linker(const ToolChain &TC) : GnuTool("openbsd::Linker", "linker", TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000399
Douglas Katzman95354292015-06-23 20:42:09 +0000400 bool hasIntegratedCPP() const override { return false; }
401 bool isLinkJob() const override { return true; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000402
Craig Topperb45acb82014-03-14 06:02:07 +0000403 void ConstructJob(Compilation &C, const JobAction &JA,
404 const InputInfo &Output, const InputInfoList &Inputs,
405 const llvm::opt::ArgList &TCArgs,
406 const char *LinkingOutput) const override;
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000407 };
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000408} // end namespace openbsd
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000409
Douglas Katzman95354292015-06-23 20:42:09 +0000410/// bitrig -- Directly call GNU Binutils assembler and linker
Eli Friedman9fa28852012-08-08 23:57:20 +0000411namespace bitrig {
Douglas Katzman95354292015-06-23 20:42:09 +0000412class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
413public:
414 Assembler(const ToolChain &TC)
415 : GnuTool("bitrig::Assembler", "assembler", TC) {}
Eli Friedman9fa28852012-08-08 23:57:20 +0000416
Douglas Katzman95354292015-06-23 20:42:09 +0000417 bool hasIntegratedCPP() const override { return false; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000418
Douglas Katzman95354292015-06-23 20:42:09 +0000419 void ConstructJob(Compilation &C, const JobAction &JA,
420 const InputInfo &Output, const InputInfoList &Inputs,
421 const llvm::opt::ArgList &TCArgs,
422 const char *LinkingOutput) const override;
423};
424class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
425public:
426 Linker(const ToolChain &TC) : GnuTool("bitrig::Linker", "linker", TC) {}
Eli Friedman9fa28852012-08-08 23:57:20 +0000427
Douglas Katzman95354292015-06-23 20:42:09 +0000428 bool hasIntegratedCPP() const override { return false; }
429 bool isLinkJob() const override { return true; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000430
Craig Topperb45acb82014-03-14 06:02:07 +0000431 void ConstructJob(Compilation &C, const JobAction &JA,
432 const InputInfo &Output, const InputInfoList &Inputs,
433 const llvm::opt::ArgList &TCArgs,
434 const char *LinkingOutput) const override;
Eli Friedman9fa28852012-08-08 23:57:20 +0000435 };
436} // end namespace bitrig
437
Douglas Katzman95354292015-06-23 20:42:09 +0000438/// freebsd -- Directly call GNU Binutils assembler and linker
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000439namespace freebsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000440class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
441public:
442 Assembler(const ToolChain &TC)
443 : GnuTool("freebsd::Assembler", "assembler", TC) {}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000444
Douglas Katzman95354292015-06-23 20:42:09 +0000445 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000446
Douglas Katzman95354292015-06-23 20:42:09 +0000447 void ConstructJob(Compilation &C, const JobAction &JA,
448 const InputInfo &Output, const InputInfoList &Inputs,
449 const llvm::opt::ArgList &TCArgs,
450 const char *LinkingOutput) const override;
451};
452class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
453public:
454 Linker(const ToolChain &TC) : GnuTool("freebsd::Linker", "linker", TC) {}
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000455
Douglas Katzman95354292015-06-23 20:42:09 +0000456 bool hasIntegratedCPP() const override { return false; }
457 bool isLinkJob() const override { return true; }
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000458
Craig Topperb45acb82014-03-14 06:02:07 +0000459 void ConstructJob(Compilation &C, const JobAction &JA,
460 const InputInfo &Output, const InputInfoList &Inputs,
461 const llvm::opt::ArgList &TCArgs,
462 const char *LinkingOutput) const override;
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000463 };
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000464} // end namespace freebsd
465
Douglas Katzman95354292015-06-23 20:42:09 +0000466/// netbsd -- Directly call GNU Binutils assembler and linker
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000467namespace netbsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000468class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
Joerg Sonnenberger637603a2011-05-16 13:35:02 +0000469
Douglas Katzman95354292015-06-23 20:42:09 +0000470public:
471 Assembler(const ToolChain &TC)
472 : GnuTool("netbsd::Assembler", "assembler", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000473
Douglas Katzman95354292015-06-23 20:42:09 +0000474 bool hasIntegratedCPP() const override { return false; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000475
Douglas Katzman95354292015-06-23 20:42:09 +0000476 void ConstructJob(Compilation &C, const JobAction &JA,
477 const InputInfo &Output, const InputInfoList &Inputs,
478 const llvm::opt::ArgList &TCArgs,
479 const char *LinkingOutput) const override;
480};
481class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
Joerg Sonnenberger637603a2011-05-16 13:35:02 +0000482
Douglas Katzman95354292015-06-23 20:42:09 +0000483public:
484 Linker(const ToolChain &TC) : GnuTool("netbsd::Linker", "linker", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000485
Douglas Katzman95354292015-06-23 20:42:09 +0000486 bool hasIntegratedCPP() const override { return false; }
487 bool isLinkJob() const override { return true; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000488
Craig Topperb45acb82014-03-14 06:02:07 +0000489 void ConstructJob(Compilation &C, const JobAction &JA,
490 const InputInfo &Output, const InputInfoList &Inputs,
491 const llvm::opt::ArgList &TCArgs,
492 const char *LinkingOutput) const override;
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000493 };
494} // end namespace netbsd
495
Douglas Katzman95354292015-06-23 20:42:09 +0000496/// Directly call GNU Binutils' assembler and linker.
Thomas Schwinge4e555262013-03-28 19:04:25 +0000497namespace gnutools {
Douglas Katzman95354292015-06-23 20:42:09 +0000498class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
499public:
500 Assembler(const ToolChain &TC) : GnuTool("GNU::Assembler", "assembler", TC) {}
Rafael Espindola92b00932010-08-10 00:25:48 +0000501
Douglas Katzman95354292015-06-23 20:42:09 +0000502 bool hasIntegratedCPP() const override { return false; }
503
504 void ConstructJob(Compilation &C, const JobAction &JA,
505 const InputInfo &Output, const InputInfoList &Inputs,
506 const llvm::opt::ArgList &TCArgs,
507 const char *LinkingOutput) const override;
508};
509class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
510public:
511 Linker(const ToolChain &TC) : GnuTool("GNU::Linker", "linker", TC) {}
512
513 bool hasIntegratedCPP() const override { return false; }
514 bool isLinkJob() const override { return true; }
Rafael Espindola92b00932010-08-10 00:25:48 +0000515
Craig Topperb45acb82014-03-14 06:02:07 +0000516 void ConstructJob(Compilation &C, const JobAction &JA,
517 const InputInfo &Output,
518 const InputInfoList &Inputs,
519 const llvm::opt::ArgList &TCArgs,
520 const char *LinkingOutput) const override;
Rafael Espindola92b00932010-08-10 00:25:48 +0000521 };
Douglas Katzman95354292015-06-23 20:42:09 +0000522 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000523
Douglas Katzman95354292015-06-23 20:42:09 +0000524 namespace nacltools {
525 class LLVM_LIBRARY_VISIBILITY AssemblerARM : public gnutools::Assembler {
526 public:
527 AssemblerARM(const ToolChain &TC) : gnutools::Assembler(TC) {}
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000528
Craig Topperb45acb82014-03-14 06:02:07 +0000529 void ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzman95354292015-06-23 20:42:09 +0000530 const InputInfo &Output, const InputInfoList &Inputs,
Craig Topperb45acb82014-03-14 06:02:07 +0000531 const llvm::opt::ArgList &TCArgs,
532 const char *LinkingOutput) const override;
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000533 };
Douglas Katzman95354292015-06-23 20:42:09 +0000534 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000535 public:
Douglas Katzman95354292015-06-23 20:42:09 +0000536 Linker(const ToolChain &TC) : Tool("NaCl::Linker", "linker", TC) {}
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000537
538 bool hasIntegratedCPP() const override { return false; }
539 bool isLinkJob() const override { return true; }
540
541 void ConstructJob(Compilation &C, const JobAction &JA,
542 const InputInfo &Output,
543 const InputInfoList &Inputs,
544 const llvm::opt::ArgList &TCArgs,
545 const char *LinkingOutput) const override;
546 };
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000547}
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000548
Douglas Katzman95354292015-06-23 20:42:09 +0000549/// minix -- Directly call GNU Binutils assembler and linker
Chris Lattner3e2ee142010-07-07 16:01:42 +0000550namespace minix {
Douglas Katzman95354292015-06-23 20:42:09 +0000551class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
552public:
553 Assembler(const ToolChain &TC)
554 : GnuTool("minix::Assembler", "assembler", TC) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000555
Douglas Katzman95354292015-06-23 20:42:09 +0000556 bool hasIntegratedCPP() const override { return false; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000557
Douglas Katzman95354292015-06-23 20:42:09 +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;
562};
563class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
564public:
565 Linker(const ToolChain &TC) : GnuTool("minix::Linker", "linker", TC) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000566
Douglas Katzman95354292015-06-23 20:42:09 +0000567 bool hasIntegratedCPP() const override { return false; }
568 bool isLinkJob() const override { return true; }
Chris Lattner3e2ee142010-07-07 16:01:42 +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;
Chris Lattner3e2ee142010-07-07 16:01:42 +0000575 };
576} // end namespace minix
577
Douglas Katzman95354292015-06-23 20:42:09 +0000578/// solaris -- Directly call Solaris assembler and linker
David Chisnallf571cde2012-02-15 13:39:01 +0000579namespace solaris {
Douglas Katzman95354292015-06-23 20:42:09 +0000580class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
581public:
582 Assembler(const ToolChain &TC)
583 : Tool("solaris::Assembler", "assembler", TC) {}
David Chisnallf571cde2012-02-15 13:39:01 +0000584
Douglas Katzman95354292015-06-23 20:42:09 +0000585 bool hasIntegratedCPP() const override { return false; }
David Chisnallf571cde2012-02-15 13:39:01 +0000586
Douglas Katzman95354292015-06-23 20:42:09 +0000587 void ConstructJob(Compilation &C, const JobAction &JA,
588 const InputInfo &Output, const InputInfoList &Inputs,
589 const llvm::opt::ArgList &TCArgs,
590 const char *LinkingOutput) const override;
591};
592class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
593public:
594 Linker(const ToolChain &TC) : Tool("solaris::Linker", "linker", TC) {}
David Chisnallf571cde2012-02-15 13:39:01 +0000595
Douglas Katzman95354292015-06-23 20:42:09 +0000596 bool hasIntegratedCPP() const override { return false; }
597 bool isLinkJob() const override { return true; }
David Chisnallf571cde2012-02-15 13:39:01 +0000598
Craig Topperb45acb82014-03-14 06:02:07 +0000599 void ConstructJob(Compilation &C, const JobAction &JA,
600 const InputInfo &Output, const InputInfoList &Inputs,
601 const llvm::opt::ArgList &TCArgs,
602 const char *LinkingOutput) const override;
David Chisnallf571cde2012-02-15 13:39:01 +0000603 };
David Chisnalla9ed5d72012-02-15 16:25:46 +0000604} // end namespace solaris
David Chisnallf571cde2012-02-15 13:39:01 +0000605
Douglas Katzman95354292015-06-23 20:42:09 +0000606/// dragonfly -- Directly call GNU Binutils assembler and linker
Daniel Dunbarcc912342009-05-02 18:28:39 +0000607namespace dragonfly {
Douglas Katzman95354292015-06-23 20:42:09 +0000608class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
609public:
610 Assembler(const ToolChain &TC)
611 : GnuTool("dragonfly::Assembler", "assembler", TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000612
Douglas Katzman95354292015-06-23 20:42:09 +0000613 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000614
Douglas Katzman95354292015-06-23 20:42:09 +0000615 void ConstructJob(Compilation &C, const JobAction &JA,
616 const InputInfo &Output, const InputInfoList &Inputs,
617 const llvm::opt::ArgList &TCArgs,
618 const char *LinkingOutput) const override;
619};
620class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
621public:
622 Linker(const ToolChain &TC) : GnuTool("dragonfly::Linker", "linker", TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000623
Douglas Katzman95354292015-06-23 20:42:09 +0000624 bool hasIntegratedCPP() const override { return false; }
625 bool isLinkJob() const override { return true; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000626
Craig Topperb45acb82014-03-14 06:02:07 +0000627 void ConstructJob(Compilation &C, const JobAction &JA,
628 const InputInfo &Output,
629 const InputInfoList &Inputs,
630 const llvm::opt::ArgList &TCArgs,
631 const char *LinkingOutput) const override;
Daniel Dunbarcc912342009-05-02 18:28:39 +0000632 };
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000633} // end namespace dragonfly
Daniel Dunbarcc912342009-05-02 18:28:39 +0000634
Hans Wennborg1da044a2014-06-26 19:59:02 +0000635/// Visual studio tools.
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000636namespace visualstudio {
Douglas Katzman95354292015-06-23 20:42:09 +0000637VersionTuple getMSVCVersion(const Driver *D, const llvm::Triple &Triple,
638 const llvm::opt::ArgList &Args, bool IsWindowsMSVC);
David Majnemere11d3732015-06-08 00:22:46 +0000639
Douglas Katzman95354292015-06-23 20:42:09 +0000640class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
641public:
642 Linker(const ToolChain &TC)
643 : Tool("visualstudio::Linker", "linker", TC, RF_Full,
644 llvm::sys::WEM_UTF16) {}
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000645
Douglas Katzman95354292015-06-23 20:42:09 +0000646 bool hasIntegratedCPP() const override { return false; }
Craig Topperb45acb82014-03-14 06:02:07 +0000647 bool isLinkJob() const override { return true; }
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000648
Craig Topperb45acb82014-03-14 06:02:07 +0000649 void ConstructJob(Compilation &C, const JobAction &JA,
650 const InputInfo &Output, const InputInfoList &Inputs,
651 const llvm::opt::ArgList &TCArgs,
652 const char *LinkingOutput) const override;
Douglas Katzman95354292015-06-23 20:42:09 +0000653};
Hans Wennborg87cfa712013-09-19 20:32:16 +0000654
Douglas Katzman95354292015-06-23 20:42:09 +0000655class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
656public:
657 Compiler(const ToolChain &TC)
658 : Tool("visualstudio::Compiler", "compiler", TC, RF_Full,
659 llvm::sys::WEM_UTF16) {}
Hans Wennborg87cfa712013-09-19 20:32:16 +0000660
Douglas Katzman95354292015-06-23 20:42:09 +0000661 bool hasIntegratedAssembler() const override { return true; }
Craig Topperb45acb82014-03-14 06:02:07 +0000662 bool hasIntegratedCPP() const override { return true; }
663 bool isLinkJob() const override { return false; }
Hans Wennborg87cfa712013-09-19 20:32:16 +0000664
Craig Topperb45acb82014-03-14 06:02:07 +0000665 void ConstructJob(Compilation &C, const JobAction &JA,
666 const InputInfo &Output, const InputInfoList &Inputs,
667 const llvm::opt::ArgList &TCArgs,
668 const char *LinkingOutput) const override;
Hans Wennborg87cfa712013-09-19 20:32:16 +0000669
David Blaikiec11bf802014-09-04 16:04:28 +0000670 std::unique_ptr<Command> GetCommand(Compilation &C, const JobAction &JA,
671 const InputInfo &Output,
672 const InputInfoList &Inputs,
673 const llvm::opt::ArgList &TCArgs,
674 const char *LinkingOutput) const;
Hans Wennborg87cfa712013-09-19 20:32:16 +0000675 };
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000676} // end namespace visualstudio
677
Yaron Keren1c0070c2015-07-02 04:45:27 +0000678/// MinGW -- Directly call GNU Binutils assembler and linker
679namespace MinGW {
680class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
681public:
682 Assembler(const ToolChain &TC) : Tool("MinGW::Assemble", "assembler", TC) {}
683
684 bool hasIntegratedCPP() const override { return false; }
685
686 void ConstructJob(Compilation &C, const JobAction &JA,
687 const InputInfo &Output, const InputInfoList &Inputs,
688 const llvm::opt::ArgList &TCArgs,
689 const char *LinkingOutput) const override;
690};
691
692class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
693public:
694 Linker(const ToolChain &TC) : Tool("MinGW::Linker", "linker", TC) {}
695
696 bool hasIntegratedCPP() const override { return false; }
697 bool isLinkJob() const override { return true; }
698
699 void ConstructJob(Compilation &C, const JobAction &JA,
700 const InputInfo &Output, const InputInfoList &Inputs,
701 const llvm::opt::ArgList &TCArgs,
702 const char *LinkingOutput) const override;
703
704private:
705 void AddLibGCC(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs) const;
706};
707} // end namespace MinGW
708
Tim Northover9c7e0352013-12-12 11:55:52 +0000709namespace arm {
710 StringRef getARMFloatABI(const Driver &D, const llvm::opt::ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000711 const llvm::Triple &Triple);
Tim Northover9c7e0352013-12-12 11:55:52 +0000712}
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000713namespace XCore {
Douglas Katzman95354292015-06-23 20:42:09 +0000714// For XCore, we do not need to instantiate tools for PreProcess, PreCompile and
715// Compile.
716// We simply use "clang -cc1" for those actions.
717class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000718public:
Douglas Katzman95354292015-06-23 20:42:09 +0000719 Assembler(const ToolChain &TC) : Tool("XCore::Assembler", "XCore-as", TC) {}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000720
721 bool hasIntegratedCPP() const override { return false; }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000722 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
Douglas Katzman95354292015-06-23 20:42:09 +0000728class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000729public:
Douglas Katzman95354292015-06-23 20:42:09 +0000730 Linker(const ToolChain &TC) : Tool("XCore::Linker", "XCore-ld", TC) {}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000731
732 bool hasIntegratedCPP() const override { return false; }
Douglas Katzman95354292015-06-23 20:42:09 +0000733 bool isLinkJob() const override { return true; }
734 void ConstructJob(Compilation &C, const JobAction &JA,
735 const InputInfo &Output, const InputInfoList &Inputs,
736 const llvm::opt::ArgList &TCArgs,
737 const char *LinkingOutput) const override;
738 };
739 } // end namespace XCore.
740
741 namespace CrossWindows {
742 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
743 public:
744 Assembler(const ToolChain &TC)
745 : Tool("CrossWindows::Assembler", "as", TC) {}
746
747 bool hasIntegratedCPP() const override { return false; }
748
749 void ConstructJob(Compilation &C, const JobAction &JA,
750 const InputInfo &Output, const InputInfoList &Inputs,
751 const llvm::opt::ArgList &TCArgs,
752 const char *LinkingOutput) const override;
753 };
754
755 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
756 public:
757 Linker(const ToolChain &TC)
758 : Tool("CrossWindows::Linker", "ld", TC, RF_Full) {}
759
760 bool hasIntegratedCPP() const override { return false; }
761 bool isLinkJob() const override { return true; }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000762
763 void ConstructJob(Compilation &C, const JobAction &JA,
764 const InputInfo &Output, const InputInfoList &Inputs,
765 const llvm::opt::ArgList &TCArgs,
766 const char *LinkingOutput) const override;
767};
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000768}
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000769
Douglas Katzman84a75642015-06-19 14:55:19 +0000770/// SHAVE tools -- Directly call moviCompile and moviAsm
771namespace SHAVE {
Douglas Katzman95354292015-06-23 20:42:09 +0000772class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
Douglas Katzman84a75642015-06-19 14:55:19 +0000773public:
Douglas Katzman95354292015-06-23 20:42:09 +0000774 Compiler(const ToolChain &TC) : Tool("moviCompile", "movicompile", TC) {}
Douglas Katzman84a75642015-06-19 14:55:19 +0000775
776 bool hasIntegratedCPP() const override { return true; }
777
778 void ConstructJob(Compilation &C, const JobAction &JA,
779 const InputInfo &Output, const InputInfoList &Inputs,
780 const llvm::opt::ArgList &TCArgs,
781 const char *LinkingOutput) const override;
782};
783
Douglas Katzman95354292015-06-23 20:42:09 +0000784class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
Douglas Katzman84a75642015-06-19 14:55:19 +0000785public:
Douglas Katzman95354292015-06-23 20:42:09 +0000786 Assembler(const ToolChain &TC) : Tool("moviAsm", "moviAsm", TC) {}
Douglas Katzman84a75642015-06-19 14:55:19 +0000787
788 bool hasIntegratedCPP() const override { return false; } // not sure.
789
790 void ConstructJob(Compilation &C, const JobAction &JA,
791 const InputInfo &Output, const InputInfoList &Inputs,
792 const llvm::opt::ArgList &TCArgs,
793 const char *LinkingOutput) const override;
794};
795} // end namespace SHAVE
796
Douglas Katzman9dc5fbb2015-06-03 16:56:50 +0000797} // end namespace tools
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000798} // end namespace driver
799} // end namespace clang
800
Benjamin Kramer2f5db8b2014-08-13 16:25:19 +0000801#endif