blob: d25d91d87f34eb311960f6fecedd8a502b9c2154 [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:
Konstantin Zhuravlyov65687112016-03-29 15:54:09 +0000245 Linker(const ToolChain &TC) : GnuTool("amdgpu::Linker", "amdphdrs", 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);
294void getMipsCPUAndABI(const llvm::opt::ArgList &Args,
295 const llvm::Triple &Triple, StringRef &CPUName,
296 StringRef &ABIName);
Vasileios Kalintirisc744e122015-11-12 15:26:54 +0000297std::string getMipsABILibSuffix(const llvm::opt::ArgList &Args,
298 const llvm::Triple &Triple);
Reid Klecknerbac59a12015-07-15 17:58:55 +0000299bool hasMipsAbiArg(const llvm::opt::ArgList &Args, const char *Value);
300bool isUCLibc(const llvm::opt::ArgList &Args);
301bool isNaN2008(const llvm::opt::ArgList &Args, const llvm::Triple &Triple);
302bool isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +0000303 StringRef ABIName, mips::FloatABI FloatABI);
Reid Klecknerbac59a12015-07-15 17:58:55 +0000304bool shouldUseFPXX(const llvm::opt::ArgList &Args, const llvm::Triple &Triple,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +0000305 StringRef CPUName, StringRef ABIName,
306 mips::FloatABI FloatABI);
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000307} // end namespace mips
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000308
Ulrich Weigand8afad612014-07-28 13:17:52 +0000309namespace ppc {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000310bool hasPPCAbiArg(const llvm::opt::ArgList &Args, const char *Value);
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000311} // end namespace ppc
Ulrich Weigand8afad612014-07-28 13:17:52 +0000312
Douglas Katzman95354292015-06-23 20:42:09 +0000313/// cloudabi -- Directly call GNU Binutils linker
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000314namespace cloudabi {
Douglas Katzman95354292015-06-23 20:42:09 +0000315class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000316public:
Douglas Katzman95354292015-06-23 20:42:09 +0000317 Linker(const ToolChain &TC) : GnuTool("cloudabi::Linker", "linker", TC) {}
Ed Schouten3c3e58c2015-03-26 11:13:44 +0000318
319 bool hasIntegratedCPP() const override { return false; }
320 bool isLinkJob() const override { return true; }
321
322 void ConstructJob(Compilation &C, const JobAction &JA,
323 const InputInfo &Output, const InputInfoList &Inputs,
324 const llvm::opt::ArgList &TCArgs,
325 const char *LinkingOutput) const override;
326};
327} // end namespace cloudabi
328
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000329namespace darwin {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000330llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
331void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
Rafael Espindoladcbf6982012-10-31 18:51:07 +0000332
Reid Klecknerbac59a12015-07-15 17:58:55 +0000333class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
334 virtual void anchor();
Daniel Dunbare9ded432009-09-09 18:36:20 +0000335
Reid Klecknerbac59a12015-07-15 17:58:55 +0000336protected:
337 void AddMachOArch(const llvm::opt::ArgList &Args,
338 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbare9ded432009-09-09 18:36:20 +0000339
Reid Klecknerbac59a12015-07-15 17:58:55 +0000340 const toolchains::MachO &getMachOToolChain() const {
341 return reinterpret_cast<const toolchains::MachO &>(getToolChain());
342 }
Daniel Dunbare9ded432009-09-09 18:36:20 +0000343
Reid Klecknerbac59a12015-07-15 17:58:55 +0000344public:
345 MachOTool(
346 const char *Name, const char *ShortName, const ToolChain &TC,
347 ResponseFileSupport ResponseSupport = RF_None,
348 llvm::sys::WindowsEncodingMethod ResponseEncoding = llvm::sys::WEM_UTF8,
349 const char *ResponseFlag = "@")
350 : Tool(Name, ShortName, TC, ResponseSupport, ResponseEncoding,
351 ResponseFlag) {}
352};
Daniel Dunbarbe220842009-03-20 16:06:39 +0000353
Reid Klecknerbac59a12015-07-15 17:58:55 +0000354class LLVM_LIBRARY_VISIBILITY Assembler : public MachOTool {
355public:
356 Assembler(const ToolChain &TC)
357 : MachOTool("darwin::Assembler", "assembler", TC) {}
Daniel Dunbarbe220842009-03-20 16:06:39 +0000358
Reid Klecknerbac59a12015-07-15 17:58:55 +0000359 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarbe220842009-03-20 16:06:39 +0000360
Reid Klecknerbac59a12015-07-15 17:58:55 +0000361 void ConstructJob(Compilation &C, const JobAction &JA,
362 const InputInfo &Output, const InputInfoList &Inputs,
363 const llvm::opt::ArgList &TCArgs,
364 const char *LinkingOutput) const override;
365};
Daniel Dunbarc1964212009-03-26 16:23:12 +0000366
Reid Klecknerbac59a12015-07-15 17:58:55 +0000367class LLVM_LIBRARY_VISIBILITY Linker : public MachOTool {
368 bool NeedsTempPath(const InputInfoList &Inputs) const;
369 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
370 llvm::opt::ArgStringList &CmdArgs,
371 const InputInfoList &Inputs) const;
Daniel Dunbarc1964212009-03-26 16:23:12 +0000372
Reid Klecknerbac59a12015-07-15 17:58:55 +0000373public:
374 Linker(const ToolChain &TC)
375 : MachOTool("darwin::Linker", "linker", TC, RF_FileList,
376 llvm::sys::WEM_UTF8, "-filelist") {}
Daniel Dunbarc1964212009-03-26 16:23:12 +0000377
Reid Klecknerbac59a12015-07-15 17:58:55 +0000378 bool hasIntegratedCPP() const override { return false; }
379 bool isLinkJob() const override { return true; }
Daniel Dunbarc1964212009-03-26 16:23:12 +0000380
Reid Klecknerbac59a12015-07-15 17:58:55 +0000381 void ConstructJob(Compilation &C, const JobAction &JA,
382 const InputInfo &Output, const InputInfoList &Inputs,
383 const llvm::opt::ArgList &TCArgs,
384 const char *LinkingOutput) const override;
385};
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000386
Reid Klecknerbac59a12015-07-15 17:58:55 +0000387class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool {
388public:
389 Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000390
Reid Klecknerbac59a12015-07-15 17:58:55 +0000391 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar88299622010-06-04 18:28:36 +0000392
Reid Klecknerbac59a12015-07-15 17:58:55 +0000393 void ConstructJob(Compilation &C, const JobAction &JA,
394 const InputInfo &Output, const InputInfoList &Inputs,
395 const llvm::opt::ArgList &TCArgs,
396 const char *LinkingOutput) const override;
397};
Daniel Dunbar88299622010-06-04 18:28:36 +0000398
Reid Klecknerbac59a12015-07-15 17:58:55 +0000399class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool {
400public:
401 Dsymutil(const ToolChain &TC)
402 : MachOTool("darwin::Dsymutil", "dsymutil", TC) {}
Daniel Dunbar88299622010-06-04 18:28:36 +0000403
Reid Klecknerbac59a12015-07-15 17:58:55 +0000404 bool hasIntegratedCPP() const override { return false; }
405 bool isDsymutilJob() const override { return true; }
Eric Christopher551ef452011-08-23 17:56:55 +0000406
Reid Klecknerbac59a12015-07-15 17:58:55 +0000407 void ConstructJob(Compilation &C, const JobAction &JA,
408 const InputInfo &Output, const InputInfoList &Inputs,
409 const llvm::opt::ArgList &TCArgs,
410 const char *LinkingOutput) const override;
411};
Eric Christopher551ef452011-08-23 17:56:55 +0000412
Reid Klecknerbac59a12015-07-15 17:58:55 +0000413class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool {
414public:
415 VerifyDebug(const ToolChain &TC)
416 : MachOTool("darwin::VerifyDebug", "dwarfdump", TC) {}
Eric Christopher551ef452011-08-23 17:56:55 +0000417
Reid Klecknerbac59a12015-07-15 17:58:55 +0000418 bool hasIntegratedCPP() const override { return false; }
Eric Christopher551ef452011-08-23 17:56:55 +0000419
Reid Klecknerbac59a12015-07-15 17:58:55 +0000420 void ConstructJob(Compilation &C, const JobAction &JA,
421 const InputInfo &Output, const InputInfoList &Inputs,
422 const llvm::opt::ArgList &TCArgs,
423 const char *LinkingOutput) const override;
424};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000425} // end namespace darwin
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000426
Douglas Katzman95354292015-06-23 20:42:09 +0000427/// openbsd -- Directly call GNU Binutils assembler and linker
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000428namespace openbsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000429class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
430public:
431 Assembler(const ToolChain &TC)
432 : GnuTool("openbsd::Assembler", "assembler", TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000433
Douglas Katzman95354292015-06-23 20:42:09 +0000434 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000435
Douglas Katzman95354292015-06-23 20:42:09 +0000436 void ConstructJob(Compilation &C, const JobAction &JA,
437 const InputInfo &Output, const InputInfoList &Inputs,
438 const llvm::opt::ArgList &TCArgs,
439 const char *LinkingOutput) const override;
440};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000441
Douglas Katzman95354292015-06-23 20:42:09 +0000442class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
443public:
444 Linker(const ToolChain &TC) : GnuTool("openbsd::Linker", "linker", TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000445
Douglas Katzman95354292015-06-23 20:42:09 +0000446 bool hasIntegratedCPP() const override { return false; }
447 bool isLinkJob() const override { return true; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000448
Reid Klecknerbac59a12015-07-15 17:58:55 +0000449 void ConstructJob(Compilation &C, const JobAction &JA,
450 const InputInfo &Output, const InputInfoList &Inputs,
451 const llvm::opt::ArgList &TCArgs,
452 const char *LinkingOutput) const override;
453};
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000454} // end namespace openbsd
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000455
Douglas Katzman95354292015-06-23 20:42:09 +0000456/// bitrig -- Directly call GNU Binutils assembler and linker
Eli Friedman9fa28852012-08-08 23:57:20 +0000457namespace bitrig {
Douglas Katzman95354292015-06-23 20:42:09 +0000458class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
459public:
460 Assembler(const ToolChain &TC)
461 : GnuTool("bitrig::Assembler", "assembler", TC) {}
Eli Friedman9fa28852012-08-08 23:57:20 +0000462
Douglas Katzman95354292015-06-23 20:42:09 +0000463 bool hasIntegratedCPP() const override { return false; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000464
Douglas Katzman95354292015-06-23 20:42:09 +0000465 void ConstructJob(Compilation &C, const JobAction &JA,
466 const InputInfo &Output, const InputInfoList &Inputs,
467 const llvm::opt::ArgList &TCArgs,
468 const char *LinkingOutput) const override;
469};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000470
Douglas Katzman95354292015-06-23 20:42:09 +0000471class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
472public:
473 Linker(const ToolChain &TC) : GnuTool("bitrig::Linker", "linker", TC) {}
Eli Friedman9fa28852012-08-08 23:57:20 +0000474
Douglas Katzman95354292015-06-23 20:42:09 +0000475 bool hasIntegratedCPP() const override { return false; }
476 bool isLinkJob() const override { return true; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000477
Reid Klecknerbac59a12015-07-15 17:58:55 +0000478 void ConstructJob(Compilation &C, const JobAction &JA,
479 const InputInfo &Output, const InputInfoList &Inputs,
480 const llvm::opt::ArgList &TCArgs,
481 const char *LinkingOutput) const override;
482};
Eli Friedman9fa28852012-08-08 23:57:20 +0000483} // end namespace bitrig
484
Douglas Katzman95354292015-06-23 20:42:09 +0000485/// freebsd -- Directly call GNU Binutils assembler and linker
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000486namespace freebsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000487class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
488public:
489 Assembler(const ToolChain &TC)
490 : GnuTool("freebsd::Assembler", "assembler", TC) {}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000491
Douglas Katzman95354292015-06-23 20:42:09 +0000492 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000493
Douglas Katzman95354292015-06-23 20:42:09 +0000494 void ConstructJob(Compilation &C, const JobAction &JA,
495 const InputInfo &Output, const InputInfoList &Inputs,
496 const llvm::opt::ArgList &TCArgs,
497 const char *LinkingOutput) const override;
498};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000499
Douglas Katzman95354292015-06-23 20:42:09 +0000500class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
501public:
502 Linker(const ToolChain &TC) : GnuTool("freebsd::Linker", "linker", TC) {}
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000503
Douglas Katzman95354292015-06-23 20:42:09 +0000504 bool hasIntegratedCPP() const override { return false; }
505 bool isLinkJob() const override { return true; }
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000506
Reid Klecknerbac59a12015-07-15 17:58:55 +0000507 void ConstructJob(Compilation &C, const JobAction &JA,
508 const InputInfo &Output, const InputInfoList &Inputs,
509 const llvm::opt::ArgList &TCArgs,
510 const char *LinkingOutput) const override;
511};
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000512} // end namespace freebsd
513
Douglas Katzman95354292015-06-23 20:42:09 +0000514/// netbsd -- Directly call GNU Binutils assembler and linker
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000515namespace netbsd {
Douglas Katzman95354292015-06-23 20:42:09 +0000516class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
Douglas Katzman95354292015-06-23 20:42:09 +0000517public:
518 Assembler(const ToolChain &TC)
519 : GnuTool("netbsd::Assembler", "assembler", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000520
Douglas Katzman95354292015-06-23 20:42:09 +0000521 bool hasIntegratedCPP() const override { return false; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000522
Douglas Katzman95354292015-06-23 20:42:09 +0000523 void ConstructJob(Compilation &C, const JobAction &JA,
524 const InputInfo &Output, const InputInfoList &Inputs,
525 const llvm::opt::ArgList &TCArgs,
526 const char *LinkingOutput) const override;
527};
Joerg Sonnenberger637603a2011-05-16 13:35:02 +0000528
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000529class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
Douglas Katzman95354292015-06-23 20:42:09 +0000530public:
531 Linker(const ToolChain &TC) : GnuTool("netbsd::Linker", "linker", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000532
Douglas Katzman95354292015-06-23 20:42:09 +0000533 bool hasIntegratedCPP() const override { return false; }
534 bool isLinkJob() const override { return true; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000535
Reid Klecknerbac59a12015-07-15 17:58:55 +0000536 void ConstructJob(Compilation &C, const JobAction &JA,
537 const InputInfo &Output, const InputInfoList &Inputs,
538 const llvm::opt::ArgList &TCArgs,
539 const char *LinkingOutput) const override;
540};
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000541} // end namespace netbsd
542
Douglas Katzman95354292015-06-23 20:42:09 +0000543/// Directly call GNU Binutils' assembler and linker.
Thomas Schwinge4e555262013-03-28 19:04:25 +0000544namespace gnutools {
Douglas Katzman95354292015-06-23 20:42:09 +0000545class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
546public:
547 Assembler(const ToolChain &TC) : GnuTool("GNU::Assembler", "assembler", TC) {}
Rafael Espindola92b00932010-08-10 00:25:48 +0000548
Douglas Katzman95354292015-06-23 20:42:09 +0000549 bool hasIntegratedCPP() const override { return false; }
550
551 void ConstructJob(Compilation &C, const JobAction &JA,
552 const InputInfo &Output, const InputInfoList &Inputs,
553 const llvm::opt::ArgList &TCArgs,
554 const char *LinkingOutput) const override;
555};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000556
Douglas Katzman95354292015-06-23 20:42:09 +0000557class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
558public:
559 Linker(const ToolChain &TC) : GnuTool("GNU::Linker", "linker", TC) {}
560
561 bool hasIntegratedCPP() const override { return false; }
562 bool isLinkJob() const override { return true; }
Rafael Espindola92b00932010-08-10 00:25:48 +0000563
Reid Klecknerbac59a12015-07-15 17:58:55 +0000564 void ConstructJob(Compilation &C, const JobAction &JA,
565 const InputInfo &Output, const InputInfoList &Inputs,
566 const llvm::opt::ArgList &TCArgs,
567 const char *LinkingOutput) const override;
568};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000569} // end namespace gnutools
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000570
Reid Klecknerbac59a12015-07-15 17:58:55 +0000571namespace nacltools {
572class LLVM_LIBRARY_VISIBILITY AssemblerARM : public gnutools::Assembler {
573public:
574 AssemblerARM(const ToolChain &TC) : gnutools::Assembler(TC) {}
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000575
Reid Klecknerbac59a12015-07-15 17:58:55 +0000576 void ConstructJob(Compilation &C, const JobAction &JA,
577 const InputInfo &Output, const InputInfoList &Inputs,
578 const llvm::opt::ArgList &TCArgs,
579 const char *LinkingOutput) const override;
580};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000581
Derek Schuff821d8842015-11-16 22:21:25 +0000582class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
Reid Klecknerbac59a12015-07-15 17:58:55 +0000583public:
Derek Schuff821d8842015-11-16 22:21:25 +0000584 Linker(const ToolChain &TC) : GnuTool("NaCl::Linker", "linker", TC) {}
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000585
Reid Klecknerbac59a12015-07-15 17:58:55 +0000586 bool hasIntegratedCPP() const override { return false; }
587 bool isLinkJob() const override { return true; }
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000588
Reid Klecknerbac59a12015-07-15 17:58:55 +0000589 void ConstructJob(Compilation &C, const JobAction &JA,
590 const InputInfo &Output, const InputInfoList &Inputs,
591 const llvm::opt::ArgList &TCArgs,
592 const char *LinkingOutput) const override;
593};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000594} // end namespace nacltools
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000595
Douglas Katzman95354292015-06-23 20:42:09 +0000596/// minix -- Directly call GNU Binutils assembler and linker
Chris Lattner3e2ee142010-07-07 16:01:42 +0000597namespace minix {
Douglas Katzman95354292015-06-23 20:42:09 +0000598class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
599public:
600 Assembler(const ToolChain &TC)
601 : GnuTool("minix::Assembler", "assembler", TC) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000602
Douglas Katzman95354292015-06-23 20:42:09 +0000603 bool hasIntegratedCPP() const override { return false; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000604
Douglas Katzman95354292015-06-23 20:42:09 +0000605 void ConstructJob(Compilation &C, const JobAction &JA,
606 const InputInfo &Output, const InputInfoList &Inputs,
607 const llvm::opt::ArgList &TCArgs,
608 const char *LinkingOutput) const override;
609};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000610
Douglas Katzman95354292015-06-23 20:42:09 +0000611class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
612public:
613 Linker(const ToolChain &TC) : GnuTool("minix::Linker", "linker", TC) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000614
Douglas Katzman95354292015-06-23 20:42:09 +0000615 bool hasIntegratedCPP() const override { return false; }
616 bool isLinkJob() const override { return true; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000617
Reid Klecknerbac59a12015-07-15 17:58:55 +0000618 void ConstructJob(Compilation &C, const JobAction &JA,
619 const InputInfo &Output, const InputInfoList &Inputs,
620 const llvm::opt::ArgList &TCArgs,
621 const char *LinkingOutput) const override;
622};
Chris Lattner3e2ee142010-07-07 16:01:42 +0000623} // end namespace minix
624
Douglas Katzman95354292015-06-23 20:42:09 +0000625/// solaris -- Directly call Solaris assembler and linker
David Chisnallf571cde2012-02-15 13:39:01 +0000626namespace solaris {
Douglas Katzman95354292015-06-23 20:42:09 +0000627class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
628public:
629 Assembler(const ToolChain &TC)
630 : Tool("solaris::Assembler", "assembler", TC) {}
David Chisnallf571cde2012-02-15 13:39:01 +0000631
Douglas Katzman95354292015-06-23 20:42:09 +0000632 bool hasIntegratedCPP() const override { return false; }
David Chisnallf571cde2012-02-15 13:39:01 +0000633
Douglas Katzman95354292015-06-23 20:42:09 +0000634 void ConstructJob(Compilation &C, const JobAction &JA,
635 const InputInfo &Output, const InputInfoList &Inputs,
636 const llvm::opt::ArgList &TCArgs,
637 const char *LinkingOutput) const override;
638};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000639
Douglas Katzman95354292015-06-23 20:42:09 +0000640class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
641public:
642 Linker(const ToolChain &TC) : Tool("solaris::Linker", "linker", TC) {}
David Chisnallf571cde2012-02-15 13:39:01 +0000643
Douglas Katzman95354292015-06-23 20:42:09 +0000644 bool hasIntegratedCPP() const override { return false; }
645 bool isLinkJob() const override { return true; }
David Chisnallf571cde2012-02-15 13:39:01 +0000646
Reid Klecknerbac59a12015-07-15 17:58:55 +0000647 void ConstructJob(Compilation &C, const JobAction &JA,
648 const InputInfo &Output, const InputInfoList &Inputs,
649 const llvm::opt::ArgList &TCArgs,
650 const char *LinkingOutput) const override;
651};
David Chisnalla9ed5d72012-02-15 16:25:46 +0000652} // end namespace solaris
David Chisnallf571cde2012-02-15 13:39:01 +0000653
Douglas Katzman95354292015-06-23 20:42:09 +0000654/// dragonfly -- Directly call GNU Binutils assembler and linker
Daniel Dunbarcc912342009-05-02 18:28:39 +0000655namespace dragonfly {
Douglas Katzman95354292015-06-23 20:42:09 +0000656class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
657public:
658 Assembler(const ToolChain &TC)
659 : GnuTool("dragonfly::Assembler", "assembler", TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000660
Douglas Katzman95354292015-06-23 20:42:09 +0000661 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000662
Douglas Katzman95354292015-06-23 20:42:09 +0000663 void ConstructJob(Compilation &C, const JobAction &JA,
664 const InputInfo &Output, const InputInfoList &Inputs,
665 const llvm::opt::ArgList &TCArgs,
666 const char *LinkingOutput) const override;
667};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000668
Douglas Katzman95354292015-06-23 20:42:09 +0000669class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
670public:
671 Linker(const ToolChain &TC) : GnuTool("dragonfly::Linker", "linker", TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000672
Douglas Katzman95354292015-06-23 20:42:09 +0000673 bool hasIntegratedCPP() const override { return false; }
674 bool isLinkJob() const override { return true; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000675
Reid Klecknerbac59a12015-07-15 17:58:55 +0000676 void ConstructJob(Compilation &C, const JobAction &JA,
677 const InputInfo &Output, const InputInfoList &Inputs,
678 const llvm::opt::ArgList &TCArgs,
679 const char *LinkingOutput) const override;
680};
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000681} // end namespace dragonfly
Daniel Dunbarcc912342009-05-02 18:28:39 +0000682
Hans Wennborg1da044a2014-06-26 19:59:02 +0000683/// Visual studio tools.
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000684namespace visualstudio {
Douglas Katzman95354292015-06-23 20:42:09 +0000685VersionTuple getMSVCVersion(const Driver *D, const llvm::Triple &Triple,
686 const llvm::opt::ArgList &Args, bool IsWindowsMSVC);
David Majnemere11d3732015-06-08 00:22:46 +0000687
Douglas Katzman95354292015-06-23 20:42:09 +0000688class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
689public:
690 Linker(const ToolChain &TC)
691 : Tool("visualstudio::Linker", "linker", TC, RF_Full,
692 llvm::sys::WEM_UTF16) {}
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000693
Douglas Katzman95354292015-06-23 20:42:09 +0000694 bool hasIntegratedCPP() const override { return false; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000695 bool isLinkJob() const override { return true; }
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000696
Reid Klecknerbac59a12015-07-15 17:58:55 +0000697 void ConstructJob(Compilation &C, const JobAction &JA,
698 const InputInfo &Output, const InputInfoList &Inputs,
699 const llvm::opt::ArgList &TCArgs,
700 const char *LinkingOutput) const override;
Douglas Katzman95354292015-06-23 20:42:09 +0000701};
Hans Wennborg87cfa712013-09-19 20:32:16 +0000702
Douglas Katzman95354292015-06-23 20:42:09 +0000703class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
704public:
705 Compiler(const ToolChain &TC)
706 : Tool("visualstudio::Compiler", "compiler", TC, RF_Full,
707 llvm::sys::WEM_UTF16) {}
Hans Wennborg87cfa712013-09-19 20:32:16 +0000708
Douglas Katzman95354292015-06-23 20:42:09 +0000709 bool hasIntegratedAssembler() const override { return true; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000710 bool hasIntegratedCPP() const override { return true; }
711 bool isLinkJob() const override { return false; }
Hans Wennborg87cfa712013-09-19 20:32:16 +0000712
Reid Klecknerbac59a12015-07-15 17:58:55 +0000713 void ConstructJob(Compilation &C, const JobAction &JA,
714 const InputInfo &Output, const InputInfoList &Inputs,
715 const llvm::opt::ArgList &TCArgs,
716 const char *LinkingOutput) const override;
Hans Wennborg87cfa712013-09-19 20:32:16 +0000717
Reid Klecknerbac59a12015-07-15 17:58:55 +0000718 std::unique_ptr<Command> GetCommand(Compilation &C, const JobAction &JA,
719 const InputInfo &Output,
720 const InputInfoList &Inputs,
721 const llvm::opt::ArgList &TCArgs,
722 const char *LinkingOutput) const;
723};
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000724} // end namespace visualstudio
725
Yaron Keren1c0070c2015-07-02 04:45:27 +0000726/// MinGW -- Directly call GNU Binutils assembler and linker
727namespace MinGW {
728class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
729public:
730 Assembler(const ToolChain &TC) : Tool("MinGW::Assemble", "assembler", TC) {}
731
732 bool hasIntegratedCPP() const override { return false; }
733
734 void ConstructJob(Compilation &C, const JobAction &JA,
735 const InputInfo &Output, const InputInfoList &Inputs,
736 const llvm::opt::ArgList &TCArgs,
737 const char *LinkingOutput) const override;
738};
739
740class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
741public:
742 Linker(const ToolChain &TC) : Tool("MinGW::Linker", "linker", TC) {}
743
744 bool hasIntegratedCPP() const override { return false; }
745 bool isLinkJob() const override { return true; }
746
747 void ConstructJob(Compilation &C, const JobAction &JA,
748 const InputInfo &Output, const InputInfoList &Inputs,
749 const llvm::opt::ArgList &TCArgs,
750 const char *LinkingOutput) const override;
751
752private:
753 void AddLibGCC(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs) const;
754};
755} // end namespace MinGW
756
Tim Northover9c7e0352013-12-12 11:55:52 +0000757namespace arm {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000758enum class FloatABI {
759 Invalid,
760 Soft,
761 SoftFP,
762 Hard,
763};
764
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000765FloatABI getARMFloatABI(const ToolChain &TC, const llvm::opt::ArgList &Args);
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000766} // end namespace arm
767
Petar Jovanovic88a328f2015-12-14 17:51:50 +0000768namespace ppc {
769enum class FloatABI {
770 Invalid,
771 Soft,
772 Hard,
773};
774
775FloatABI getPPCFloatABI(const Driver &D, const llvm::opt::ArgList &Args);
776} // end namespace ppc
777
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000778namespace XCore {
Douglas Katzman95354292015-06-23 20:42:09 +0000779// For XCore, we do not need to instantiate tools for PreProcess, PreCompile and
780// Compile.
781// We simply use "clang -cc1" for those actions.
782class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000783public:
Douglas Katzman95354292015-06-23 20:42:09 +0000784 Assembler(const ToolChain &TC) : Tool("XCore::Assembler", "XCore-as", TC) {}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000785
786 bool hasIntegratedCPP() const override { return false; }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000787 void ConstructJob(Compilation &C, const JobAction &JA,
788 const InputInfo &Output, const InputInfoList &Inputs,
789 const llvm::opt::ArgList &TCArgs,
790 const char *LinkingOutput) const override;
791};
792
Douglas Katzman95354292015-06-23 20:42:09 +0000793class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000794public:
Douglas Katzman95354292015-06-23 20:42:09 +0000795 Linker(const ToolChain &TC) : Tool("XCore::Linker", "XCore-ld", TC) {}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000796
797 bool hasIntegratedCPP() const override { return false; }
Reid Klecknerbac59a12015-07-15 17:58:55 +0000798 bool isLinkJob() const override { return true; }
799 void ConstructJob(Compilation &C, const JobAction &JA,
800 const InputInfo &Output, const InputInfoList &Inputs,
801 const llvm::opt::ArgList &TCArgs,
802 const char *LinkingOutput) const override;
803};
804} // end namespace XCore.
Douglas Katzman95354292015-06-23 20:42:09 +0000805
Reid Klecknerbac59a12015-07-15 17:58:55 +0000806namespace CrossWindows {
807class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
808public:
809 Assembler(const ToolChain &TC) : Tool("CrossWindows::Assembler", "as", TC) {}
Douglas Katzman95354292015-06-23 20:42:09 +0000810
Reid Klecknerbac59a12015-07-15 17:58:55 +0000811 bool hasIntegratedCPP() const override { return false; }
Douglas Katzman95354292015-06-23 20:42:09 +0000812
Reid Klecknerbac59a12015-07-15 17:58:55 +0000813 void ConstructJob(Compilation &C, const JobAction &JA,
814 const InputInfo &Output, const InputInfoList &Inputs,
815 const llvm::opt::ArgList &TCArgs,
816 const char *LinkingOutput) const override;
817};
Douglas Katzman95354292015-06-23 20:42:09 +0000818
Reid Klecknerbac59a12015-07-15 17:58:55 +0000819class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
820public:
821 Linker(const ToolChain &TC)
822 : Tool("CrossWindows::Linker", "ld", TC, RF_Full) {}
Douglas Katzman95354292015-06-23 20:42:09 +0000823
Reid Klecknerbac59a12015-07-15 17:58:55 +0000824 bool hasIntegratedCPP() const override { return false; }
825 bool isLinkJob() const override { return true; }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +0000826
827 void ConstructJob(Compilation &C, const JobAction &JA,
828 const InputInfo &Output, const InputInfoList &Inputs,
829 const llvm::opt::ArgList &TCArgs,
830 const char *LinkingOutput) const override;
831};
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000832} // end namespace CrossWindows
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000833
Douglas Katzman84a75642015-06-19 14:55:19 +0000834/// SHAVE tools -- Directly call moviCompile and moviAsm
835namespace SHAVE {
Douglas Katzman95354292015-06-23 20:42:09 +0000836class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
Douglas Katzman84a75642015-06-19 14:55:19 +0000837public:
Douglas Katzman95354292015-06-23 20:42:09 +0000838 Compiler(const ToolChain &TC) : Tool("moviCompile", "movicompile", TC) {}
Douglas Katzman84a75642015-06-19 14:55:19 +0000839
840 bool hasIntegratedCPP() const override { return true; }
841
842 void ConstructJob(Compilation &C, const JobAction &JA,
843 const InputInfo &Output, const InputInfoList &Inputs,
844 const llvm::opt::ArgList &TCArgs,
845 const char *LinkingOutput) const override;
846};
847
Douglas Katzman95354292015-06-23 20:42:09 +0000848class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
Douglas Katzman84a75642015-06-19 14:55:19 +0000849public:
Douglas Katzman95354292015-06-23 20:42:09 +0000850 Assembler(const ToolChain &TC) : Tool("moviAsm", "moviAsm", TC) {}
Douglas Katzman84a75642015-06-19 14:55:19 +0000851
852 bool hasIntegratedCPP() const override { return false; } // not sure.
853
854 void ConstructJob(Compilation &C, const JobAction &JA,
855 const InputInfo &Output, const InputInfoList &Inputs,
856 const llvm::opt::ArgList &TCArgs,
857 const char *LinkingOutput) const override;
858};
859} // end namespace SHAVE
860
Douglas Katzmand6e597c2015-09-17 19:56:40 +0000861/// The Myriad toolchain uses tools that are in two different namespaces.
862/// The Compiler and Assembler as defined above are in the SHAVE namespace,
863/// whereas the linker, which accepts code for a mixture of Sparc and SHAVE,
864/// is in the Myriad namespace.
865namespace Myriad {
866class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
867public:
868 Linker(const ToolChain &TC) : GnuTool("shave::Linker", "ld", TC) {}
869 bool hasIntegratedCPP() const override { return false; }
870 bool isLinkJob() const override { return true; }
871 void ConstructJob(Compilation &C, const JobAction &JA,
872 const InputInfo &Output, const InputInfoList &Inputs,
873 const llvm::opt::ArgList &TCArgs,
874 const char *LinkingOutput) const override;
875};
876} // end namespace Myriad
877
Filipe Cabecinhasc888e192015-10-14 12:25:43 +0000878namespace PS4cpu {
879class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
880public:
881 Assemble(const ToolChain &TC)
882 : Tool("PS4cpu::Assemble", "assembler", TC, RF_Full) {}
883
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000884 bool hasIntegratedCPP() const override { return false; }
Filipe Cabecinhasc888e192015-10-14 12:25:43 +0000885
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000886 void ConstructJob(Compilation &C, const JobAction &JA,
887 const InputInfo &Output,
888 const InputInfoList &Inputs,
889 const llvm::opt::ArgList &TCArgs,
890 const char *LinkingOutput) const override;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +0000891};
892
893class LLVM_LIBRARY_VISIBILITY Link : public Tool {
894public:
895 Link(const ToolChain &TC) : Tool("PS4cpu::Link", "linker", TC, RF_Full) {}
896
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000897 bool hasIntegratedCPP() const override { return false; }
898 bool isLinkJob() const override { return true; }
Filipe Cabecinhasc888e192015-10-14 12:25:43 +0000899
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000900 void ConstructJob(Compilation &C, const JobAction &JA,
901 const InputInfo &Output,
902 const InputInfoList &Inputs,
903 const llvm::opt::ArgList &TCArgs,
904 const char *LinkingOutput) const override;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +0000905};
906} // end namespace PS4cpu
907
Justin Lebar21e5d4f2016-01-14 21:41:27 +0000908namespace NVPTX {
909
910// Run ptxas, the NVPTX assembler.
911class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
912 public:
913 Assembler(const ToolChain &TC)
914 : Tool("NVPTX::Assembler", "ptxas", TC, RF_Full, llvm::sys::WEM_UTF8,
915 "--options-file") {}
916
917 bool hasIntegratedCPP() const override { return false; }
918
919 void ConstructJob(Compilation &C, const JobAction &JA,
920 const InputInfo &Output, const InputInfoList &Inputs,
921 const llvm::opt::ArgList &TCArgs,
922 const char *LinkingOutput) const override;
923};
924
925// Runs fatbinary, which combines GPU object files ("cubin" files) and/or PTX
926// assembly into a single output file.
927class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
928 public:
929 Linker(const ToolChain &TC)
930 : Tool("NVPTX::Linker", "fatbinary", TC, RF_Full, llvm::sys::WEM_UTF8,
931 "--options-file") {}
932
933 bool hasIntegratedCPP() const override { return false; }
934
935 void ConstructJob(Compilation &C, const JobAction &JA,
936 const InputInfo &Output, const InputInfoList &Inputs,
937 const llvm::opt::ArgList &TCArgs,
938 const char *LinkingOutput) const override;
939};
940
941} // end namespace NVPTX
942
Douglas Katzman9dc5fbb2015-06-03 16:56:50 +0000943} // end namespace tools
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000944} // end namespace driver
945} // end namespace clang
946
Eugene Zelenkod4304d22015-11-04 21:37:17 +0000947#endif // LLVM_CLANG_LIB_DRIVER_TOOLS_H