blob: 0a51b94a83e3895983c0eb181a00f2a7a37bd3df [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
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
Douglas Katzman95354292015-06-23 20:42:09 +000089 visualstudio::Compiler *getCLFallback() const;
Hans Wennborg1da044a2014-06-26 19:59:02 +000090
Douglas Katzman95354292015-06-23 20:42:09 +000091 mutable std::unique_ptr<visualstudio::Compiler> CLFallback;
Hans Wennborg1da044a2014-06-26 19:59:02 +000092
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000093 public:
Douglas Katzman95354292015-06-23 20:42:09 +000094 // CAUTION! The first constructor argument ("clang") is not arbitrary,
95 // as it is for other tools. Some operations on a Tool actually test
96 // whether that tool is Clang based on the Tool's Name as a string.
Reid Kleckner0290c9c2014-09-15 17:45:39 +000097 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC, RF_Full) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000098
Craig Topperb45acb82014-03-14 06:02:07 +000099 bool hasGoodDiagnostics() const override { return true; }
100 bool hasIntegratedAssembler() const override { return true; }
101 bool hasIntegratedCPP() const override { return true; }
Bob Wilson23a55f12014-12-21 07:00:00 +0000102 bool canEmitIR() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000103
Craig Topperb45acb82014-03-14 06:02:07 +0000104 void ConstructJob(Compilation &C, const JobAction &JA,
105 const InputInfo &Output, const InputInfoList &Inputs,
106 const llvm::opt::ArgList &TCArgs,
107 const char *LinkingOutput) const override;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000108 };
109
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000110 /// \brief Clang integrated assembler tool.
111 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
112 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000113 ClangAs(const ToolChain &TC) : Tool("clang::as",
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000114 "clang integrated assembler", TC,
115 RF_Full) {}
Daniel Sanders7f933f42015-01-30 17:35:23 +0000116 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
117 llvm::opt::ArgStringList &CmdArgs) const;
Craig Topperb45acb82014-03-14 06:02:07 +0000118 bool hasGoodDiagnostics() const override { return true; }
119 bool hasIntegratedAssembler() const override { return false; }
120 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000121
Craig Topperb45acb82014-03-14 06:02:07 +0000122 void ConstructJob(Compilation &C, const JobAction &JA,
123 const InputInfo &Output, const InputInfoList &Inputs,
124 const llvm::opt::ArgList &TCArgs,
125 const char *LinkingOutput) const override;
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000126 };
127
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000128 /// \brief Base class for all GNU tools that provide the same behavior when
129 /// it comes to response files support
130 class GnuTool : public Tool {
131 virtual void anchor();
132
133 public:
134 GnuTool(const char *Name, const char *ShortName, const ToolChain &TC)
135 : Tool(Name, ShortName, TC, RF_Full, llvm::sys::WEM_CurrentCodePage) {}
136 };
137
Daniel Dunbar82116f82009-03-17 22:45:24 +0000138 /// gcc - Generic GCC tool implementations.
139namespace gcc {
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000140 class LLVM_LIBRARY_VISIBILITY Common : public GnuTool {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000141 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000142 Common(const char *Name, const char *ShortName,
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000143 const ToolChain &TC) : GnuTool(Name, ShortName, TC) {}
Daniel Dunbara3246a02009-03-18 08:07:30 +0000144
Craig Topperb45acb82014-03-14 06:02:07 +0000145 void ConstructJob(Compilation &C, const JobAction &JA,
146 const InputInfo &Output,
147 const InputInfoList &Inputs,
148 const llvm::opt::ArgList &TCArgs,
149 const char *LinkingOutput) const override;
Daniel Dunbara3246a02009-03-18 08:07:30 +0000150
151 /// RenderExtraToolArgs - Render any arguments necessary to force
152 /// the particular tool mode.
Reid Kleckner724c21c2013-06-17 13:59:19 +0000153 virtual void
Douglas Katzman95354292015-06-23 20:42:09 +0000154 RenderExtraToolArgs(const JobAction &JA,
155 llvm::opt::ArgStringList &CmdArgs) const = 0;
Daniel Dunbara3246a02009-03-18 08:07:30 +0000156 };
157
Douglas Katzman95354292015-06-23 20:42:09 +0000158 class LLVM_LIBRARY_VISIBILITY Preprocessor : public Common {
Daniel Dunbara3246a02009-03-18 08:07:30 +0000159 public:
Douglas Katzman95354292015-06-23 20:42:09 +0000160 Preprocessor(const ToolChain &TC)
161 : Common("gcc::Preprocessor", "gcc preprocessor", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000162
Craig Topperb45acb82014-03-14 06:02:07 +0000163 bool hasGoodDiagnostics() const override { return true; }
164 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000165
Craig Topperb45acb82014-03-14 06:02:07 +0000166 void RenderExtraToolArgs(const JobAction &JA,
167 llvm::opt::ArgStringList &CmdArgs) const override;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000168 };
169
Douglas Katzman95354292015-06-23 20:42:09 +0000170 class LLVM_LIBRARY_VISIBILITY Compiler : public Common {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000171 public:
Douglas Katzman95354292015-06-23 20:42:09 +0000172 Compiler(const ToolChain &TC)
173 : Common("gcc::Compiler", "gcc frontend", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000174
Craig Topperb45acb82014-03-14 06:02:07 +0000175 bool hasGoodDiagnostics() const override { return true; }
176 bool hasIntegratedCPP() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000177
Craig Topperb45acb82014-03-14 06:02:07 +0000178 void RenderExtraToolArgs(const JobAction &JA,
179 llvm::opt::ArgStringList &CmdArgs) const override;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000180 };
181
Douglas Katzman95354292015-06-23 20:42:09 +0000182 class LLVM_LIBRARY_VISIBILITY Linker : public Common {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000183 public:
Douglas Katzman95354292015-06-23 20:42:09 +0000184 Linker(const ToolChain &TC)
185 : Common("gcc::Linker", "linker (via gcc)", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000186
Craig Topperb45acb82014-03-14 06:02:07 +0000187 bool hasIntegratedCPP() const override { return false; }
188 bool isLinkJob() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000189
Craig Topperb45acb82014-03-14 06:02:07 +0000190 void RenderExtraToolArgs(const JobAction &JA,
191 llvm::opt::ArgStringList &CmdArgs) const override;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000192 };
Daniel Dunbar82116f82009-03-17 22:45:24 +0000193} // end namespace gcc
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000194
Tony Linthicum76329bf2011-12-12 21:14:55 +0000195namespace hexagon {
Douglas Katzman95354292015-06-23 20:42:09 +0000196// For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile
197// and Compile.
198// We simply use "clang -cc1" for those actions.
199class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
200public:
201 Assembler(const ToolChain &TC)
202 : GnuTool("hexagon::Assembler", "hexagon-as", TC) {}
Tony Linthicum76329bf2011-12-12 21:14:55 +0000203
Douglas Katzman95354292015-06-23 20:42:09 +0000204 bool hasIntegratedCPP() const override { return false; }
Tony Linthicum76329bf2011-12-12 21:14:55 +0000205
Craig Topperf85c6ce2014-03-14 06:06:19 +0000206 void RenderExtraToolArgs(const JobAction &JA,
207 llvm::opt::ArgStringList &CmdArgs) const;
Craig Topperb45acb82014-03-14 06:02:07 +0000208 void ConstructJob(Compilation &C, const JobAction &JA,
209 const InputInfo &Output, const InputInfoList &Inputs,
210 const llvm::opt::ArgList &TCArgs,
211 const char *LinkingOutput) const override;
Douglas Katzman95354292015-06-23 20:42:09 +0000212};
Tony Linthicum76329bf2011-12-12 21:14:55 +0000213
Douglas Katzman95354292015-06-23 20:42:09 +0000214class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
215public:
216 Linker(const ToolChain &TC) : GnuTool("hexagon::Linker", "hexagon-ld", TC) {}
Tony Linthicum76329bf2011-12-12 21:14:55 +0000217
Douglas Katzman95354292015-06-23 20:42:09 +0000218 bool hasIntegratedCPP() const override { return false; }
Craig Topperb45acb82014-03-14 06:02:07 +0000219 bool isLinkJob() const override { return true; }
Tony Linthicum76329bf2011-12-12 21:14:55 +0000220
221 virtual void RenderExtraToolArgs(const JobAction &JA,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000222 llvm::opt::ArgStringList &CmdArgs) const;
Craig Topperb45acb82014-03-14 06:02:07 +0000223 void ConstructJob(Compilation &C, const JobAction &JA,
224 const InputInfo &Output, const InputInfoList &Inputs,
225 const llvm::opt::ArgList &TCArgs,
226 const char *LinkingOutput) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +0000227 };
228} // end namespace hexagon.
229
Bernard Ogden31561762013-12-12 13:27:11 +0000230namespace arm {
Gabor Ballabas208826c2015-06-04 17:56:32 +0000231 std::string getARMTargetCPU(const llvm::opt::ArgList &Args,
232 const llvm::Triple &Triple);
Gabor Ballabascebcb3b2015-06-11 12:29:56 +0000233 const std::string getARMArch(const llvm::opt::ArgList &Args,
234 const llvm::Triple &Triple);
Bernard Ogden31561762013-12-12 13:27:11 +0000235 const char* getARMCPUForMArch(const llvm::opt::ArgList &Args,
236 const llvm::Triple &Triple);
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000237 const char* getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +0000238
239 void appendEBLinkFlags(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple);
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000240}
Tony Linthicum76329bf2011-12-12 21:14:55 +0000241
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000242namespace mips {
Petar Jovanovic1dbc3172015-04-14 12:49:08 +0000243 typedef enum {
244 NanLegacy = 1,
245 Nan2008 = 2
246 } NanEncoding;
247 NanEncoding getSupportedNanEncoding(StringRef &CPU);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +0000248 void getMipsCPUAndABI(const llvm::opt::ArgList &Args,
249 const llvm::Triple &Triple, StringRef &CPUName,
250 StringRef &ABIName);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000251 bool hasMipsAbiArg(const llvm::opt::ArgList &Args, const char *Value);
Simon Atanasyand95c67d2014-08-13 14:34:14 +0000252 bool isUCLibc(const llvm::opt::ArgList &Args);
Daniel Sanders2bf13662014-07-10 14:40:57 +0000253 bool isNaN2008(const llvm::opt::ArgList &Args, const llvm::Triple &Triple);
Daniel Sanders379d44b2014-07-16 11:52:23 +0000254 bool isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Toma Tabacu94ea6862015-06-16 13:54:13 +0000255 StringRef ABIName, StringRef FloatABI);
256 bool shouldUseFPXX(const llvm::opt::ArgList &Args, const llvm::Triple &Triple,
257 StringRef CPUName, StringRef ABIName, StringRef FloatABI);
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000258}
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000259
Ulrich Weigand8afad612014-07-28 13:17:52 +0000260namespace ppc {
261 bool hasPPCAbiArg(const llvm::opt::ArgList &Args, const char *Value);
262}
263
Douglas Katzman95354292015-06-23 20:42:09 +0000264/// cloudabi -- Directly call GNU Binutils linker
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000265namespace cloudabi {
Douglas Katzman95354292015-06-23 20:42:09 +0000266class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000267public:
Douglas Katzman95354292015-06-23 20:42:09 +0000268 Linker(const ToolChain &TC) : GnuTool("cloudabi::Linker", "linker", TC) {}
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000269
270 bool hasIntegratedCPP() const override { return false; }
271 bool isLinkJob() const override { return true; }
272
273 void ConstructJob(Compilation &C, const JobAction &JA,
274 const InputInfo &Output, const InputInfoList &Inputs,
275 const llvm::opt::ArgList &TCArgs,
276 const char *LinkingOutput) const override;
277};
278} // end namespace cloudabi
279
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000280namespace darwin {
Tim Northover157d9112014-01-16 08:48:16 +0000281 llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
282 void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
Rafael Espindoladcbf6982012-10-31 18:51:07 +0000283
Tim Northover157d9112014-01-16 08:48:16 +0000284 class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
David Blaikie68e081d2011-12-20 02:48:34 +0000285 virtual void anchor();
Daniel Dunbare9ded432009-09-09 18:36:20 +0000286 protected:
Tim Northover157d9112014-01-16 08:48:16 +0000287 void AddMachOArch(const llvm::opt::ArgList &Args,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000288 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbare9ded432009-09-09 18:36:20 +0000289
Tim Northover157d9112014-01-16 08:48:16 +0000290 const toolchains::MachO &getMachOToolChain() const {
291 return reinterpret_cast<const toolchains::MachO&>(getToolChain());
Daniel Dunbare9ded432009-09-09 18:36:20 +0000292 }
293
294 public:
Douglas Katzman95354292015-06-23 20:42:09 +0000295 MachOTool(
296 const char *Name, const char *ShortName, const ToolChain &TC,
297 ResponseFileSupport ResponseSupport = RF_None,
298 llvm::sys::WindowsEncodingMethod ResponseEncoding = llvm::sys::WEM_UTF8,
299 const char *ResponseFlag = "@")
300 : Tool(Name, ShortName, TC, ResponseSupport, ResponseEncoding,
301 ResponseFlag) {}
Daniel Dunbare9ded432009-09-09 18:36:20 +0000302 };
303
Douglas Katzman95354292015-06-23 20:42:09 +0000304 class LLVM_LIBRARY_VISIBILITY Assembler : public MachOTool {
Daniel Dunbarbe220842009-03-20 16:06:39 +0000305 public:
Douglas Katzman95354292015-06-23 20:42:09 +0000306 Assembler(const ToolChain &TC)
307 : MachOTool("darwin::Assembler", "assembler", TC) {}
Daniel Dunbarbe220842009-03-20 16:06:39 +0000308
Craig Topperb45acb82014-03-14 06:02:07 +0000309 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarbe220842009-03-20 16:06:39 +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 Dunbarbe220842009-03-20 16:06:39 +0000315 };
316
Douglas Katzman95354292015-06-23 20:42:09 +0000317 class LLVM_LIBRARY_VISIBILITY Linker : public MachOTool {
Bill Wendling3b2000f2012-10-02 18:02:50 +0000318 bool NeedsTempPath(const InputInfoList &Inputs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +0000319 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
320 llvm::opt::ArgStringList &CmdArgs,
321 const InputInfoList &Inputs) const;
Daniel Dunbarc1964212009-03-26 16:23:12 +0000322
Daniel Dunbarc1964212009-03-26 16:23:12 +0000323 public:
Douglas Katzman95354292015-06-23 20:42:09 +0000324 Linker(const ToolChain &TC)
325 : MachOTool("darwin::Linker", "linker", TC, RF_FileList,
326 llvm::sys::WEM_UTF8, "-filelist") {}
Daniel Dunbarc1964212009-03-26 16:23:12 +0000327
Craig Topperb45acb82014-03-14 06:02:07 +0000328 bool hasIntegratedCPP() const override { return false; }
329 bool isLinkJob() const override { return true; }
Daniel Dunbarc1964212009-03-26 16:23:12 +0000330
Craig Topperb45acb82014-03-14 06:02:07 +0000331 void ConstructJob(Compilation &C, const JobAction &JA,
332 const InputInfo &Output, const InputInfoList &Inputs,
333 const llvm::opt::ArgList &TCArgs,
334 const char *LinkingOutput) const override;
Daniel Dunbarc1964212009-03-26 16:23:12 +0000335 };
336
Tim Northover157d9112014-01-16 08:48:16 +0000337 class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000338 public:
Tim Northover157d9112014-01-16 08:48:16 +0000339 Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000340
Craig Topperb45acb82014-03-14 06:02:07 +0000341 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000342
Craig Topperb45acb82014-03-14 06:02:07 +0000343 void ConstructJob(Compilation &C, const JobAction &JA,
344 const InputInfo &Output, const InputInfoList &Inputs,
345 const llvm::opt::ArgList &TCArgs,
346 const char *LinkingOutput) const override;
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000347 };
Daniel Dunbar88299622010-06-04 18:28:36 +0000348
Tim Northover157d9112014-01-16 08:48:16 +0000349 class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool {
Daniel Dunbar88299622010-06-04 18:28:36 +0000350 public:
Tim Northover157d9112014-01-16 08:48:16 +0000351 Dsymutil(const ToolChain &TC) : MachOTool("darwin::Dsymutil",
352 "dsymutil", TC) {}
Daniel Dunbar88299622010-06-04 18:28:36 +0000353
Craig Topperb45acb82014-03-14 06:02:07 +0000354 bool hasIntegratedCPP() const override { return false; }
355 bool isDsymutilJob() const override { return true; }
Daniel Dunbar88299622010-06-04 18:28:36 +0000356
Craig Topperb45acb82014-03-14 06:02:07 +0000357 void ConstructJob(Compilation &C, const JobAction &JA,
358 const InputInfo &Output,
359 const InputInfoList &Inputs,
360 const llvm::opt::ArgList &TCArgs,
361 const char *LinkingOutput) const override;
Daniel Dunbar88299622010-06-04 18:28:36 +0000362 };
Eric Christopher551ef452011-08-23 17:56:55 +0000363
Tim Northover157d9112014-01-16 08:48:16 +0000364 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool {
Eric Christopher551ef452011-08-23 17:56:55 +0000365 public:
Tim Northover157d9112014-01-16 08:48:16 +0000366 VerifyDebug(const ToolChain &TC) : MachOTool("darwin::VerifyDebug",
367 "dwarfdump", TC) {}
Eric Christopher551ef452011-08-23 17:56:55 +0000368
Craig Topperb45acb82014-03-14 06:02:07 +0000369 bool hasIntegratedCPP() const override { return false; }
Eric Christopher551ef452011-08-23 17:56:55 +0000370
Craig Topperb45acb82014-03-14 06:02:07 +0000371 void ConstructJob(Compilation &C, const JobAction &JA,
372 const InputInfo &Output, const InputInfoList &Inputs,
373 const llvm::opt::ArgList &TCArgs,
374 const char *LinkingOutput) const override;
Eric Christopher551ef452011-08-23 17:56:55 +0000375 };
376
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000377}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000378
Douglas Katzman95354292015-06-23 20:42:09 +0000379/// openbsd -- Directly call GNU Binutils assembler and linker
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000380namespace openbsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000381class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
382public:
383 Assembler(const ToolChain &TC)
384 : GnuTool("openbsd::Assembler", "assembler", TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000385
Douglas Katzman95354292015-06-23 20:42:09 +0000386 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000387
Douglas Katzman95354292015-06-23 20:42:09 +0000388 void ConstructJob(Compilation &C, const JobAction &JA,
389 const InputInfo &Output, const InputInfoList &Inputs,
390 const llvm::opt::ArgList &TCArgs,
391 const char *LinkingOutput) const override;
392};
393class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
394public:
395 Linker(const ToolChain &TC) : GnuTool("openbsd::Linker", "linker", TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000396
Douglas Katzman95354292015-06-23 20:42:09 +0000397 bool hasIntegratedCPP() const override { return false; }
398 bool isLinkJob() const override { return true; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000399
Craig Topperb45acb82014-03-14 06:02:07 +0000400 void ConstructJob(Compilation &C, const JobAction &JA,
401 const InputInfo &Output, const InputInfoList &Inputs,
402 const llvm::opt::ArgList &TCArgs,
403 const char *LinkingOutput) const override;
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000404 };
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000405} // end namespace openbsd
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000406
Douglas Katzman95354292015-06-23 20:42:09 +0000407/// bitrig -- Directly call GNU Binutils assembler and linker
Eli Friedman9fa28852012-08-08 23:57:20 +0000408namespace bitrig {
Douglas Katzman95354292015-06-23 20:42:09 +0000409class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
410public:
411 Assembler(const ToolChain &TC)
412 : GnuTool("bitrig::Assembler", "assembler", TC) {}
Eli Friedman9fa28852012-08-08 23:57:20 +0000413
Douglas Katzman95354292015-06-23 20:42:09 +0000414 bool hasIntegratedCPP() const override { return false; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000415
Douglas Katzman95354292015-06-23 20:42:09 +0000416 void ConstructJob(Compilation &C, const JobAction &JA,
417 const InputInfo &Output, const InputInfoList &Inputs,
418 const llvm::opt::ArgList &TCArgs,
419 const char *LinkingOutput) const override;
420};
421class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
422public:
423 Linker(const ToolChain &TC) : GnuTool("bitrig::Linker", "linker", TC) {}
Eli Friedman9fa28852012-08-08 23:57:20 +0000424
Douglas Katzman95354292015-06-23 20:42:09 +0000425 bool hasIntegratedCPP() const override { return false; }
426 bool isLinkJob() const override { return true; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000427
Craig Topperb45acb82014-03-14 06:02:07 +0000428 void ConstructJob(Compilation &C, const JobAction &JA,
429 const InputInfo &Output, const InputInfoList &Inputs,
430 const llvm::opt::ArgList &TCArgs,
431 const char *LinkingOutput) const override;
Eli Friedman9fa28852012-08-08 23:57:20 +0000432 };
433} // end namespace bitrig
434
Douglas Katzman95354292015-06-23 20:42:09 +0000435/// freebsd -- Directly call GNU Binutils assembler and linker
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000436namespace freebsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000437class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
438public:
439 Assembler(const ToolChain &TC)
440 : GnuTool("freebsd::Assembler", "assembler", TC) {}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000441
Douglas Katzman95354292015-06-23 20:42:09 +0000442 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000443
Douglas Katzman95354292015-06-23 20:42:09 +0000444 void ConstructJob(Compilation &C, const JobAction &JA,
445 const InputInfo &Output, const InputInfoList &Inputs,
446 const llvm::opt::ArgList &TCArgs,
447 const char *LinkingOutput) const override;
448};
449class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
450public:
451 Linker(const ToolChain &TC) : GnuTool("freebsd::Linker", "linker", TC) {}
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000452
Douglas Katzman95354292015-06-23 20:42:09 +0000453 bool hasIntegratedCPP() const override { return false; }
454 bool isLinkJob() const override { return true; }
Daniel Dunbard854c8d2009-04-01 19:36:32 +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;
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000460 };
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000461} // end namespace freebsd
462
Douglas Katzman95354292015-06-23 20:42:09 +0000463/// netbsd -- Directly call GNU Binutils assembler and linker
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000464namespace netbsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000465class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
Joerg Sonnenberger637603a2011-05-16 13:35:02 +0000466
Douglas Katzman95354292015-06-23 20:42:09 +0000467public:
468 Assembler(const ToolChain &TC)
469 : GnuTool("netbsd::Assembler", "assembler", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000470
Douglas Katzman95354292015-06-23 20:42:09 +0000471 bool hasIntegratedCPP() const override { return false; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000472
Douglas Katzman95354292015-06-23 20:42:09 +0000473 void ConstructJob(Compilation &C, const JobAction &JA,
474 const InputInfo &Output, const InputInfoList &Inputs,
475 const llvm::opt::ArgList &TCArgs,
476 const char *LinkingOutput) const override;
477};
478class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
Joerg Sonnenberger637603a2011-05-16 13:35:02 +0000479
Douglas Katzman95354292015-06-23 20:42:09 +0000480public:
481 Linker(const ToolChain &TC) : GnuTool("netbsd::Linker", "linker", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000482
Douglas Katzman95354292015-06-23 20:42:09 +0000483 bool hasIntegratedCPP() const override { return false; }
484 bool isLinkJob() const override { return true; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000485
Craig Topperb45acb82014-03-14 06:02:07 +0000486 void ConstructJob(Compilation &C, const JobAction &JA,
487 const InputInfo &Output, const InputInfoList &Inputs,
488 const llvm::opt::ArgList &TCArgs,
489 const char *LinkingOutput) const override;
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000490 };
491} // end namespace netbsd
492
Douglas Katzman95354292015-06-23 20:42:09 +0000493/// Directly call GNU Binutils' assembler and linker.
Thomas Schwinge4e555262013-03-28 19:04:25 +0000494namespace gnutools {
Douglas Katzman95354292015-06-23 20:42:09 +0000495class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
496public:
497 Assembler(const ToolChain &TC) : GnuTool("GNU::Assembler", "assembler", TC) {}
Rafael Espindola92b00932010-08-10 00:25:48 +0000498
Douglas Katzman95354292015-06-23 20:42:09 +0000499 bool hasIntegratedCPP() const override { return false; }
500
501 void ConstructJob(Compilation &C, const JobAction &JA,
502 const InputInfo &Output, const InputInfoList &Inputs,
503 const llvm::opt::ArgList &TCArgs,
504 const char *LinkingOutput) const override;
505};
506class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
507public:
508 Linker(const ToolChain &TC) : GnuTool("GNU::Linker", "linker", TC) {}
509
510 bool hasIntegratedCPP() const override { return false; }
511 bool isLinkJob() const override { return true; }
Rafael Espindola92b00932010-08-10 00:25:48 +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;
Rafael Espindola92b00932010-08-10 00:25:48 +0000518 };
Douglas Katzman95354292015-06-23 20:42:09 +0000519 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000520
Douglas Katzman95354292015-06-23 20:42:09 +0000521 namespace nacltools {
522 class LLVM_LIBRARY_VISIBILITY AssemblerARM : public gnutools::Assembler {
523 public:
524 AssemblerARM(const ToolChain &TC) : gnutools::Assembler(TC) {}
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000525
Craig Topperb45acb82014-03-14 06:02:07 +0000526 void ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzman95354292015-06-23 20:42:09 +0000527 const InputInfo &Output, const InputInfoList &Inputs,
Craig Topperb45acb82014-03-14 06:02:07 +0000528 const llvm::opt::ArgList &TCArgs,
529 const char *LinkingOutput) const override;
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000530 };
Douglas Katzman95354292015-06-23 20:42:09 +0000531 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000532 public:
Douglas Katzman95354292015-06-23 20:42:09 +0000533 Linker(const ToolChain &TC) : Tool("NaCl::Linker", "linker", TC) {}
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000534
535 bool hasIntegratedCPP() const override { return false; }
536 bool isLinkJob() const override { return true; }
537
538 void ConstructJob(Compilation &C, const JobAction &JA,
539 const InputInfo &Output,
540 const InputInfoList &Inputs,
541 const llvm::opt::ArgList &TCArgs,
542 const char *LinkingOutput) const override;
543 };
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000544}
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000545
Douglas Katzman95354292015-06-23 20:42:09 +0000546/// minix -- Directly call GNU Binutils assembler and linker
Chris Lattner3e2ee142010-07-07 16:01:42 +0000547namespace minix {
Douglas Katzman95354292015-06-23 20:42:09 +0000548class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
549public:
550 Assembler(const ToolChain &TC)
551 : GnuTool("minix::Assembler", "assembler", TC) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000552
Douglas Katzman95354292015-06-23 20:42:09 +0000553 bool hasIntegratedCPP() const override { return false; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000554
Douglas Katzman95354292015-06-23 20:42:09 +0000555 void ConstructJob(Compilation &C, const JobAction &JA,
556 const InputInfo &Output, const InputInfoList &Inputs,
557 const llvm::opt::ArgList &TCArgs,
558 const char *LinkingOutput) const override;
559};
560class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
561public:
562 Linker(const ToolChain &TC) : GnuTool("minix::Linker", "linker", TC) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000563
Douglas Katzman95354292015-06-23 20:42:09 +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
Douglas Katzman95354292015-06-23 20:42:09 +0000575/// solaris -- Directly call Solaris assembler and linker
David Chisnallf571cde2012-02-15 13:39:01 +0000576namespace solaris {
Douglas Katzman95354292015-06-23 20:42:09 +0000577class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
578public:
579 Assembler(const ToolChain &TC)
580 : Tool("solaris::Assembler", "assembler", TC) {}
David Chisnallf571cde2012-02-15 13:39:01 +0000581
Douglas Katzman95354292015-06-23 20:42:09 +0000582 bool hasIntegratedCPP() const override { return false; }
David Chisnallf571cde2012-02-15 13:39:01 +0000583
Douglas Katzman95354292015-06-23 20:42:09 +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;
588};
589class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
590public:
591 Linker(const ToolChain &TC) : Tool("solaris::Linker", "linker", TC) {}
David Chisnallf571cde2012-02-15 13:39:01 +0000592
Douglas Katzman95354292015-06-23 20:42:09 +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
Douglas Katzman95354292015-06-23 20:42:09 +0000603/// dragonfly -- Directly call GNU Binutils assembler and linker
Daniel Dunbarcc912342009-05-02 18:28:39 +0000604namespace dragonfly {
Douglas Katzman95354292015-06-23 20:42:09 +0000605class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
606public:
607 Assembler(const ToolChain &TC)
608 : GnuTool("dragonfly::Assembler", "assembler", TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000609
Douglas Katzman95354292015-06-23 20:42:09 +0000610 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000611
Douglas Katzman95354292015-06-23 20:42:09 +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;
616};
617class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
618public:
619 Linker(const ToolChain &TC) : GnuTool("dragonfly::Linker", "linker", TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000620
Douglas Katzman95354292015-06-23 20:42:09 +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 {
Douglas Katzman95354292015-06-23 20:42:09 +0000634VersionTuple getMSVCVersion(const Driver *D, const llvm::Triple &Triple,
635 const llvm::opt::ArgList &Args, bool IsWindowsMSVC);
David Majnemere11d3732015-06-08 00:22:46 +0000636
Douglas Katzman95354292015-06-23 20:42:09 +0000637class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
638public:
639 Linker(const ToolChain &TC)
640 : Tool("visualstudio::Linker", "linker", TC, RF_Full,
641 llvm::sys::WEM_UTF16) {}
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000642
Douglas Katzman95354292015-06-23 20:42:09 +0000643 bool hasIntegratedCPP() const override { return false; }
Craig Topperb45acb82014-03-14 06:02:07 +0000644 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;
Douglas Katzman95354292015-06-23 20:42:09 +0000650};
Hans Wennborg87cfa712013-09-19 20:32:16 +0000651
Douglas Katzman95354292015-06-23 20:42:09 +0000652class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
653public:
654 Compiler(const ToolChain &TC)
655 : Tool("visualstudio::Compiler", "compiler", TC, RF_Full,
656 llvm::sys::WEM_UTF16) {}
Hans Wennborg87cfa712013-09-19 20:32:16 +0000657
Douglas Katzman95354292015-06-23 20:42:09 +0000658 bool hasIntegratedAssembler() const override { return true; }
Craig Topperb45acb82014-03-14 06:02:07 +0000659 bool hasIntegratedCPP() const override { return true; }
660 bool isLinkJob() const override { return false; }
Hans Wennborg87cfa712013-09-19 20:32:16 +0000661
Craig Topperb45acb82014-03-14 06:02:07 +0000662 void ConstructJob(Compilation &C, const JobAction &JA,
663 const InputInfo &Output, const InputInfoList &Inputs,
664 const llvm::opt::ArgList &TCArgs,
665 const char *LinkingOutput) const override;
Hans Wennborg87cfa712013-09-19 20:32:16 +0000666
David Blaikiec11bf802014-09-04 16:04:28 +0000667 std::unique_ptr<Command> GetCommand(Compilation &C, const JobAction &JA,
668 const InputInfo &Output,
669 const InputInfoList &Inputs,
670 const llvm::opt::ArgList &TCArgs,
671 const char *LinkingOutput) const;
Hans Wennborg87cfa712013-09-19 20:32:16 +0000672 };
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000673} // end namespace visualstudio
674
Tim Northover9c7e0352013-12-12 11:55:52 +0000675namespace arm {
676 StringRef getARMFloatABI(const Driver &D, const llvm::opt::ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000677 const llvm::Triple &Triple);
Tim Northover9c7e0352013-12-12 11:55:52 +0000678}
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000679namespace XCore {
Douglas Katzman95354292015-06-23 20:42:09 +0000680// For XCore, we do not need to instantiate tools for PreProcess, PreCompile and
681// Compile.
682// We simply use "clang -cc1" for those actions.
683class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000684public:
Douglas Katzman95354292015-06-23 20:42:09 +0000685 Assembler(const ToolChain &TC) : Tool("XCore::Assembler", "XCore-as", TC) {}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000686
687 bool hasIntegratedCPP() const override { return false; }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000688 void ConstructJob(Compilation &C, const JobAction &JA,
689 const InputInfo &Output, const InputInfoList &Inputs,
690 const llvm::opt::ArgList &TCArgs,
691 const char *LinkingOutput) const override;
692};
693
Douglas Katzman95354292015-06-23 20:42:09 +0000694class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000695public:
Douglas Katzman95354292015-06-23 20:42:09 +0000696 Linker(const ToolChain &TC) : Tool("XCore::Linker", "XCore-ld", TC) {}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000697
698 bool hasIntegratedCPP() const override { return false; }
Douglas Katzman95354292015-06-23 20:42:09 +0000699 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;
704 };
705 } // end namespace XCore.
706
707 namespace CrossWindows {
708 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
709 public:
710 Assembler(const ToolChain &TC)
711 : Tool("CrossWindows::Assembler", "as", TC) {}
712
713 bool hasIntegratedCPP() const override { return false; }
714
715 void ConstructJob(Compilation &C, const JobAction &JA,
716 const InputInfo &Output, const InputInfoList &Inputs,
717 const llvm::opt::ArgList &TCArgs,
718 const char *LinkingOutput) const override;
719 };
720
721 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
722 public:
723 Linker(const ToolChain &TC)
724 : Tool("CrossWindows::Linker", "ld", TC, RF_Full) {}
725
726 bool hasIntegratedCPP() const override { return false; }
727 bool isLinkJob() const override { return true; }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000728
729 void ConstructJob(Compilation &C, const JobAction &JA,
730 const InputInfo &Output, const InputInfoList &Inputs,
731 const llvm::opt::ArgList &TCArgs,
732 const char *LinkingOutput) const override;
733};
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000734}
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000735
Douglas Katzman84a75642015-06-19 14:55:19 +0000736/// SHAVE tools -- Directly call moviCompile and moviAsm
737namespace SHAVE {
Douglas Katzman95354292015-06-23 20:42:09 +0000738class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
Douglas Katzman84a75642015-06-19 14:55:19 +0000739public:
Douglas Katzman95354292015-06-23 20:42:09 +0000740 Compiler(const ToolChain &TC) : Tool("moviCompile", "movicompile", TC) {}
Douglas Katzman84a75642015-06-19 14:55:19 +0000741
742 bool hasIntegratedCPP() const override { return true; }
743
744 void ConstructJob(Compilation &C, const JobAction &JA,
745 const InputInfo &Output, const InputInfoList &Inputs,
746 const llvm::opt::ArgList &TCArgs,
747 const char *LinkingOutput) const override;
748};
749
Douglas Katzman95354292015-06-23 20:42:09 +0000750class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
Douglas Katzman84a75642015-06-19 14:55:19 +0000751public:
Douglas Katzman95354292015-06-23 20:42:09 +0000752 Assembler(const ToolChain &TC) : Tool("moviAsm", "moviAsm", TC) {}
Douglas Katzman84a75642015-06-19 14:55:19 +0000753
754 bool hasIntegratedCPP() const override { return false; } // not sure.
755
756 void ConstructJob(Compilation &C, const JobAction &JA,
757 const InputInfo &Output, const InputInfoList &Inputs,
758 const llvm::opt::ArgList &TCArgs,
759 const char *LinkingOutput) const override;
760};
761} // end namespace SHAVE
762
Douglas Katzman9dc5fbb2015-06-03 16:56:50 +0000763} // end namespace tools
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000764} // end namespace driver
765} // end namespace clang
766
Benjamin Kramer2f5db8b2014-08-13 16:25:19 +0000767#endif