blob: 2e546fc653852f070d8130ea04c895b4b30b8195 [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
Paul Robinsonb3cd79b2016-02-05 21:54:42 +000013#include "clang/Basic/DebugInfoOptions.h"
David Majnemere11d3732015-06-08 00:22:46 +000014#include "clang/Basic/VersionTuple.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;
Jacques Pienaard964cc22016-03-28 21:02:54 +000085 void AddLanaiTargetArgs(const llvm::opt::ArgList &Args,
86 llvm::opt::ArgStringList &CmdArgs) const;
Dan Gohmane3d71e12016-01-07 01:00:21 +000087 void AddWebAssemblyTargetArgs(const llvm::opt::ArgList &Args,
88 llvm::opt::ArgStringList &CmdArgs) const;
Hans Wennborg75958c42013-08-08 00:17:41 +000089
Reid Klecknerbac59a12015-07-15 17:58:55 +000090 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
Hans Wennborg1da044a2014-06-26 19:59:02 +000091
Reid Klecknerbac59a12015-07-15 17:58:55 +000092 ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
93 llvm::opt::ArgStringList &cmdArgs,
94 RewriteKind rewrite) const;
Hans Wennborg1da044a2014-06-26 19:59:02 +000095
David Majnemercd5855e2016-02-29 01:40:36 +000096 void AddClangCLArgs(const llvm::opt::ArgList &Args, types::ID InputType,
Douglas Katzman3459ce22015-10-08 04:24:12 +000097 llvm::opt::ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +000098 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +000099 bool *EmitCodeView) const;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000100
Reid Klecknerbac59a12015-07-15 17:58:55 +0000101 visualstudio::Compiler *getCLFallback() const;
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000102
Reid Klecknerbac59a12015-07-15 17:58:55 +0000103 mutable std::unique_ptr<visualstudio::Compiler> CLFallback;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000104
Reid Klecknerbac59a12015-07-15 17:58:55 +0000105public:
106 // CAUTION! The first constructor argument ("clang") is not arbitrary,
107 // as it is for other tools. Some operations on a Tool actually test
108 // whether that tool is Clang based on the Tool's Name as a string.
109 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC, RF_Full) {}
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000110
Reid Klecknerbac59a12015-07-15 17:58:55 +0000111 bool hasGoodDiagnostics() const override { return true; }
112 bool hasIntegratedAssembler() const override { return true; }
113 bool hasIntegratedCPP() const override { return true; }
114 bool canEmitIR() const override { return true; }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000115
Reid Klecknerbac59a12015-07-15 17:58:55 +0000116 void ConstructJob(Compilation &C, const JobAction &JA,
117 const InputInfo &Output, const InputInfoList &Inputs,
118 const llvm::opt::ArgList &TCArgs,
119 const char *LinkingOutput) const override;
120};
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000121
Reid Klecknerbac59a12015-07-15 17:58:55 +0000122/// \brief Clang integrated assembler tool.
123class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
124public:
125 ClangAs(const ToolChain &TC)
126 : Tool("clang::as", "clang integrated assembler", TC, RF_Full) {}
127 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
128 llvm::opt::ArgStringList &CmdArgs) const;
129 bool hasGoodDiagnostics() const override { return true; }
130 bool hasIntegratedAssembler() const override { return false; }
131 bool hasIntegratedCPP() const override { return false; }
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000132
Reid Klecknerbac59a12015-07-15 17:58:55 +0000133 void ConstructJob(Compilation &C, const JobAction &JA,
134 const InputInfo &Output, const InputInfoList &Inputs,
135 const llvm::opt::ArgList &TCArgs,
136 const char *LinkingOutput) const override;
137};
138
139/// \brief Base class for all GNU tools that provide the same behavior when
140/// it comes to response files support
141class LLVM_LIBRARY_VISIBILITY GnuTool : public Tool {
142 virtual void anchor();
143
144public:
145 GnuTool(const char *Name, const char *ShortName, const ToolChain &TC)
146 : Tool(Name, ShortName, TC, RF_Full, llvm::sys::WEM_CurrentCodePage) {}
147};
148
149/// gcc - Generic GCC tool implementations.
Daniel Dunbar82116f82009-03-17 22:45:24 +0000150namespace gcc {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000151class LLVM_LIBRARY_VISIBILITY Common : public GnuTool {
152public:
153 Common(const char *Name, const char *ShortName, const ToolChain &TC)
154 : GnuTool(Name, ShortName, TC) {}
Daniel Dunbara3246a02009-03-18 08:07:30 +0000155
Eric Christopher29a50bc2016-01-06 07:24:45 +0000156 // A gcc tool has an "integrated" assembler that it will call to produce an
157 // object. Let it use that assembler so that we don't have to deal with
158 // assembly syntax incompatibilities.
159 bool hasIntegratedAssembler() const override { return true; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000160 void ConstructJob(Compilation &C, const JobAction &JA,
161 const InputInfo &Output, const InputInfoList &Inputs,
162 const llvm::opt::ArgList &TCArgs,
163 const char *LinkingOutput) const override;
Daniel Dunbara3246a02009-03-18 08:07:30 +0000164
Reid Klecknerbac59a12015-07-15 17:58:55 +0000165 /// RenderExtraToolArgs - Render any arguments necessary to force
166 /// the particular tool mode.
167 virtual void RenderExtraToolArgs(const JobAction &JA,
168 llvm::opt::ArgStringList &CmdArgs) const = 0;
169};
Daniel Dunbara3246a02009-03-18 08:07:30 +0000170
Reid Klecknerbac59a12015-07-15 17:58:55 +0000171class LLVM_LIBRARY_VISIBILITY Preprocessor : public Common {
172public:
173 Preprocessor(const ToolChain &TC)
174 : Common("gcc::Preprocessor", "gcc preprocessor", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000175
Reid Klecknerbac59a12015-07-15 17:58:55 +0000176 bool hasGoodDiagnostics() const override { return true; }
177 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000178
Reid Klecknerbac59a12015-07-15 17:58:55 +0000179 void RenderExtraToolArgs(const JobAction &JA,
180 llvm::opt::ArgStringList &CmdArgs) const override;
181};
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000182
Reid Klecknerbac59a12015-07-15 17:58:55 +0000183class LLVM_LIBRARY_VISIBILITY Compiler : public Common {
184public:
185 Compiler(const ToolChain &TC) : Common("gcc::Compiler", "gcc frontend", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000186
Reid Klecknerbac59a12015-07-15 17:58:55 +0000187 bool hasGoodDiagnostics() const override { return true; }
188 bool hasIntegratedCPP() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000189
Reid Klecknerbac59a12015-07-15 17:58:55 +0000190 void RenderExtraToolArgs(const JobAction &JA,
191 llvm::opt::ArgStringList &CmdArgs) const override;
192};
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000193
Reid Klecknerbac59a12015-07-15 17:58:55 +0000194class LLVM_LIBRARY_VISIBILITY Linker : public Common {
195public:
196 Linker(const ToolChain &TC) : Common("gcc::Linker", "linker (via gcc)", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000197
Reid Klecknerbac59a12015-07-15 17:58:55 +0000198 bool hasIntegratedCPP() const override { return false; }
199 bool isLinkJob() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000200
Reid Klecknerbac59a12015-07-15 17:58:55 +0000201 void RenderExtraToolArgs(const JobAction &JA,
202 llvm::opt::ArgStringList &CmdArgs) const override;
203};
Daniel Dunbar82116f82009-03-17 22:45:24 +0000204} // end namespace gcc
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000205
Tony Linthicum76329bf2011-12-12 21:14:55 +0000206namespace hexagon {
Douglas Katzman95354292015-06-23 20:42:09 +0000207// For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile
208// and Compile.
209// We simply use "clang -cc1" for those actions.
210class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
211public:
212 Assembler(const ToolChain &TC)
213 : GnuTool("hexagon::Assembler", "hexagon-as", TC) {}
Tony Linthicum76329bf2011-12-12 21:14:55 +0000214
Douglas Katzman95354292015-06-23 20:42:09 +0000215 bool hasIntegratedCPP() const override { return false; }
Tony Linthicum76329bf2011-12-12 21:14:55 +0000216
Reid Klecknerbac59a12015-07-15 17:58:55 +0000217 void RenderExtraToolArgs(const JobAction &JA,
218 llvm::opt::ArgStringList &CmdArgs) const;
219 void ConstructJob(Compilation &C, const JobAction &JA,
220 const InputInfo &Output, const InputInfoList &Inputs,
221 const llvm::opt::ArgList &TCArgs,
222 const char *LinkingOutput) const override;
Douglas Katzman95354292015-06-23 20:42:09 +0000223};
Tony Linthicum76329bf2011-12-12 21:14:55 +0000224
Douglas Katzman95354292015-06-23 20:42:09 +0000225class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
226public:
227 Linker(const ToolChain &TC) : GnuTool("hexagon::Linker", "hexagon-ld", TC) {}
Tony Linthicum76329bf2011-12-12 21:14:55 +0000228
Douglas Katzman95354292015-06-23 20:42:09 +0000229 bool hasIntegratedCPP() const override { return false; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000230 bool isLinkJob() const override { return true; }
Tony Linthicum76329bf2011-12-12 21:14:55 +0000231
Reid Klecknerbac59a12015-07-15 17:58:55 +0000232 virtual void RenderExtraToolArgs(const JobAction &JA,
233 llvm::opt::ArgStringList &CmdArgs) const;
234 void ConstructJob(Compilation &C, const JobAction &JA,
235 const InputInfo &Output, const InputInfoList &Inputs,
236 const llvm::opt::ArgList &TCArgs,
237 const char *LinkingOutput) const override;
238};
Tony Linthicum76329bf2011-12-12 21:14:55 +0000239} // end namespace hexagon.
240
Tom Stellard8fa33092015-07-18 01:49:05 +0000241namespace amdgpu {
242
243class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
244public:
Tom Stellardf6699f52016-05-05 17:03:41 +0000245 Linker(const ToolChain &TC) : GnuTool("amdgpu::Linker", "ld.lld", TC) {}
Tom Stellard8fa33092015-07-18 01:49:05 +0000246 bool isLinkJob() const override { return true; }
247 bool hasIntegratedCPP() const override { return false; }
248 void ConstructJob(Compilation &C, const JobAction &JA,
249 const InputInfo &Output, const InputInfoList &Inputs,
250 const llvm::opt::ArgList &TCArgs,
251 const char *LinkingOutput) const override;
252};
253
254} // end namespace amdgpu
255
Dan Gohman52816862015-12-16 23:30:41 +0000256namespace wasm {
257
258class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
259public:
260 explicit Linker(const ToolChain &TC);
261 bool isLinkJob() const override;
262 bool hasIntegratedCPP() const override;
263 void ConstructJob(Compilation &C, const JobAction &JA,
264 const InputInfo &Output, const InputInfoList &Inputs,
265 const llvm::opt::ArgList &TCArgs,
266 const char *LinkingOutput) const override;
267};
268
269} // end namespace wasm
270
Bernard Ogden31561762013-12-12 13:27:11 +0000271namespace arm {
Renato Goline17c5802015-07-27 23:44:42 +0000272std::string getARMTargetCPU(StringRef CPU, StringRef Arch,
Reid Klecknerbac59a12015-07-15 17:58:55 +0000273 const llvm::Triple &Triple);
Renato Goline17c5802015-07-27 23:44:42 +0000274const std::string getARMArch(StringRef Arch,
Reid Klecknerbac59a12015-07-15 17:58:55 +0000275 const llvm::Triple &Triple);
Chandler Carruthd96f37a2015-08-30 07:51:18 +0000276StringRef getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple);
Vladimir Sukharev64f68242015-09-23 09:29:32 +0000277StringRef getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
278 const llvm::Triple &Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +0000279
Reid Klecknerbac59a12015-07-15 17:58:55 +0000280void appendEBLinkFlags(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs,
281 const llvm::Triple &Triple);
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000282} // end namespace arm
Tony Linthicum76329bf2011-12-12 21:14:55 +0000283
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000284namespace mips {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000285typedef enum { NanLegacy = 1, Nan2008 = 2 } NanEncoding;
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +0000286
287enum class FloatABI {
288 Invalid,
289 Soft,
290 Hard,
291};
292
Reid Klecknerbac59a12015-07-15 17:58:55 +0000293NanEncoding getSupportedNanEncoding(StringRef &CPU);
Simon Dardisd0e83ba2016-05-27 15:13:31 +0000294bool hasCompactBranches(StringRef &CPU);
Reid Klecknerbac59a12015-07-15 17:58:55 +0000295void getMipsCPUAndABI(const llvm::opt::ArgList &Args,
296 const llvm::Triple &Triple, StringRef &CPUName,
297 StringRef &ABIName);
Vasileios Kalintirisc744e122015-11-12 15:26:54 +0000298std::string getMipsABILibSuffix(const llvm::opt::ArgList &Args,
299 const llvm::Triple &Triple);
Reid Klecknerbac59a12015-07-15 17:58:55 +0000300bool hasMipsAbiArg(const llvm::opt::ArgList &Args, const char *Value);
301bool isUCLibc(const llvm::opt::ArgList &Args);
302bool isNaN2008(const llvm::opt::ArgList &Args, const llvm::Triple &Triple);
Petar Jovanovic3ca16222016-05-18 12:46:06 +0000303bool isFP64ADefault(const llvm::Triple &Triple, StringRef CPUName);
Reid Klecknerbac59a12015-07-15 17:58:55 +0000304bool isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +0000305 StringRef ABIName, mips::FloatABI FloatABI);
Reid Klecknerbac59a12015-07-15 17:58:55 +0000306bool shouldUseFPXX(const llvm::opt::ArgList &Args, const llvm::Triple &Triple,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +0000307 StringRef CPUName, StringRef ABIName,
308 mips::FloatABI FloatABI);
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000309} // end namespace mips
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000310
Ulrich Weigand8afad612014-07-28 13:17:52 +0000311namespace ppc {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000312bool hasPPCAbiArg(const llvm::opt::ArgList &Args, const char *Value);
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000313} // end namespace ppc
Ulrich Weigand8afad612014-07-28 13:17:52 +0000314
Douglas Katzman95354292015-06-23 20:42:09 +0000315/// cloudabi -- Directly call GNU Binutils linker
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000316namespace cloudabi {
Douglas Katzman95354292015-06-23 20:42:09 +0000317class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000318public:
Douglas Katzman95354292015-06-23 20:42:09 +0000319 Linker(const ToolChain &TC) : GnuTool("cloudabi::Linker", "linker", TC) {}
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000320
321 bool hasIntegratedCPP() const override { return false; }
322 bool isLinkJob() const override { return true; }
323
324 void ConstructJob(Compilation &C, const JobAction &JA,
325 const InputInfo &Output, const InputInfoList &Inputs,
326 const llvm::opt::ArgList &TCArgs,
327 const char *LinkingOutput) const override;
328};
329} // end namespace cloudabi
330
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000331namespace darwin {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000332llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
333void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
Rafael Espindoladcbf6982012-10-31 18:51:07 +0000334
Reid Klecknerbac59a12015-07-15 17:58:55 +0000335class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
336 virtual void anchor();
Daniel Dunbare9ded432009-09-09 18:36:20 +0000337
Reid Klecknerbac59a12015-07-15 17:58:55 +0000338protected:
339 void AddMachOArch(const llvm::opt::ArgList &Args,
340 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbare9ded432009-09-09 18:36:20 +0000341
Reid Klecknerbac59a12015-07-15 17:58:55 +0000342 const toolchains::MachO &getMachOToolChain() const {
343 return reinterpret_cast<const toolchains::MachO &>(getToolChain());
344 }
Daniel Dunbare9ded432009-09-09 18:36:20 +0000345
Reid Klecknerbac59a12015-07-15 17:58:55 +0000346public:
347 MachOTool(
348 const char *Name, const char *ShortName, const ToolChain &TC,
349 ResponseFileSupport ResponseSupport = RF_None,
350 llvm::sys::WindowsEncodingMethod ResponseEncoding = llvm::sys::WEM_UTF8,
351 const char *ResponseFlag = "@")
352 : Tool(Name, ShortName, TC, ResponseSupport, ResponseEncoding,
353 ResponseFlag) {}
354};
Daniel Dunbarbe220842009-03-20 16:06:39 +0000355
Reid Klecknerbac59a12015-07-15 17:58:55 +0000356class LLVM_LIBRARY_VISIBILITY Assembler : public MachOTool {
357public:
358 Assembler(const ToolChain &TC)
359 : MachOTool("darwin::Assembler", "assembler", TC) {}
Daniel Dunbarbe220842009-03-20 16:06:39 +0000360
Reid Klecknerbac59a12015-07-15 17:58:55 +0000361 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarbe220842009-03-20 16:06:39 +0000362
Reid Klecknerbac59a12015-07-15 17:58:55 +0000363 void ConstructJob(Compilation &C, const JobAction &JA,
364 const InputInfo &Output, const InputInfoList &Inputs,
365 const llvm::opt::ArgList &TCArgs,
366 const char *LinkingOutput) const override;
367};
Daniel Dunbarc1964212009-03-26 16:23:12 +0000368
Reid Klecknerbac59a12015-07-15 17:58:55 +0000369class LLVM_LIBRARY_VISIBILITY Linker : public MachOTool {
370 bool NeedsTempPath(const InputInfoList &Inputs) const;
371 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
372 llvm::opt::ArgStringList &CmdArgs,
373 const InputInfoList &Inputs) const;
Daniel Dunbarc1964212009-03-26 16:23:12 +0000374
Reid Klecknerbac59a12015-07-15 17:58:55 +0000375public:
376 Linker(const ToolChain &TC)
377 : MachOTool("darwin::Linker", "linker", TC, RF_FileList,
378 llvm::sys::WEM_UTF8, "-filelist") {}
Daniel Dunbarc1964212009-03-26 16:23:12 +0000379
Reid Klecknerbac59a12015-07-15 17:58:55 +0000380 bool hasIntegratedCPP() const override { return false; }
381 bool isLinkJob() const override { return true; }
Daniel Dunbarc1964212009-03-26 16:23:12 +0000382
Reid Klecknerbac59a12015-07-15 17:58:55 +0000383 void ConstructJob(Compilation &C, const JobAction &JA,
384 const InputInfo &Output, const InputInfoList &Inputs,
385 const llvm::opt::ArgList &TCArgs,
386 const char *LinkingOutput) const override;
387};
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000388
Reid Klecknerbac59a12015-07-15 17:58:55 +0000389class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool {
390public:
391 Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000392
Reid Klecknerbac59a12015-07-15 17:58:55 +0000393 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar88299622010-06-04 18:28:36 +0000394
Reid Klecknerbac59a12015-07-15 17:58:55 +0000395 void ConstructJob(Compilation &C, const JobAction &JA,
396 const InputInfo &Output, const InputInfoList &Inputs,
397 const llvm::opt::ArgList &TCArgs,
398 const char *LinkingOutput) const override;
399};
Daniel Dunbar88299622010-06-04 18:28:36 +0000400
Reid Klecknerbac59a12015-07-15 17:58:55 +0000401class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool {
402public:
403 Dsymutil(const ToolChain &TC)
404 : MachOTool("darwin::Dsymutil", "dsymutil", TC) {}
Daniel Dunbar88299622010-06-04 18:28:36 +0000405
Reid Klecknerbac59a12015-07-15 17:58:55 +0000406 bool hasIntegratedCPP() const override { return false; }
407 bool isDsymutilJob() const override { return true; }
Eric Christopher551ef452011-08-23 17:56:55 +0000408
Reid Klecknerbac59a12015-07-15 17:58:55 +0000409 void ConstructJob(Compilation &C, const JobAction &JA,
410 const InputInfo &Output, const InputInfoList &Inputs,
411 const llvm::opt::ArgList &TCArgs,
412 const char *LinkingOutput) const override;
413};
Eric Christopher551ef452011-08-23 17:56:55 +0000414
Reid Klecknerbac59a12015-07-15 17:58:55 +0000415class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool {
416public:
417 VerifyDebug(const ToolChain &TC)
418 : MachOTool("darwin::VerifyDebug", "dwarfdump", TC) {}
Eric Christopher551ef452011-08-23 17:56:55 +0000419
Reid Klecknerbac59a12015-07-15 17:58:55 +0000420 bool hasIntegratedCPP() const override { return false; }
Eric Christopher551ef452011-08-23 17:56:55 +0000421
Reid Klecknerbac59a12015-07-15 17:58:55 +0000422 void ConstructJob(Compilation &C, const JobAction &JA,
423 const InputInfo &Output, const InputInfoList &Inputs,
424 const llvm::opt::ArgList &TCArgs,
425 const char *LinkingOutput) const override;
426};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000427} // end namespace darwin
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000428
Douglas Katzman95354292015-06-23 20:42:09 +0000429/// openbsd -- Directly call GNU Binutils assembler and linker
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000430namespace openbsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000431class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
432public:
433 Assembler(const ToolChain &TC)
434 : GnuTool("openbsd::Assembler", "assembler", TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000435
Douglas Katzman95354292015-06-23 20:42:09 +0000436 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000437
Douglas Katzman95354292015-06-23 20:42:09 +0000438 void ConstructJob(Compilation &C, const JobAction &JA,
439 const InputInfo &Output, const InputInfoList &Inputs,
440 const llvm::opt::ArgList &TCArgs,
441 const char *LinkingOutput) const override;
442};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000443
Douglas Katzman95354292015-06-23 20:42:09 +0000444class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
445public:
446 Linker(const ToolChain &TC) : GnuTool("openbsd::Linker", "linker", TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000447
Douglas Katzman95354292015-06-23 20:42:09 +0000448 bool hasIntegratedCPP() const override { return false; }
449 bool isLinkJob() const override { return true; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000450
Reid Klecknerbac59a12015-07-15 17:58:55 +0000451 void ConstructJob(Compilation &C, const JobAction &JA,
452 const InputInfo &Output, const InputInfoList &Inputs,
453 const llvm::opt::ArgList &TCArgs,
454 const char *LinkingOutput) const override;
455};
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000456} // end namespace openbsd
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000457
Douglas Katzman95354292015-06-23 20:42:09 +0000458/// bitrig -- Directly call GNU Binutils assembler and linker
Eli Friedman9fa28852012-08-08 23:57:20 +0000459namespace bitrig {
Douglas Katzman95354292015-06-23 20:42:09 +0000460class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
461public:
462 Assembler(const ToolChain &TC)
463 : GnuTool("bitrig::Assembler", "assembler", TC) {}
Eli Friedman9fa28852012-08-08 23:57:20 +0000464
Douglas Katzman95354292015-06-23 20:42:09 +0000465 bool hasIntegratedCPP() const override { return false; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000466
Douglas Katzman95354292015-06-23 20:42:09 +0000467 void ConstructJob(Compilation &C, const JobAction &JA,
468 const InputInfo &Output, const InputInfoList &Inputs,
469 const llvm::opt::ArgList &TCArgs,
470 const char *LinkingOutput) const override;
471};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000472
Douglas Katzman95354292015-06-23 20:42:09 +0000473class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
474public:
475 Linker(const ToolChain &TC) : GnuTool("bitrig::Linker", "linker", TC) {}
Eli Friedman9fa28852012-08-08 23:57:20 +0000476
Douglas Katzman95354292015-06-23 20:42:09 +0000477 bool hasIntegratedCPP() const override { return false; }
478 bool isLinkJob() const override { return true; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000479
Reid Klecknerbac59a12015-07-15 17:58:55 +0000480 void ConstructJob(Compilation &C, const JobAction &JA,
481 const InputInfo &Output, const InputInfoList &Inputs,
482 const llvm::opt::ArgList &TCArgs,
483 const char *LinkingOutput) const override;
484};
Eli Friedman9fa28852012-08-08 23:57:20 +0000485} // end namespace bitrig
486
Douglas Katzman95354292015-06-23 20:42:09 +0000487/// freebsd -- Directly call GNU Binutils assembler and linker
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000488namespace freebsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000489class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
490public:
491 Assembler(const ToolChain &TC)
492 : GnuTool("freebsd::Assembler", "assembler", TC) {}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000493
Douglas Katzman95354292015-06-23 20:42:09 +0000494 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000495
Douglas Katzman95354292015-06-23 20:42:09 +0000496 void ConstructJob(Compilation &C, const JobAction &JA,
497 const InputInfo &Output, const InputInfoList &Inputs,
498 const llvm::opt::ArgList &TCArgs,
499 const char *LinkingOutput) const override;
500};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000501
Douglas Katzman95354292015-06-23 20:42:09 +0000502class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
503public:
504 Linker(const ToolChain &TC) : GnuTool("freebsd::Linker", "linker", TC) {}
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000505
Douglas Katzman95354292015-06-23 20:42:09 +0000506 bool hasIntegratedCPP() const override { return false; }
507 bool isLinkJob() const override { return true; }
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000508
Reid Klecknerbac59a12015-07-15 17:58:55 +0000509 void ConstructJob(Compilation &C, const JobAction &JA,
510 const InputInfo &Output, const InputInfoList &Inputs,
511 const llvm::opt::ArgList &TCArgs,
512 const char *LinkingOutput) const override;
513};
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000514} // end namespace freebsd
515
Douglas Katzman95354292015-06-23 20:42:09 +0000516/// netbsd -- Directly call GNU Binutils assembler and linker
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000517namespace netbsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000518class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
Douglas Katzman95354292015-06-23 20:42:09 +0000519public:
520 Assembler(const ToolChain &TC)
521 : GnuTool("netbsd::Assembler", "assembler", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000522
Douglas Katzman95354292015-06-23 20:42:09 +0000523 bool hasIntegratedCPP() const override { return false; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000524
Douglas Katzman95354292015-06-23 20:42:09 +0000525 void ConstructJob(Compilation &C, const JobAction &JA,
526 const InputInfo &Output, const InputInfoList &Inputs,
527 const llvm::opt::ArgList &TCArgs,
528 const char *LinkingOutput) const override;
529};
Joerg Sonnenberger637603a2011-05-16 13:35:02 +0000530
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000531class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
Douglas Katzman95354292015-06-23 20:42:09 +0000532public:
533 Linker(const ToolChain &TC) : GnuTool("netbsd::Linker", "linker", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000534
Douglas Katzman95354292015-06-23 20:42:09 +0000535 bool hasIntegratedCPP() const override { return false; }
536 bool isLinkJob() const override { return true; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000537
Reid Klecknerbac59a12015-07-15 17:58:55 +0000538 void ConstructJob(Compilation &C, const JobAction &JA,
539 const InputInfo &Output, const InputInfoList &Inputs,
540 const llvm::opt::ArgList &TCArgs,
541 const char *LinkingOutput) const override;
542};
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000543} // end namespace netbsd
544
Douglas Katzman95354292015-06-23 20:42:09 +0000545/// Directly call GNU Binutils' assembler and linker.
Thomas Schwinge4e555262013-03-28 19:04:25 +0000546namespace gnutools {
Douglas Katzman95354292015-06-23 20:42:09 +0000547class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
548public:
549 Assembler(const ToolChain &TC) : GnuTool("GNU::Assembler", "assembler", TC) {}
Rafael Espindola92b00932010-08-10 00:25:48 +0000550
Douglas Katzman95354292015-06-23 20:42:09 +0000551 bool hasIntegratedCPP() const override { return false; }
552
553 void ConstructJob(Compilation &C, const JobAction &JA,
554 const InputInfo &Output, const InputInfoList &Inputs,
555 const llvm::opt::ArgList &TCArgs,
556 const char *LinkingOutput) const override;
557};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000558
Douglas Katzman95354292015-06-23 20:42:09 +0000559class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
560public:
561 Linker(const ToolChain &TC) : GnuTool("GNU::Linker", "linker", TC) {}
562
563 bool hasIntegratedCPP() const override { return false; }
564 bool isLinkJob() const override { return true; }
Rafael Espindola92b00932010-08-10 00:25:48 +0000565
Reid Klecknerbac59a12015-07-15 17:58:55 +0000566 void ConstructJob(Compilation &C, const JobAction &JA,
567 const InputInfo &Output, const InputInfoList &Inputs,
568 const llvm::opt::ArgList &TCArgs,
569 const char *LinkingOutput) const override;
570};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000571} // end namespace gnutools
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000572
Reid Klecknerbac59a12015-07-15 17:58:55 +0000573namespace nacltools {
574class LLVM_LIBRARY_VISIBILITY AssemblerARM : public gnutools::Assembler {
575public:
576 AssemblerARM(const ToolChain &TC) : gnutools::Assembler(TC) {}
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000577
Reid Klecknerbac59a12015-07-15 17:58:55 +0000578 void ConstructJob(Compilation &C, const JobAction &JA,
579 const InputInfo &Output, const InputInfoList &Inputs,
580 const llvm::opt::ArgList &TCArgs,
581 const char *LinkingOutput) const override;
582};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000583
Derek Schuff821d8842015-11-16 22:21:25 +0000584class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000585public:
Derek Schuff821d8842015-11-16 22:21:25 +0000586 Linker(const ToolChain &TC) : GnuTool("NaCl::Linker", "linker", TC) {}
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000587
Reid Klecknerbac59a12015-07-15 17:58:55 +0000588 bool hasIntegratedCPP() const override { return false; }
589 bool isLinkJob() const override { return true; }
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000590
Reid Klecknerbac59a12015-07-15 17:58:55 +0000591 void ConstructJob(Compilation &C, const JobAction &JA,
592 const InputInfo &Output, const InputInfoList &Inputs,
593 const llvm::opt::ArgList &TCArgs,
594 const char *LinkingOutput) const override;
595};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000596} // end namespace nacltools
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000597
Douglas Katzman95354292015-06-23 20:42:09 +0000598/// minix -- Directly call GNU Binutils assembler and linker
Chris Lattner3e2ee142010-07-07 16:01:42 +0000599namespace minix {
Douglas Katzman95354292015-06-23 20:42:09 +0000600class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
601public:
602 Assembler(const ToolChain &TC)
603 : GnuTool("minix::Assembler", "assembler", TC) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000604
Douglas Katzman95354292015-06-23 20:42:09 +0000605 bool hasIntegratedCPP() const override { return false; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000606
Douglas Katzman95354292015-06-23 20:42:09 +0000607 void ConstructJob(Compilation &C, const JobAction &JA,
608 const InputInfo &Output, const InputInfoList &Inputs,
609 const llvm::opt::ArgList &TCArgs,
610 const char *LinkingOutput) const override;
611};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000612
Douglas Katzman95354292015-06-23 20:42:09 +0000613class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
614public:
615 Linker(const ToolChain &TC) : GnuTool("minix::Linker", "linker", TC) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000616
Douglas Katzman95354292015-06-23 20:42:09 +0000617 bool hasIntegratedCPP() const override { return false; }
618 bool isLinkJob() const override { return true; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000619
Reid Klecknerbac59a12015-07-15 17:58:55 +0000620 void ConstructJob(Compilation &C, const JobAction &JA,
621 const InputInfo &Output, const InputInfoList &Inputs,
622 const llvm::opt::ArgList &TCArgs,
623 const char *LinkingOutput) const override;
624};
Chris Lattner3e2ee142010-07-07 16:01:42 +0000625} // end namespace minix
626
Douglas Katzman95354292015-06-23 20:42:09 +0000627/// solaris -- Directly call Solaris assembler and linker
David Chisnallf571cde2012-02-15 13:39:01 +0000628namespace solaris {
Douglas Katzman95354292015-06-23 20:42:09 +0000629class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
630public:
631 Assembler(const ToolChain &TC)
632 : Tool("solaris::Assembler", "assembler", TC) {}
David Chisnallf571cde2012-02-15 13:39:01 +0000633
Douglas Katzman95354292015-06-23 20:42:09 +0000634 bool hasIntegratedCPP() const override { return false; }
David Chisnallf571cde2012-02-15 13:39:01 +0000635
Douglas Katzman95354292015-06-23 20:42:09 +0000636 void ConstructJob(Compilation &C, const JobAction &JA,
637 const InputInfo &Output, const InputInfoList &Inputs,
638 const llvm::opt::ArgList &TCArgs,
639 const char *LinkingOutput) const override;
640};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000641
Douglas Katzman95354292015-06-23 20:42:09 +0000642class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
643public:
644 Linker(const ToolChain &TC) : Tool("solaris::Linker", "linker", TC) {}
David Chisnallf571cde2012-02-15 13:39:01 +0000645
Douglas Katzman95354292015-06-23 20:42:09 +0000646 bool hasIntegratedCPP() const override { return false; }
647 bool isLinkJob() const override { return true; }
David Chisnallf571cde2012-02-15 13:39:01 +0000648
Reid Klecknerbac59a12015-07-15 17:58:55 +0000649 void ConstructJob(Compilation &C, const JobAction &JA,
650 const InputInfo &Output, const InputInfoList &Inputs,
651 const llvm::opt::ArgList &TCArgs,
652 const char *LinkingOutput) const override;
653};
David Chisnalla9ed5d72012-02-15 16:25:46 +0000654} // end namespace solaris
David Chisnallf571cde2012-02-15 13:39:01 +0000655
Douglas Katzman95354292015-06-23 20:42:09 +0000656/// dragonfly -- Directly call GNU Binutils assembler and linker
Daniel Dunbarcc912342009-05-02 18:28:39 +0000657namespace dragonfly {
Douglas Katzman95354292015-06-23 20:42:09 +0000658class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
659public:
660 Assembler(const ToolChain &TC)
661 : GnuTool("dragonfly::Assembler", "assembler", TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000662
Douglas Katzman95354292015-06-23 20:42:09 +0000663 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000664
Douglas Katzman95354292015-06-23 20:42:09 +0000665 void ConstructJob(Compilation &C, const JobAction &JA,
666 const InputInfo &Output, const InputInfoList &Inputs,
667 const llvm::opt::ArgList &TCArgs,
668 const char *LinkingOutput) const override;
669};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000670
Douglas Katzman95354292015-06-23 20:42:09 +0000671class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
672public:
673 Linker(const ToolChain &TC) : GnuTool("dragonfly::Linker", "linker", TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000674
Douglas Katzman95354292015-06-23 20:42:09 +0000675 bool hasIntegratedCPP() const override { return false; }
676 bool isLinkJob() const override { return true; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000677
Reid Klecknerbac59a12015-07-15 17:58:55 +0000678 void ConstructJob(Compilation &C, const JobAction &JA,
679 const InputInfo &Output, const InputInfoList &Inputs,
680 const llvm::opt::ArgList &TCArgs,
681 const char *LinkingOutput) const override;
682};
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000683} // end namespace dragonfly
Daniel Dunbarcc912342009-05-02 18:28:39 +0000684
Hans Wennborg1da044a2014-06-26 19:59:02 +0000685/// Visual studio tools.
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000686namespace visualstudio {
Adrian McCarthye4b26fc2016-05-13 23:20:11 +0000687VersionTuple getMSVCVersion(const Driver *D, const ToolChain &TC,
688 const llvm::Triple &Triple,
Douglas Katzman95354292015-06-23 20:42:09 +0000689 const llvm::opt::ArgList &Args, bool IsWindowsMSVC);
David Majnemere11d3732015-06-08 00:22:46 +0000690
Douglas Katzman95354292015-06-23 20:42:09 +0000691class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
692public:
693 Linker(const ToolChain &TC)
694 : Tool("visualstudio::Linker", "linker", TC, RF_Full,
695 llvm::sys::WEM_UTF16) {}
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000696
Douglas Katzman95354292015-06-23 20:42:09 +0000697 bool hasIntegratedCPP() const override { return false; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000698 bool isLinkJob() const override { return true; }
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000699
Reid Klecknerbac59a12015-07-15 17:58:55 +0000700 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;
Douglas Katzman95354292015-06-23 20:42:09 +0000704};
Hans Wennborg87cfa712013-09-19 20:32:16 +0000705
Douglas Katzman95354292015-06-23 20:42:09 +0000706class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
707public:
708 Compiler(const ToolChain &TC)
709 : Tool("visualstudio::Compiler", "compiler", TC, RF_Full,
710 llvm::sys::WEM_UTF16) {}
Hans Wennborg87cfa712013-09-19 20:32:16 +0000711
Douglas Katzman95354292015-06-23 20:42:09 +0000712 bool hasIntegratedAssembler() const override { return true; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000713 bool hasIntegratedCPP() const override { return true; }
714 bool isLinkJob() const override { return false; }
Hans Wennborg87cfa712013-09-19 20:32:16 +0000715
Reid Klecknerbac59a12015-07-15 17:58:55 +0000716 void ConstructJob(Compilation &C, const JobAction &JA,
717 const InputInfo &Output, const InputInfoList &Inputs,
718 const llvm::opt::ArgList &TCArgs,
719 const char *LinkingOutput) const override;
Hans Wennborg87cfa712013-09-19 20:32:16 +0000720
Reid Klecknerbac59a12015-07-15 17:58:55 +0000721 std::unique_ptr<Command> GetCommand(Compilation &C, const JobAction &JA,
722 const InputInfo &Output,
723 const InputInfoList &Inputs,
724 const llvm::opt::ArgList &TCArgs,
725 const char *LinkingOutput) const;
726};
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000727} // end namespace visualstudio
728
Yaron Keren1c0070c2015-07-02 04:45:27 +0000729/// MinGW -- Directly call GNU Binutils assembler and linker
730namespace MinGW {
731class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
732public:
733 Assembler(const ToolChain &TC) : Tool("MinGW::Assemble", "assembler", TC) {}
734
735 bool hasIntegratedCPP() const override { return false; }
736
737 void ConstructJob(Compilation &C, const JobAction &JA,
738 const InputInfo &Output, const InputInfoList &Inputs,
739 const llvm::opt::ArgList &TCArgs,
740 const char *LinkingOutput) const override;
741};
742
743class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
744public:
745 Linker(const ToolChain &TC) : Tool("MinGW::Linker", "linker", TC) {}
746
747 bool hasIntegratedCPP() const override { return false; }
748 bool isLinkJob() const override { return true; }
749
750 void ConstructJob(Compilation &C, const JobAction &JA,
751 const InputInfo &Output, const InputInfoList &Inputs,
752 const llvm::opt::ArgList &TCArgs,
753 const char *LinkingOutput) const override;
754
755private:
756 void AddLibGCC(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs) const;
757};
758} // end namespace MinGW
759
Tim Northover9c7e0352013-12-12 11:55:52 +0000760namespace arm {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000761enum class FloatABI {
762 Invalid,
763 Soft,
764 SoftFP,
765 Hard,
766};
767
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000768FloatABI getARMFloatABI(const ToolChain &TC, const llvm::opt::ArgList &Args);
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000769} // end namespace arm
770
Petar Jovanovic88a328f2015-12-14 17:51:50 +0000771namespace ppc {
772enum class FloatABI {
773 Invalid,
774 Soft,
775 Hard,
776};
777
778FloatABI getPPCFloatABI(const Driver &D, const llvm::opt::ArgList &Args);
779} // end namespace ppc
780
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +0000781namespace sparc {
782enum class FloatABI {
783 Invalid,
784 Soft,
785 Hard,
786};
787
788FloatABI getSparcFloatABI(const Driver &D, const llvm::opt::ArgList &Args);
789} // end namespace sparc
790
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000791namespace XCore {
Douglas Katzman95354292015-06-23 20:42:09 +0000792// For XCore, we do not need to instantiate tools for PreProcess, PreCompile and
793// Compile.
794// We simply use "clang -cc1" for those actions.
795class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000796public:
Douglas Katzman95354292015-06-23 20:42:09 +0000797 Assembler(const ToolChain &TC) : Tool("XCore::Assembler", "XCore-as", TC) {}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000798
799 bool hasIntegratedCPP() const override { return false; }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000800 void ConstructJob(Compilation &C, const JobAction &JA,
801 const InputInfo &Output, const InputInfoList &Inputs,
802 const llvm::opt::ArgList &TCArgs,
803 const char *LinkingOutput) const override;
804};
805
Douglas Katzman95354292015-06-23 20:42:09 +0000806class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000807public:
Douglas Katzman95354292015-06-23 20:42:09 +0000808 Linker(const ToolChain &TC) : Tool("XCore::Linker", "XCore-ld", TC) {}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000809
810 bool hasIntegratedCPP() const override { return false; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000811 bool isLinkJob() const override { return true; }
812 void ConstructJob(Compilation &C, const JobAction &JA,
813 const InputInfo &Output, const InputInfoList &Inputs,
814 const llvm::opt::ArgList &TCArgs,
815 const char *LinkingOutput) const override;
816};
817} // end namespace XCore.
Douglas Katzman95354292015-06-23 20:42:09 +0000818
Reid Klecknerbac59a12015-07-15 17:58:55 +0000819namespace CrossWindows {
820class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
821public:
822 Assembler(const ToolChain &TC) : Tool("CrossWindows::Assembler", "as", TC) {}
Douglas Katzman95354292015-06-23 20:42:09 +0000823
Reid Klecknerbac59a12015-07-15 17:58:55 +0000824 bool hasIntegratedCPP() const override { return false; }
Douglas Katzman95354292015-06-23 20:42:09 +0000825
Reid Klecknerbac59a12015-07-15 17:58:55 +0000826 void ConstructJob(Compilation &C, const JobAction &JA,
827 const InputInfo &Output, const InputInfoList &Inputs,
828 const llvm::opt::ArgList &TCArgs,
829 const char *LinkingOutput) const override;
830};
Douglas Katzman95354292015-06-23 20:42:09 +0000831
Reid Klecknerbac59a12015-07-15 17:58:55 +0000832class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
833public:
834 Linker(const ToolChain &TC)
835 : Tool("CrossWindows::Linker", "ld", TC, RF_Full) {}
Douglas Katzman95354292015-06-23 20:42:09 +0000836
Reid Klecknerbac59a12015-07-15 17:58:55 +0000837 bool hasIntegratedCPP() const override { return false; }
838 bool isLinkJob() const override { return true; }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000839
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};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000845} // end namespace CrossWindows
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000846
Douglas Katzman84a75642015-06-19 14:55:19 +0000847/// SHAVE tools -- Directly call moviCompile and moviAsm
848namespace SHAVE {
Douglas Katzman95354292015-06-23 20:42:09 +0000849class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
Douglas Katzman84a75642015-06-19 14:55:19 +0000850public:
Douglas Katzman95354292015-06-23 20:42:09 +0000851 Compiler(const ToolChain &TC) : Tool("moviCompile", "movicompile", TC) {}
Douglas Katzman84a75642015-06-19 14:55:19 +0000852
853 bool hasIntegratedCPP() const override { return true; }
854
855 void ConstructJob(Compilation &C, const JobAction &JA,
856 const InputInfo &Output, const InputInfoList &Inputs,
857 const llvm::opt::ArgList &TCArgs,
858 const char *LinkingOutput) const override;
859};
860
Douglas Katzman95354292015-06-23 20:42:09 +0000861class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
Douglas Katzman84a75642015-06-19 14:55:19 +0000862public:
Douglas Katzman95354292015-06-23 20:42:09 +0000863 Assembler(const ToolChain &TC) : Tool("moviAsm", "moviAsm", TC) {}
Douglas Katzman84a75642015-06-19 14:55:19 +0000864
865 bool hasIntegratedCPP() const override { return false; } // not sure.
866
867 void ConstructJob(Compilation &C, const JobAction &JA,
868 const InputInfo &Output, const InputInfoList &Inputs,
869 const llvm::opt::ArgList &TCArgs,
870 const char *LinkingOutput) const override;
871};
872} // end namespace SHAVE
873
Douglas Katzmand6e597c2015-09-17 19:56:40 +0000874/// The Myriad toolchain uses tools that are in two different namespaces.
875/// The Compiler and Assembler as defined above are in the SHAVE namespace,
876/// whereas the linker, which accepts code for a mixture of Sparc and SHAVE,
877/// is in the Myriad namespace.
878namespace Myriad {
879class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
880public:
881 Linker(const ToolChain &TC) : GnuTool("shave::Linker", "ld", TC) {}
882 bool hasIntegratedCPP() const override { return false; }
883 bool isLinkJob() const override { return true; }
884 void ConstructJob(Compilation &C, const JobAction &JA,
885 const InputInfo &Output, const InputInfoList &Inputs,
886 const llvm::opt::ArgList &TCArgs,
887 const char *LinkingOutput) const override;
888};
889} // end namespace Myriad
890
Filipe Cabecinhasc888e192015-10-14 12:25:43 +0000891namespace PS4cpu {
892class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
893public:
894 Assemble(const ToolChain &TC)
895 : Tool("PS4cpu::Assemble", "assembler", TC, RF_Full) {}
896
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000897 bool hasIntegratedCPP() const override { return false; }
Filipe Cabecinhasc888e192015-10-14 12:25:43 +0000898
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000899 void ConstructJob(Compilation &C, const JobAction &JA,
900 const InputInfo &Output,
901 const InputInfoList &Inputs,
902 const llvm::opt::ArgList &TCArgs,
903 const char *LinkingOutput) const override;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +0000904};
905
906class LLVM_LIBRARY_VISIBILITY Link : public Tool {
907public:
908 Link(const ToolChain &TC) : Tool("PS4cpu::Link", "linker", TC, RF_Full) {}
909
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000910 bool hasIntegratedCPP() const override { return false; }
911 bool isLinkJob() const override { return true; }
Filipe Cabecinhasc888e192015-10-14 12:25:43 +0000912
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000913 void ConstructJob(Compilation &C, const JobAction &JA,
914 const InputInfo &Output,
915 const InputInfoList &Inputs,
916 const llvm::opt::ArgList &TCArgs,
917 const char *LinkingOutput) const override;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +0000918};
919} // end namespace PS4cpu
920
Justin Lebar21e5d4f2016-01-14 21:41:27 +0000921namespace NVPTX {
922
923// Run ptxas, the NVPTX assembler.
924class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
925 public:
926 Assembler(const ToolChain &TC)
927 : Tool("NVPTX::Assembler", "ptxas", TC, RF_Full, llvm::sys::WEM_UTF8,
928 "--options-file") {}
929
930 bool hasIntegratedCPP() const override { return false; }
931
932 void ConstructJob(Compilation &C, const JobAction &JA,
933 const InputInfo &Output, const InputInfoList &Inputs,
934 const llvm::opt::ArgList &TCArgs,
935 const char *LinkingOutput) const override;
936};
937
938// Runs fatbinary, which combines GPU object files ("cubin" files) and/or PTX
939// assembly into a single output file.
940class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
941 public:
942 Linker(const ToolChain &TC)
943 : Tool("NVPTX::Linker", "fatbinary", TC, RF_Full, llvm::sys::WEM_UTF8,
944 "--options-file") {}
945
946 bool hasIntegratedCPP() const override { return false; }
947
948 void ConstructJob(Compilation &C, const JobAction &JA,
949 const InputInfo &Output, const InputInfoList &Inputs,
950 const llvm::opt::ArgList &TCArgs,
951 const char *LinkingOutput) const override;
952};
953
954} // end namespace NVPTX
955
Douglas Katzman9dc5fbb2015-06-03 16:56:50 +0000956} // end namespace tools
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000957} // end namespace driver
958} // end namespace clang
959
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000960#endif // LLVM_CLANG_LIB_DRIVER_TOOLS_H