blob: 1b8176f8839362770a137fb9091d6ecd2eb05c12 [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"
Benjamin Kramer8c305922016-02-02 11:06:51 +000014#include "clang/Driver/DebugInfoKind.h"
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000015#include "clang/Driver/Tool.h"
Daniel Dunbare6adeee2009-03-29 17:08:39 +000016#include "clang/Driver/Types.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000017#include "clang/Driver/Util.h"
Joerg Sonnenberger637603a2011-05-16 13:35:02 +000018#include "llvm/ADT/Triple.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000019#include "llvm/Option/Option.h"
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000020#include "llvm/Support/Compiler.h"
21
22namespace clang {
Reid Klecknerbac59a12015-07-15 17:58:55 +000023class ObjCRuntime;
John McCall5fb5df92012-06-20 06:18:46 +000024
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000025namespace driver {
Reid Klecknerbac59a12015-07-15 17:58:55 +000026class Command;
27class Driver;
Douglas Gregor111af7d2009-04-18 00:34:01 +000028
Daniel Dunbarc1964212009-03-26 16:23:12 +000029namespace toolchains {
Reid Klecknerbac59a12015-07-15 17:58:55 +000030class MachO;
Daniel Dunbarc1964212009-03-26 16:23:12 +000031}
32
Daniel Dunbar15abb2e2009-03-17 22:18:43 +000033namespace tools {
Hans Wennborg1da044a2014-06-26 19:59:02 +000034
35namespace visualstudio {
Douglas Katzman95354292015-06-23 20:42:09 +000036class Compiler;
Hans Wennborg1da044a2014-06-26 19:59:02 +000037}
38
Reid Kleckner898229a2013-06-14 17:17:23 +000039using llvm::opt::ArgStringList;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000040
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +000041SmallString<128> getCompilerRT(const ToolChain &TC,
42 const llvm::opt::ArgList &Args,
43 StringRef Component, bool Shared = false);
Peter Collingbourne581f4382015-07-02 01:48:12 +000044
Reid Klecknerbac59a12015-07-15 17:58:55 +000045/// \brief Clang compiler tool.
46class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
47public:
48 static const char *getBaseInputName(const llvm::opt::ArgList &Args,
49 const InputInfo &Input);
50 static const char *getBaseInputStem(const llvm::opt::ArgList &Args,
51 const InputInfoList &Inputs);
52 static const char *getDependencyFileName(const llvm::opt::ArgList &Args,
53 const InputInfoList &Inputs);
Bob Wilsondecc03e2012-11-23 06:14:39 +000054
Reid Klecknerbac59a12015-07-15 17:58:55 +000055private:
56 void AddPreprocessingOptions(Compilation &C, const JobAction &JA,
57 const Driver &D, const llvm::opt::ArgList &Args,
58 llvm::opt::ArgStringList &CmdArgs,
59 const InputInfo &Output,
Artem Belevichfa11ab52015-11-17 22:28:46 +000060 const InputInfoList &Inputs,
61 const ToolChain *AuxToolChain) const;
Daniel Dunbard067f7f2009-04-08 23:54:23 +000062
Reid Klecknerbac59a12015-07-15 17:58:55 +000063 void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
Tim Northovera2ee4332014-03-29 15:09:45 +000064 llvm::opt::ArgStringList &CmdArgs) const;
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +000065 void AddARMTargetArgs(const llvm::Triple &Triple,
66 const llvm::opt::ArgList &Args,
Reid Klecknerbac59a12015-07-15 17:58:55 +000067 llvm::opt::ArgStringList &CmdArgs,
68 bool KernelOrKext) const;
69 void AddARM64TargetArgs(const llvm::opt::ArgList &Args,
Ulrich Weigand8afad612014-07-28 13:17:52 +000070 llvm::opt::ArgStringList &CmdArgs) const;
Reid Klecknerbac59a12015-07-15 17:58:55 +000071 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
72 llvm::opt::ArgStringList &CmdArgs) const;
73 void AddPPCTargetArgs(const llvm::opt::ArgList &Args,
Hans Wennborg75958c42013-08-08 00:17:41 +000074 llvm::opt::ArgStringList &CmdArgs) const;
Reid Klecknerbac59a12015-07-15 17:58:55 +000075 void AddR600TargetArgs(const llvm::opt::ArgList &Args,
76 llvm::opt::ArgStringList &CmdArgs) const;
77 void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
78 llvm::opt::ArgStringList &CmdArgs) const;
79 void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
80 llvm::opt::ArgStringList &CmdArgs) const;
81 void AddX86TargetArgs(const llvm::opt::ArgList &Args,
82 llvm::opt::ArgStringList &CmdArgs) const;
83 void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
84 llvm::opt::ArgStringList &CmdArgs) const;
Dan Gohmane3d71e12016-01-07 01:00:21 +000085 void AddWebAssemblyTargetArgs(const llvm::opt::ArgList &Args,
86 llvm::opt::ArgStringList &CmdArgs) const;
Hans Wennborg75958c42013-08-08 00:17:41 +000087
Reid Klecknerbac59a12015-07-15 17:58:55 +000088 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
Hans Wennborg1da044a2014-06-26 19:59:02 +000089
Reid Klecknerbac59a12015-07-15 17:58:55 +000090 ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
91 llvm::opt::ArgStringList &cmdArgs,
92 RewriteKind rewrite) const;
Hans Wennborg1da044a2014-06-26 19:59:02 +000093
Reid Klecknerbac59a12015-07-15 17:58:55 +000094 void AddClangCLArgs(const llvm::opt::ArgList &Args,
Douglas Katzman3459ce22015-10-08 04:24:12 +000095 llvm::opt::ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +000096 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +000097 bool *EmitCodeView) const;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000098
Reid Klecknerbac59a12015-07-15 17:58:55 +000099 visualstudio::Compiler *getCLFallback() const;
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000100
Reid Klecknerbac59a12015-07-15 17:58:55 +0000101 mutable std::unique_ptr<visualstudio::Compiler> CLFallback;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000102
Reid Klecknerbac59a12015-07-15 17:58:55 +0000103public:
104 // CAUTION! The first constructor argument ("clang") is not arbitrary,
105 // as it is for other tools. Some operations on a Tool actually test
106 // whether that tool is Clang based on the Tool's Name as a string.
107 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC, RF_Full) {}
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000108
Reid Klecknerbac59a12015-07-15 17:58:55 +0000109 bool hasGoodDiagnostics() const override { return true; }
110 bool hasIntegratedAssembler() const override { return true; }
111 bool hasIntegratedCPP() const override { return true; }
112 bool canEmitIR() const override { return true; }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000113
Reid Klecknerbac59a12015-07-15 17:58:55 +0000114 void ConstructJob(Compilation &C, const JobAction &JA,
115 const InputInfo &Output, const InputInfoList &Inputs,
116 const llvm::opt::ArgList &TCArgs,
117 const char *LinkingOutput) const override;
118};
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000119
Reid Klecknerbac59a12015-07-15 17:58:55 +0000120/// \brief Clang integrated assembler tool.
121class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
122public:
123 ClangAs(const ToolChain &TC)
124 : Tool("clang::as", "clang integrated assembler", TC, RF_Full) {}
125 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
126 llvm::opt::ArgStringList &CmdArgs) const;
127 bool hasGoodDiagnostics() const override { return true; }
128 bool hasIntegratedAssembler() const override { return false; }
129 bool hasIntegratedCPP() const override { return false; }
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000130
Reid Klecknerbac59a12015-07-15 17:58:55 +0000131 void ConstructJob(Compilation &C, const JobAction &JA,
132 const InputInfo &Output, const InputInfoList &Inputs,
133 const llvm::opt::ArgList &TCArgs,
134 const char *LinkingOutput) const override;
135};
136
137/// \brief Base class for all GNU tools that provide the same behavior when
138/// it comes to response files support
139class LLVM_LIBRARY_VISIBILITY GnuTool : public Tool {
140 virtual void anchor();
141
142public:
143 GnuTool(const char *Name, const char *ShortName, const ToolChain &TC)
144 : Tool(Name, ShortName, TC, RF_Full, llvm::sys::WEM_CurrentCodePage) {}
145};
146
147/// gcc - Generic GCC tool implementations.
Daniel Dunbar82116f82009-03-17 22:45:24 +0000148namespace gcc {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000149class LLVM_LIBRARY_VISIBILITY Common : public GnuTool {
150public:
151 Common(const char *Name, const char *ShortName, const ToolChain &TC)
152 : GnuTool(Name, ShortName, TC) {}
Daniel Dunbara3246a02009-03-18 08:07:30 +0000153
Eric Christopher29a50bc2016-01-06 07:24:45 +0000154 // A gcc tool has an "integrated" assembler that it will call to produce an
155 // object. Let it use that assembler so that we don't have to deal with
156 // assembly syntax incompatibilities.
157 bool hasIntegratedAssembler() const override { return true; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000158 void ConstructJob(Compilation &C, const JobAction &JA,
159 const InputInfo &Output, const InputInfoList &Inputs,
160 const llvm::opt::ArgList &TCArgs,
161 const char *LinkingOutput) const override;
Daniel Dunbara3246a02009-03-18 08:07:30 +0000162
Reid Klecknerbac59a12015-07-15 17:58:55 +0000163 /// RenderExtraToolArgs - Render any arguments necessary to force
164 /// the particular tool mode.
165 virtual void RenderExtraToolArgs(const JobAction &JA,
166 llvm::opt::ArgStringList &CmdArgs) const = 0;
167};
Daniel Dunbara3246a02009-03-18 08:07:30 +0000168
Reid Klecknerbac59a12015-07-15 17:58:55 +0000169class LLVM_LIBRARY_VISIBILITY Preprocessor : public Common {
170public:
171 Preprocessor(const ToolChain &TC)
172 : Common("gcc::Preprocessor", "gcc preprocessor", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000173
Reid Klecknerbac59a12015-07-15 17:58:55 +0000174 bool hasGoodDiagnostics() const override { return true; }
175 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000176
Reid Klecknerbac59a12015-07-15 17:58:55 +0000177 void RenderExtraToolArgs(const JobAction &JA,
178 llvm::opt::ArgStringList &CmdArgs) const override;
179};
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000180
Reid Klecknerbac59a12015-07-15 17:58:55 +0000181class LLVM_LIBRARY_VISIBILITY Compiler : public Common {
182public:
183 Compiler(const ToolChain &TC) : Common("gcc::Compiler", "gcc frontend", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000184
Reid Klecknerbac59a12015-07-15 17:58:55 +0000185 bool hasGoodDiagnostics() const override { return true; }
186 bool hasIntegratedCPP() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000187
Reid Klecknerbac59a12015-07-15 17:58:55 +0000188 void RenderExtraToolArgs(const JobAction &JA,
189 llvm::opt::ArgStringList &CmdArgs) const override;
190};
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000191
Reid Klecknerbac59a12015-07-15 17:58:55 +0000192class LLVM_LIBRARY_VISIBILITY Linker : public Common {
193public:
194 Linker(const ToolChain &TC) : Common("gcc::Linker", "linker (via gcc)", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000195
Reid Klecknerbac59a12015-07-15 17:58:55 +0000196 bool hasIntegratedCPP() const override { return false; }
197 bool isLinkJob() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000198
Reid Klecknerbac59a12015-07-15 17:58:55 +0000199 void RenderExtraToolArgs(const JobAction &JA,
200 llvm::opt::ArgStringList &CmdArgs) const override;
201};
Daniel Dunbar82116f82009-03-17 22:45:24 +0000202} // end namespace gcc
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000203
Tony Linthicum76329bf2011-12-12 21:14:55 +0000204namespace hexagon {
Douglas Katzman95354292015-06-23 20:42:09 +0000205// For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile
206// and Compile.
207// We simply use "clang -cc1" for those actions.
208class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
209public:
210 Assembler(const ToolChain &TC)
211 : GnuTool("hexagon::Assembler", "hexagon-as", TC) {}
Tony Linthicum76329bf2011-12-12 21:14:55 +0000212
Douglas Katzman95354292015-06-23 20:42:09 +0000213 bool hasIntegratedCPP() const override { return false; }
Tony Linthicum76329bf2011-12-12 21:14:55 +0000214
Reid Klecknerbac59a12015-07-15 17:58:55 +0000215 void RenderExtraToolArgs(const JobAction &JA,
216 llvm::opt::ArgStringList &CmdArgs) const;
217 void ConstructJob(Compilation &C, const JobAction &JA,
218 const InputInfo &Output, const InputInfoList &Inputs,
219 const llvm::opt::ArgList &TCArgs,
220 const char *LinkingOutput) const override;
Douglas Katzman95354292015-06-23 20:42:09 +0000221};
Tony Linthicum76329bf2011-12-12 21:14:55 +0000222
Douglas Katzman95354292015-06-23 20:42:09 +0000223class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
224public:
225 Linker(const ToolChain &TC) : GnuTool("hexagon::Linker", "hexagon-ld", TC) {}
Tony Linthicum76329bf2011-12-12 21:14:55 +0000226
Douglas Katzman95354292015-06-23 20:42:09 +0000227 bool hasIntegratedCPP() const override { return false; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000228 bool isLinkJob() const override { return true; }
Tony Linthicum76329bf2011-12-12 21:14:55 +0000229
Reid Klecknerbac59a12015-07-15 17:58:55 +0000230 virtual void RenderExtraToolArgs(const JobAction &JA,
231 llvm::opt::ArgStringList &CmdArgs) const;
232 void ConstructJob(Compilation &C, const JobAction &JA,
233 const InputInfo &Output, const InputInfoList &Inputs,
234 const llvm::opt::ArgList &TCArgs,
235 const char *LinkingOutput) const override;
236};
Tony Linthicum76329bf2011-12-12 21:14:55 +0000237} // end namespace hexagon.
238
Tom Stellard8fa33092015-07-18 01:49:05 +0000239namespace amdgpu {
240
241class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
242public:
Tom Stellard0e04f6c2016-01-08 15:14:31 +0000243 Linker(const ToolChain &TC) : GnuTool("amdgpu::Linker", "ld.lld", TC) {}
Tom Stellard8fa33092015-07-18 01:49:05 +0000244 bool isLinkJob() const override { return true; }
245 bool hasIntegratedCPP() const override { return false; }
246 void ConstructJob(Compilation &C, const JobAction &JA,
247 const InputInfo &Output, const InputInfoList &Inputs,
248 const llvm::opt::ArgList &TCArgs,
249 const char *LinkingOutput) const override;
250};
251
252} // end namespace amdgpu
253
Dan Gohman52816862015-12-16 23:30:41 +0000254namespace wasm {
255
256class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
257public:
258 explicit Linker(const ToolChain &TC);
259 bool isLinkJob() const override;
260 bool hasIntegratedCPP() const override;
261 void ConstructJob(Compilation &C, const JobAction &JA,
262 const InputInfo &Output, const InputInfoList &Inputs,
263 const llvm::opt::ArgList &TCArgs,
264 const char *LinkingOutput) const override;
265};
266
267} // end namespace wasm
268
Bernard Ogden31561762013-12-12 13:27:11 +0000269namespace arm {
Renato Goline17c5802015-07-27 23:44:42 +0000270std::string getARMTargetCPU(StringRef CPU, StringRef Arch,
Reid Klecknerbac59a12015-07-15 17:58:55 +0000271 const llvm::Triple &Triple);
Renato Goline17c5802015-07-27 23:44:42 +0000272const std::string getARMArch(StringRef Arch,
Reid Klecknerbac59a12015-07-15 17:58:55 +0000273 const llvm::Triple &Triple);
Chandler Carruthd96f37a2015-08-30 07:51:18 +0000274StringRef getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple);
Vladimir Sukharev64f68242015-09-23 09:29:32 +0000275StringRef getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
276 const llvm::Triple &Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +0000277
Reid Klecknerbac59a12015-07-15 17:58:55 +0000278void appendEBLinkFlags(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs,
279 const llvm::Triple &Triple);
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000280} // end namespace arm
Tony Linthicum76329bf2011-12-12 21:14:55 +0000281
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000282namespace mips {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000283typedef enum { NanLegacy = 1, Nan2008 = 2 } NanEncoding;
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +0000284
285enum class FloatABI {
286 Invalid,
287 Soft,
288 Hard,
289};
290
Reid Klecknerbac59a12015-07-15 17:58:55 +0000291NanEncoding getSupportedNanEncoding(StringRef &CPU);
292void getMipsCPUAndABI(const llvm::opt::ArgList &Args,
293 const llvm::Triple &Triple, StringRef &CPUName,
294 StringRef &ABIName);
Vasileios Kalintirisc744e122015-11-12 15:26:54 +0000295std::string getMipsABILibSuffix(const llvm::opt::ArgList &Args,
296 const llvm::Triple &Triple);
Reid Klecknerbac59a12015-07-15 17:58:55 +0000297bool hasMipsAbiArg(const llvm::opt::ArgList &Args, const char *Value);
298bool isUCLibc(const llvm::opt::ArgList &Args);
299bool isNaN2008(const llvm::opt::ArgList &Args, const llvm::Triple &Triple);
300bool isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +0000301 StringRef ABIName, mips::FloatABI FloatABI);
Reid Klecknerbac59a12015-07-15 17:58:55 +0000302bool shouldUseFPXX(const llvm::opt::ArgList &Args, const llvm::Triple &Triple,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +0000303 StringRef CPUName, StringRef ABIName,
304 mips::FloatABI FloatABI);
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000305} // end namespace mips
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000306
Ulrich Weigand8afad612014-07-28 13:17:52 +0000307namespace ppc {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000308bool hasPPCAbiArg(const llvm::opt::ArgList &Args, const char *Value);
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000309} // end namespace ppc
Ulrich Weigand8afad612014-07-28 13:17:52 +0000310
Douglas Katzman95354292015-06-23 20:42:09 +0000311/// cloudabi -- Directly call GNU Binutils linker
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000312namespace cloudabi {
Douglas Katzman95354292015-06-23 20:42:09 +0000313class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000314public:
Douglas Katzman95354292015-06-23 20:42:09 +0000315 Linker(const ToolChain &TC) : GnuTool("cloudabi::Linker", "linker", TC) {}
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000316
317 bool hasIntegratedCPP() const override { return false; }
318 bool isLinkJob() const override { return true; }
319
320 void ConstructJob(Compilation &C, const JobAction &JA,
321 const InputInfo &Output, const InputInfoList &Inputs,
322 const llvm::opt::ArgList &TCArgs,
323 const char *LinkingOutput) const override;
324};
325} // end namespace cloudabi
326
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000327namespace darwin {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000328llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
329void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
Rafael Espindoladcbf6982012-10-31 18:51:07 +0000330
Reid Klecknerbac59a12015-07-15 17:58:55 +0000331class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
332 virtual void anchor();
Daniel Dunbare9ded432009-09-09 18:36:20 +0000333
Reid Klecknerbac59a12015-07-15 17:58:55 +0000334protected:
335 void AddMachOArch(const llvm::opt::ArgList &Args,
336 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbare9ded432009-09-09 18:36:20 +0000337
Reid Klecknerbac59a12015-07-15 17:58:55 +0000338 const toolchains::MachO &getMachOToolChain() const {
339 return reinterpret_cast<const toolchains::MachO &>(getToolChain());
340 }
Daniel Dunbare9ded432009-09-09 18:36:20 +0000341
Reid Klecknerbac59a12015-07-15 17:58:55 +0000342public:
343 MachOTool(
344 const char *Name, const char *ShortName, const ToolChain &TC,
345 ResponseFileSupport ResponseSupport = RF_None,
346 llvm::sys::WindowsEncodingMethod ResponseEncoding = llvm::sys::WEM_UTF8,
347 const char *ResponseFlag = "@")
348 : Tool(Name, ShortName, TC, ResponseSupport, ResponseEncoding,
349 ResponseFlag) {}
350};
Daniel Dunbarbe220842009-03-20 16:06:39 +0000351
Reid Klecknerbac59a12015-07-15 17:58:55 +0000352class LLVM_LIBRARY_VISIBILITY Assembler : public MachOTool {
353public:
354 Assembler(const ToolChain &TC)
355 : MachOTool("darwin::Assembler", "assembler", TC) {}
Daniel Dunbarbe220842009-03-20 16:06:39 +0000356
Reid Klecknerbac59a12015-07-15 17:58:55 +0000357 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarbe220842009-03-20 16:06:39 +0000358
Reid Klecknerbac59a12015-07-15 17:58:55 +0000359 void ConstructJob(Compilation &C, const JobAction &JA,
360 const InputInfo &Output, const InputInfoList &Inputs,
361 const llvm::opt::ArgList &TCArgs,
362 const char *LinkingOutput) const override;
363};
Daniel Dunbarc1964212009-03-26 16:23:12 +0000364
Reid Klecknerbac59a12015-07-15 17:58:55 +0000365class LLVM_LIBRARY_VISIBILITY Linker : public MachOTool {
366 bool NeedsTempPath(const InputInfoList &Inputs) const;
367 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
368 llvm::opt::ArgStringList &CmdArgs,
369 const InputInfoList &Inputs) const;
Daniel Dunbarc1964212009-03-26 16:23:12 +0000370
Reid Klecknerbac59a12015-07-15 17:58:55 +0000371public:
372 Linker(const ToolChain &TC)
373 : MachOTool("darwin::Linker", "linker", TC, RF_FileList,
374 llvm::sys::WEM_UTF8, "-filelist") {}
Daniel Dunbarc1964212009-03-26 16:23:12 +0000375
Reid Klecknerbac59a12015-07-15 17:58:55 +0000376 bool hasIntegratedCPP() const override { return false; }
377 bool isLinkJob() const override { return true; }
Daniel Dunbarc1964212009-03-26 16:23:12 +0000378
Reid Klecknerbac59a12015-07-15 17:58:55 +0000379 void ConstructJob(Compilation &C, const JobAction &JA,
380 const InputInfo &Output, const InputInfoList &Inputs,
381 const llvm::opt::ArgList &TCArgs,
382 const char *LinkingOutput) const override;
383};
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000384
Reid Klecknerbac59a12015-07-15 17:58:55 +0000385class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool {
386public:
387 Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000388
Reid Klecknerbac59a12015-07-15 17:58:55 +0000389 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar88299622010-06-04 18:28:36 +0000390
Reid Klecknerbac59a12015-07-15 17:58:55 +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};
Daniel Dunbar88299622010-06-04 18:28:36 +0000396
Reid Klecknerbac59a12015-07-15 17:58:55 +0000397class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool {
398public:
399 Dsymutil(const ToolChain &TC)
400 : MachOTool("darwin::Dsymutil", "dsymutil", TC) {}
Daniel Dunbar88299622010-06-04 18:28:36 +0000401
Reid Klecknerbac59a12015-07-15 17:58:55 +0000402 bool hasIntegratedCPP() const override { return false; }
403 bool isDsymutilJob() const override { return true; }
Eric Christopher551ef452011-08-23 17:56:55 +0000404
Reid Klecknerbac59a12015-07-15 17:58:55 +0000405 void ConstructJob(Compilation &C, const JobAction &JA,
406 const InputInfo &Output, const InputInfoList &Inputs,
407 const llvm::opt::ArgList &TCArgs,
408 const char *LinkingOutput) const override;
409};
Eric Christopher551ef452011-08-23 17:56:55 +0000410
Reid Klecknerbac59a12015-07-15 17:58:55 +0000411class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool {
412public:
413 VerifyDebug(const ToolChain &TC)
414 : MachOTool("darwin::VerifyDebug", "dwarfdump", TC) {}
Eric Christopher551ef452011-08-23 17:56:55 +0000415
Reid Klecknerbac59a12015-07-15 17:58:55 +0000416 bool hasIntegratedCPP() const override { return false; }
Eric Christopher551ef452011-08-23 17:56:55 +0000417
Reid Klecknerbac59a12015-07-15 17:58:55 +0000418 void ConstructJob(Compilation &C, const JobAction &JA,
419 const InputInfo &Output, const InputInfoList &Inputs,
420 const llvm::opt::ArgList &TCArgs,
421 const char *LinkingOutput) const override;
422};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000423} // end namespace darwin
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000424
Douglas Katzman95354292015-06-23 20:42:09 +0000425/// openbsd -- Directly call GNU Binutils assembler and linker
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000426namespace openbsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000427class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
428public:
429 Assembler(const ToolChain &TC)
430 : GnuTool("openbsd::Assembler", "assembler", TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000431
Douglas Katzman95354292015-06-23 20:42:09 +0000432 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000433
Douglas Katzman95354292015-06-23 20:42:09 +0000434 void ConstructJob(Compilation &C, const JobAction &JA,
435 const InputInfo &Output, const InputInfoList &Inputs,
436 const llvm::opt::ArgList &TCArgs,
437 const char *LinkingOutput) const override;
438};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000439
Douglas Katzman95354292015-06-23 20:42:09 +0000440class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
441public:
442 Linker(const ToolChain &TC) : GnuTool("openbsd::Linker", "linker", TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000443
Douglas Katzman95354292015-06-23 20:42:09 +0000444 bool hasIntegratedCPP() const override { return false; }
445 bool isLinkJob() const override { return true; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000446
Reid Klecknerbac59a12015-07-15 17:58:55 +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};
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000452} // end namespace openbsd
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000453
Douglas Katzman95354292015-06-23 20:42:09 +0000454/// bitrig -- Directly call GNU Binutils assembler and linker
Eli Friedman9fa28852012-08-08 23:57:20 +0000455namespace bitrig {
Douglas Katzman95354292015-06-23 20:42:09 +0000456class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
457public:
458 Assembler(const ToolChain &TC)
459 : GnuTool("bitrig::Assembler", "assembler", TC) {}
Eli Friedman9fa28852012-08-08 23:57:20 +0000460
Douglas Katzman95354292015-06-23 20:42:09 +0000461 bool hasIntegratedCPP() const override { return false; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000462
Douglas Katzman95354292015-06-23 20:42:09 +0000463 void ConstructJob(Compilation &C, const JobAction &JA,
464 const InputInfo &Output, const InputInfoList &Inputs,
465 const llvm::opt::ArgList &TCArgs,
466 const char *LinkingOutput) const override;
467};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000468
Douglas Katzman95354292015-06-23 20:42:09 +0000469class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
470public:
471 Linker(const ToolChain &TC) : GnuTool("bitrig::Linker", "linker", TC) {}
Eli Friedman9fa28852012-08-08 23:57:20 +0000472
Douglas Katzman95354292015-06-23 20:42:09 +0000473 bool hasIntegratedCPP() const override { return false; }
474 bool isLinkJob() const override { return true; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000475
Reid Klecknerbac59a12015-07-15 17:58:55 +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};
Eli Friedman9fa28852012-08-08 23:57:20 +0000481} // end namespace bitrig
482
Douglas Katzman95354292015-06-23 20:42:09 +0000483/// freebsd -- Directly call GNU Binutils assembler and linker
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000484namespace freebsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000485class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
486public:
487 Assembler(const ToolChain &TC)
488 : GnuTool("freebsd::Assembler", "assembler", TC) {}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000489
Douglas Katzman95354292015-06-23 20:42:09 +0000490 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000491
Douglas Katzman95354292015-06-23 20:42:09 +0000492 void ConstructJob(Compilation &C, const JobAction &JA,
493 const InputInfo &Output, const InputInfoList &Inputs,
494 const llvm::opt::ArgList &TCArgs,
495 const char *LinkingOutput) const override;
496};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000497
Douglas Katzman95354292015-06-23 20:42:09 +0000498class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
499public:
500 Linker(const ToolChain &TC) : GnuTool("freebsd::Linker", "linker", TC) {}
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000501
Douglas Katzman95354292015-06-23 20:42:09 +0000502 bool hasIntegratedCPP() const override { return false; }
503 bool isLinkJob() const override { return true; }
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000504
Reid Klecknerbac59a12015-07-15 17:58:55 +0000505 void ConstructJob(Compilation &C, const JobAction &JA,
506 const InputInfo &Output, const InputInfoList &Inputs,
507 const llvm::opt::ArgList &TCArgs,
508 const char *LinkingOutput) const override;
509};
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000510} // end namespace freebsd
511
Douglas Katzman95354292015-06-23 20:42:09 +0000512/// netbsd -- Directly call GNU Binutils assembler and linker
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000513namespace netbsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000514class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
Douglas Katzman95354292015-06-23 20:42:09 +0000515public:
516 Assembler(const ToolChain &TC)
517 : GnuTool("netbsd::Assembler", "assembler", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000518
Douglas Katzman95354292015-06-23 20:42:09 +0000519 bool hasIntegratedCPP() const override { return false; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000520
Douglas Katzman95354292015-06-23 20:42:09 +0000521 void ConstructJob(Compilation &C, const JobAction &JA,
522 const InputInfo &Output, const InputInfoList &Inputs,
523 const llvm::opt::ArgList &TCArgs,
524 const char *LinkingOutput) const override;
525};
Joerg Sonnenberger637603a2011-05-16 13:35:02 +0000526
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000527class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
Douglas Katzman95354292015-06-23 20:42:09 +0000528public:
529 Linker(const ToolChain &TC) : GnuTool("netbsd::Linker", "linker", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000530
Douglas Katzman95354292015-06-23 20:42:09 +0000531 bool hasIntegratedCPP() const override { return false; }
532 bool isLinkJob() const override { return true; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000533
Reid Klecknerbac59a12015-07-15 17:58:55 +0000534 void ConstructJob(Compilation &C, const JobAction &JA,
535 const InputInfo &Output, const InputInfoList &Inputs,
536 const llvm::opt::ArgList &TCArgs,
537 const char *LinkingOutput) const override;
538};
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000539} // end namespace netbsd
540
Douglas Katzman95354292015-06-23 20:42:09 +0000541/// Directly call GNU Binutils' assembler and linker.
Thomas Schwinge4e555262013-03-28 19:04:25 +0000542namespace gnutools {
Douglas Katzman95354292015-06-23 20:42:09 +0000543class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
544public:
545 Assembler(const ToolChain &TC) : GnuTool("GNU::Assembler", "assembler", TC) {}
Rafael Espindola92b00932010-08-10 00:25:48 +0000546
Douglas Katzman95354292015-06-23 20:42:09 +0000547 bool hasIntegratedCPP() const override { return false; }
548
549 void ConstructJob(Compilation &C, const JobAction &JA,
550 const InputInfo &Output, const InputInfoList &Inputs,
551 const llvm::opt::ArgList &TCArgs,
552 const char *LinkingOutput) const override;
553};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000554
Douglas Katzman95354292015-06-23 20:42:09 +0000555class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
556public:
557 Linker(const ToolChain &TC) : GnuTool("GNU::Linker", "linker", TC) {}
558
559 bool hasIntegratedCPP() const override { return false; }
560 bool isLinkJob() const override { return true; }
Rafael Espindola92b00932010-08-10 00:25:48 +0000561
Reid Klecknerbac59a12015-07-15 17:58:55 +0000562 void ConstructJob(Compilation &C, const JobAction &JA,
563 const InputInfo &Output, const InputInfoList &Inputs,
564 const llvm::opt::ArgList &TCArgs,
565 const char *LinkingOutput) const override;
566};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000567} // end namespace gnutools
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000568
Reid Klecknerbac59a12015-07-15 17:58:55 +0000569namespace nacltools {
570class LLVM_LIBRARY_VISIBILITY AssemblerARM : public gnutools::Assembler {
571public:
572 AssemblerARM(const ToolChain &TC) : gnutools::Assembler(TC) {}
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000573
Reid Klecknerbac59a12015-07-15 17:58:55 +0000574 void ConstructJob(Compilation &C, const JobAction &JA,
575 const InputInfo &Output, const InputInfoList &Inputs,
576 const llvm::opt::ArgList &TCArgs,
577 const char *LinkingOutput) const override;
578};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000579
Derek Schuff821d8842015-11-16 22:21:25 +0000580class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000581public:
Derek Schuff821d8842015-11-16 22:21:25 +0000582 Linker(const ToolChain &TC) : GnuTool("NaCl::Linker", "linker", TC) {}
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000583
Reid Klecknerbac59a12015-07-15 17:58:55 +0000584 bool hasIntegratedCPP() const override { return false; }
585 bool isLinkJob() const override { return true; }
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000586
Reid Klecknerbac59a12015-07-15 17:58:55 +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};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000592} // end namespace nacltools
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000593
Douglas Katzman95354292015-06-23 20:42:09 +0000594/// minix -- Directly call GNU Binutils assembler and linker
Chris Lattner3e2ee142010-07-07 16:01:42 +0000595namespace minix {
Douglas Katzman95354292015-06-23 20:42:09 +0000596class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
597public:
598 Assembler(const ToolChain &TC)
599 : GnuTool("minix::Assembler", "assembler", TC) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000600
Douglas Katzman95354292015-06-23 20:42:09 +0000601 bool hasIntegratedCPP() const override { return false; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000602
Douglas Katzman95354292015-06-23 20:42:09 +0000603 void ConstructJob(Compilation &C, const JobAction &JA,
604 const InputInfo &Output, const InputInfoList &Inputs,
605 const llvm::opt::ArgList &TCArgs,
606 const char *LinkingOutput) const override;
607};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000608
Douglas Katzman95354292015-06-23 20:42:09 +0000609class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
610public:
611 Linker(const ToolChain &TC) : GnuTool("minix::Linker", "linker", TC) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000612
Douglas Katzman95354292015-06-23 20:42:09 +0000613 bool hasIntegratedCPP() const override { return false; }
614 bool isLinkJob() const override { return true; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000615
Reid Klecknerbac59a12015-07-15 17:58:55 +0000616 void ConstructJob(Compilation &C, const JobAction &JA,
617 const InputInfo &Output, const InputInfoList &Inputs,
618 const llvm::opt::ArgList &TCArgs,
619 const char *LinkingOutput) const override;
620};
Chris Lattner3e2ee142010-07-07 16:01:42 +0000621} // end namespace minix
622
Douglas Katzman95354292015-06-23 20:42:09 +0000623/// solaris -- Directly call Solaris assembler and linker
David Chisnallf571cde2012-02-15 13:39:01 +0000624namespace solaris {
Douglas Katzman95354292015-06-23 20:42:09 +0000625class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
626public:
627 Assembler(const ToolChain &TC)
628 : Tool("solaris::Assembler", "assembler", TC) {}
David Chisnallf571cde2012-02-15 13:39:01 +0000629
Douglas Katzman95354292015-06-23 20:42:09 +0000630 bool hasIntegratedCPP() const override { return false; }
David Chisnallf571cde2012-02-15 13:39:01 +0000631
Douglas Katzman95354292015-06-23 20:42:09 +0000632 void ConstructJob(Compilation &C, const JobAction &JA,
633 const InputInfo &Output, const InputInfoList &Inputs,
634 const llvm::opt::ArgList &TCArgs,
635 const char *LinkingOutput) const override;
636};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000637
Douglas Katzman95354292015-06-23 20:42:09 +0000638class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
639public:
640 Linker(const ToolChain &TC) : Tool("solaris::Linker", "linker", TC) {}
David Chisnallf571cde2012-02-15 13:39:01 +0000641
Douglas Katzman95354292015-06-23 20:42:09 +0000642 bool hasIntegratedCPP() const override { return false; }
643 bool isLinkJob() const override { return true; }
David Chisnallf571cde2012-02-15 13:39:01 +0000644
Reid Klecknerbac59a12015-07-15 17:58:55 +0000645 void ConstructJob(Compilation &C, const JobAction &JA,
646 const InputInfo &Output, const InputInfoList &Inputs,
647 const llvm::opt::ArgList &TCArgs,
648 const char *LinkingOutput) const override;
649};
David Chisnalla9ed5d72012-02-15 16:25:46 +0000650} // end namespace solaris
David Chisnallf571cde2012-02-15 13:39:01 +0000651
Douglas Katzman95354292015-06-23 20:42:09 +0000652/// dragonfly -- Directly call GNU Binutils assembler and linker
Daniel Dunbarcc912342009-05-02 18:28:39 +0000653namespace dragonfly {
Douglas Katzman95354292015-06-23 20:42:09 +0000654class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
655public:
656 Assembler(const ToolChain &TC)
657 : GnuTool("dragonfly::Assembler", "assembler", TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000658
Douglas Katzman95354292015-06-23 20:42:09 +0000659 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000660
Douglas Katzman95354292015-06-23 20:42:09 +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;
665};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000666
Douglas Katzman95354292015-06-23 20:42:09 +0000667class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
668public:
669 Linker(const ToolChain &TC) : GnuTool("dragonfly::Linker", "linker", TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000670
Douglas Katzman95354292015-06-23 20:42:09 +0000671 bool hasIntegratedCPP() const override { return false; }
672 bool isLinkJob() const override { return true; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000673
Reid Klecknerbac59a12015-07-15 17:58:55 +0000674 void ConstructJob(Compilation &C, const JobAction &JA,
675 const InputInfo &Output, const InputInfoList &Inputs,
676 const llvm::opt::ArgList &TCArgs,
677 const char *LinkingOutput) const override;
678};
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000679} // end namespace dragonfly
Daniel Dunbarcc912342009-05-02 18:28:39 +0000680
Hans Wennborg1da044a2014-06-26 19:59:02 +0000681/// Visual studio tools.
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000682namespace visualstudio {
Douglas Katzman95354292015-06-23 20:42:09 +0000683VersionTuple getMSVCVersion(const Driver *D, const llvm::Triple &Triple,
684 const llvm::opt::ArgList &Args, bool IsWindowsMSVC);
David Majnemere11d3732015-06-08 00:22:46 +0000685
Douglas Katzman95354292015-06-23 20:42:09 +0000686class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
687public:
688 Linker(const ToolChain &TC)
689 : Tool("visualstudio::Linker", "linker", TC, RF_Full,
690 llvm::sys::WEM_UTF16) {}
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000691
Douglas Katzman95354292015-06-23 20:42:09 +0000692 bool hasIntegratedCPP() const override { return false; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000693 bool isLinkJob() const override { return true; }
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000694
Reid Klecknerbac59a12015-07-15 17:58:55 +0000695 void ConstructJob(Compilation &C, const JobAction &JA,
696 const InputInfo &Output, const InputInfoList &Inputs,
697 const llvm::opt::ArgList &TCArgs,
698 const char *LinkingOutput) const override;
Douglas Katzman95354292015-06-23 20:42:09 +0000699};
Hans Wennborg87cfa712013-09-19 20:32:16 +0000700
Douglas Katzman95354292015-06-23 20:42:09 +0000701class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
702public:
703 Compiler(const ToolChain &TC)
704 : Tool("visualstudio::Compiler", "compiler", TC, RF_Full,
705 llvm::sys::WEM_UTF16) {}
Hans Wennborg87cfa712013-09-19 20:32:16 +0000706
Douglas Katzman95354292015-06-23 20:42:09 +0000707 bool hasIntegratedAssembler() const override { return true; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000708 bool hasIntegratedCPP() const override { return true; }
709 bool isLinkJob() const override { return false; }
Hans Wennborg87cfa712013-09-19 20:32:16 +0000710
Reid Klecknerbac59a12015-07-15 17:58:55 +0000711 void ConstructJob(Compilation &C, const JobAction &JA,
712 const InputInfo &Output, const InputInfoList &Inputs,
713 const llvm::opt::ArgList &TCArgs,
714 const char *LinkingOutput) const override;
Hans Wennborg87cfa712013-09-19 20:32:16 +0000715
Reid Klecknerbac59a12015-07-15 17:58:55 +0000716 std::unique_ptr<Command> GetCommand(Compilation &C, const JobAction &JA,
717 const InputInfo &Output,
718 const InputInfoList &Inputs,
719 const llvm::opt::ArgList &TCArgs,
720 const char *LinkingOutput) const;
721};
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000722} // end namespace visualstudio
723
Yaron Keren1c0070c2015-07-02 04:45:27 +0000724/// MinGW -- Directly call GNU Binutils assembler and linker
725namespace MinGW {
726class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
727public:
728 Assembler(const ToolChain &TC) : Tool("MinGW::Assemble", "assembler", TC) {}
729
730 bool hasIntegratedCPP() const override { return false; }
731
732 void ConstructJob(Compilation &C, const JobAction &JA,
733 const InputInfo &Output, const InputInfoList &Inputs,
734 const llvm::opt::ArgList &TCArgs,
735 const char *LinkingOutput) const override;
736};
737
738class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
739public:
740 Linker(const ToolChain &TC) : Tool("MinGW::Linker", "linker", TC) {}
741
742 bool hasIntegratedCPP() const override { return false; }
743 bool isLinkJob() const override { return true; }
744
745 void ConstructJob(Compilation &C, const JobAction &JA,
746 const InputInfo &Output, const InputInfoList &Inputs,
747 const llvm::opt::ArgList &TCArgs,
748 const char *LinkingOutput) const override;
749
750private:
751 void AddLibGCC(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs) const;
752};
753} // end namespace MinGW
754
Tim Northover9c7e0352013-12-12 11:55:52 +0000755namespace arm {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000756enum class FloatABI {
757 Invalid,
758 Soft,
759 SoftFP,
760 Hard,
761};
762
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000763FloatABI getARMFloatABI(const ToolChain &TC, const llvm::opt::ArgList &Args);
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000764} // end namespace arm
765
Petar Jovanovic88a328f2015-12-14 17:51:50 +0000766namespace ppc {
767enum class FloatABI {
768 Invalid,
769 Soft,
770 Hard,
771};
772
773FloatABI getPPCFloatABI(const Driver &D, const llvm::opt::ArgList &Args);
774} // end namespace ppc
775
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000776namespace XCore {
Douglas Katzman95354292015-06-23 20:42:09 +0000777// For XCore, we do not need to instantiate tools for PreProcess, PreCompile and
778// Compile.
779// We simply use "clang -cc1" for those actions.
780class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000781public:
Douglas Katzman95354292015-06-23 20:42:09 +0000782 Assembler(const ToolChain &TC) : Tool("XCore::Assembler", "XCore-as", TC) {}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000783
784 bool hasIntegratedCPP() const override { return false; }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000785 void ConstructJob(Compilation &C, const JobAction &JA,
786 const InputInfo &Output, const InputInfoList &Inputs,
787 const llvm::opt::ArgList &TCArgs,
788 const char *LinkingOutput) const override;
789};
790
Douglas Katzman95354292015-06-23 20:42:09 +0000791class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000792public:
Douglas Katzman95354292015-06-23 20:42:09 +0000793 Linker(const ToolChain &TC) : Tool("XCore::Linker", "XCore-ld", TC) {}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000794
795 bool hasIntegratedCPP() const override { return false; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000796 bool isLinkJob() const override { return true; }
797 void ConstructJob(Compilation &C, const JobAction &JA,
798 const InputInfo &Output, const InputInfoList &Inputs,
799 const llvm::opt::ArgList &TCArgs,
800 const char *LinkingOutput) const override;
801};
802} // end namespace XCore.
Douglas Katzman95354292015-06-23 20:42:09 +0000803
Reid Klecknerbac59a12015-07-15 17:58:55 +0000804namespace CrossWindows {
805class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
806public:
807 Assembler(const ToolChain &TC) : Tool("CrossWindows::Assembler", "as", TC) {}
Douglas Katzman95354292015-06-23 20:42:09 +0000808
Reid Klecknerbac59a12015-07-15 17:58:55 +0000809 bool hasIntegratedCPP() const override { return false; }
Douglas Katzman95354292015-06-23 20:42:09 +0000810
Reid Klecknerbac59a12015-07-15 17:58:55 +0000811 void ConstructJob(Compilation &C, const JobAction &JA,
812 const InputInfo &Output, const InputInfoList &Inputs,
813 const llvm::opt::ArgList &TCArgs,
814 const char *LinkingOutput) const override;
815};
Douglas Katzman95354292015-06-23 20:42:09 +0000816
Reid Klecknerbac59a12015-07-15 17:58:55 +0000817class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
818public:
819 Linker(const ToolChain &TC)
820 : Tool("CrossWindows::Linker", "ld", TC, RF_Full) {}
Douglas Katzman95354292015-06-23 20:42:09 +0000821
Reid Klecknerbac59a12015-07-15 17:58:55 +0000822 bool hasIntegratedCPP() const override { return false; }
823 bool isLinkJob() const override { return true; }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000824
825 void ConstructJob(Compilation &C, const JobAction &JA,
826 const InputInfo &Output, const InputInfoList &Inputs,
827 const llvm::opt::ArgList &TCArgs,
828 const char *LinkingOutput) const override;
829};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000830} // end namespace CrossWindows
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000831
Douglas Katzman84a75642015-06-19 14:55:19 +0000832/// SHAVE tools -- Directly call moviCompile and moviAsm
833namespace SHAVE {
Douglas Katzman95354292015-06-23 20:42:09 +0000834class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
Douglas Katzman84a75642015-06-19 14:55:19 +0000835public:
Douglas Katzman95354292015-06-23 20:42:09 +0000836 Compiler(const ToolChain &TC) : Tool("moviCompile", "movicompile", TC) {}
Douglas Katzman84a75642015-06-19 14:55:19 +0000837
838 bool hasIntegratedCPP() const override { return true; }
839
840 void ConstructJob(Compilation &C, const JobAction &JA,
841 const InputInfo &Output, const InputInfoList &Inputs,
842 const llvm::opt::ArgList &TCArgs,
843 const char *LinkingOutput) const override;
844};
845
Douglas Katzman95354292015-06-23 20:42:09 +0000846class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
Douglas Katzman84a75642015-06-19 14:55:19 +0000847public:
Douglas Katzman95354292015-06-23 20:42:09 +0000848 Assembler(const ToolChain &TC) : Tool("moviAsm", "moviAsm", TC) {}
Douglas Katzman84a75642015-06-19 14:55:19 +0000849
850 bool hasIntegratedCPP() const override { return false; } // not sure.
851
852 void ConstructJob(Compilation &C, const JobAction &JA,
853 const InputInfo &Output, const InputInfoList &Inputs,
854 const llvm::opt::ArgList &TCArgs,
855 const char *LinkingOutput) const override;
856};
857} // end namespace SHAVE
858
Douglas Katzmand6e597c2015-09-17 19:56:40 +0000859/// The Myriad toolchain uses tools that are in two different namespaces.
860/// The Compiler and Assembler as defined above are in the SHAVE namespace,
861/// whereas the linker, which accepts code for a mixture of Sparc and SHAVE,
862/// is in the Myriad namespace.
863namespace Myriad {
864class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
865public:
866 Linker(const ToolChain &TC) : GnuTool("shave::Linker", "ld", TC) {}
867 bool hasIntegratedCPP() const override { return false; }
868 bool isLinkJob() const override { return true; }
869 void ConstructJob(Compilation &C, const JobAction &JA,
870 const InputInfo &Output, const InputInfoList &Inputs,
871 const llvm::opt::ArgList &TCArgs,
872 const char *LinkingOutput) const override;
873};
874} // end namespace Myriad
875
Filipe Cabecinhasc888e192015-10-14 12:25:43 +0000876namespace PS4cpu {
877class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
878public:
879 Assemble(const ToolChain &TC)
880 : Tool("PS4cpu::Assemble", "assembler", TC, RF_Full) {}
881
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000882 bool hasIntegratedCPP() const override { return false; }
Filipe Cabecinhasc888e192015-10-14 12:25:43 +0000883
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000884 void ConstructJob(Compilation &C, const JobAction &JA,
885 const InputInfo &Output,
886 const InputInfoList &Inputs,
887 const llvm::opt::ArgList &TCArgs,
888 const char *LinkingOutput) const override;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +0000889};
890
891class LLVM_LIBRARY_VISIBILITY Link : public Tool {
892public:
893 Link(const ToolChain &TC) : Tool("PS4cpu::Link", "linker", TC, RF_Full) {}
894
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000895 bool hasIntegratedCPP() const override { return false; }
896 bool isLinkJob() const override { return true; }
Filipe Cabecinhasc888e192015-10-14 12:25:43 +0000897
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000898 void ConstructJob(Compilation &C, const JobAction &JA,
899 const InputInfo &Output,
900 const InputInfoList &Inputs,
901 const llvm::opt::ArgList &TCArgs,
902 const char *LinkingOutput) const override;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +0000903};
904} // end namespace PS4cpu
905
Justin Lebar21e5d4f2016-01-14 21:41:27 +0000906namespace NVPTX {
907
908// Run ptxas, the NVPTX assembler.
909class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
910 public:
911 Assembler(const ToolChain &TC)
912 : Tool("NVPTX::Assembler", "ptxas", TC, RF_Full, llvm::sys::WEM_UTF8,
913 "--options-file") {}
914
915 bool hasIntegratedCPP() const override { return false; }
916
917 void ConstructJob(Compilation &C, const JobAction &JA,
918 const InputInfo &Output, const InputInfoList &Inputs,
919 const llvm::opt::ArgList &TCArgs,
920 const char *LinkingOutput) const override;
921};
922
923// Runs fatbinary, which combines GPU object files ("cubin" files) and/or PTX
924// assembly into a single output file.
925class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
926 public:
927 Linker(const ToolChain &TC)
928 : Tool("NVPTX::Linker", "fatbinary", TC, RF_Full, llvm::sys::WEM_UTF8,
929 "--options-file") {}
930
931 bool hasIntegratedCPP() const override { return false; }
932
933 void ConstructJob(Compilation &C, const JobAction &JA,
934 const InputInfo &Output, const InputInfoList &Inputs,
935 const llvm::opt::ArgList &TCArgs,
936 const char *LinkingOutput) const override;
937};
938
939} // end namespace NVPTX
940
Douglas Katzman9dc5fbb2015-06-03 16:56:50 +0000941} // end namespace tools
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000942} // end namespace driver
943} // end namespace clang
944
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000945#endif // LLVM_CLANG_LIB_DRIVER_TOOLS_H