xref: /aosp_15_r20/external/clang/lib/Driver/Tools.h (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===--- Tools.h - Tool Implementations -------------------------*- C++ -*-===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li 
10*67e74705SXin Li #ifndef LLVM_CLANG_LIB_DRIVER_TOOLS_H
11*67e74705SXin Li #define LLVM_CLANG_LIB_DRIVER_TOOLS_H
12*67e74705SXin Li 
13*67e74705SXin Li #include "clang/Basic/DebugInfoOptions.h"
14*67e74705SXin Li #include "clang/Basic/VersionTuple.h"
15*67e74705SXin Li #include "clang/Driver/Tool.h"
16*67e74705SXin Li #include "clang/Driver/Types.h"
17*67e74705SXin Li #include "clang/Driver/Util.h"
18*67e74705SXin Li #include "llvm/ADT/Triple.h"
19*67e74705SXin Li #include "llvm/Option/Option.h"
20*67e74705SXin Li #include "llvm/Support/Compiler.h"
21*67e74705SXin Li 
22*67e74705SXin Li namespace clang {
23*67e74705SXin Li class ObjCRuntime;
24*67e74705SXin Li 
25*67e74705SXin Li namespace driver {
26*67e74705SXin Li class Command;
27*67e74705SXin Li class Driver;
28*67e74705SXin Li 
29*67e74705SXin Li namespace toolchains {
30*67e74705SXin Li class MachO;
31*67e74705SXin Li }
32*67e74705SXin Li 
33*67e74705SXin Li namespace tools {
34*67e74705SXin Li 
35*67e74705SXin Li namespace visualstudio {
36*67e74705SXin Li class Compiler;
37*67e74705SXin Li }
38*67e74705SXin Li 
39*67e74705SXin Li using llvm::opt::ArgStringList;
40*67e74705SXin Li 
41*67e74705SXin Li SmallString<128> getCompilerRT(const ToolChain &TC,
42*67e74705SXin Li                                const llvm::opt::ArgList &Args,
43*67e74705SXin Li                                StringRef Component, bool Shared = false);
44*67e74705SXin Li 
45*67e74705SXin Li /// \brief Clang compiler tool.
46*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
47*67e74705SXin Li public:
48*67e74705SXin Li   static const char *getBaseInputName(const llvm::opt::ArgList &Args,
49*67e74705SXin Li                                       const InputInfo &Input);
50*67e74705SXin Li   static const char *getBaseInputStem(const llvm::opt::ArgList &Args,
51*67e74705SXin Li                                       const InputInfoList &Inputs);
52*67e74705SXin Li   static const char *getDependencyFileName(const llvm::opt::ArgList &Args,
53*67e74705SXin Li                                            const InputInfoList &Inputs);
54*67e74705SXin Li 
55*67e74705SXin Li private:
56*67e74705SXin Li   void AddPreprocessingOptions(Compilation &C, const JobAction &JA,
57*67e74705SXin Li                                const Driver &D, const llvm::opt::ArgList &Args,
58*67e74705SXin Li                                llvm::opt::ArgStringList &CmdArgs,
59*67e74705SXin Li                                const InputInfo &Output,
60*67e74705SXin Li                                const InputInfoList &Inputs,
61*67e74705SXin Li                                const ToolChain *AuxToolChain) const;
62*67e74705SXin Li 
63*67e74705SXin Li   void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
64*67e74705SXin Li                             llvm::opt::ArgStringList &CmdArgs) const;
65*67e74705SXin Li   void AddARMTargetArgs(const llvm::Triple &Triple,
66*67e74705SXin Li                         const llvm::opt::ArgList &Args,
67*67e74705SXin Li                         llvm::opt::ArgStringList &CmdArgs,
68*67e74705SXin Li                         bool KernelOrKext) const;
69*67e74705SXin Li   void AddARM64TargetArgs(const llvm::opt::ArgList &Args,
70*67e74705SXin Li                           llvm::opt::ArgStringList &CmdArgs) const;
71*67e74705SXin Li   void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
72*67e74705SXin Li                          llvm::opt::ArgStringList &CmdArgs) const;
73*67e74705SXin Li   void AddPPCTargetArgs(const llvm::opt::ArgList &Args,
74*67e74705SXin Li                         llvm::opt::ArgStringList &CmdArgs) const;
75*67e74705SXin Li   void AddR600TargetArgs(const llvm::opt::ArgList &Args,
76*67e74705SXin Li                          llvm::opt::ArgStringList &CmdArgs) const;
77*67e74705SXin Li   void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
78*67e74705SXin Li                           llvm::opt::ArgStringList &CmdArgs) const;
79*67e74705SXin Li   void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
80*67e74705SXin Li                             llvm::opt::ArgStringList &CmdArgs) const;
81*67e74705SXin Li   void AddX86TargetArgs(const llvm::opt::ArgList &Args,
82*67e74705SXin Li                         llvm::opt::ArgStringList &CmdArgs) const;
83*67e74705SXin Li   void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
84*67e74705SXin Li                             llvm::opt::ArgStringList &CmdArgs) const;
85*67e74705SXin Li   void AddLanaiTargetArgs(const llvm::opt::ArgList &Args,
86*67e74705SXin Li                           llvm::opt::ArgStringList &CmdArgs) const;
87*67e74705SXin Li   void AddWebAssemblyTargetArgs(const llvm::opt::ArgList &Args,
88*67e74705SXin Li                                 llvm::opt::ArgStringList &CmdArgs) const;
89*67e74705SXin Li 
90*67e74705SXin Li   enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
91*67e74705SXin Li 
92*67e74705SXin Li   ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
93*67e74705SXin Li                                  llvm::opt::ArgStringList &cmdArgs,
94*67e74705SXin Li                                  RewriteKind rewrite) const;
95*67e74705SXin Li 
96*67e74705SXin Li   void AddClangCLArgs(const llvm::opt::ArgList &Args, types::ID InputType,
97*67e74705SXin Li                       llvm::opt::ArgStringList &CmdArgs,
98*67e74705SXin Li                       codegenoptions::DebugInfoKind *DebugInfoKind,
99*67e74705SXin Li                       bool *EmitCodeView) const;
100*67e74705SXin Li 
101*67e74705SXin Li   visualstudio::Compiler *getCLFallback() const;
102*67e74705SXin Li 
103*67e74705SXin Li   mutable std::unique_ptr<visualstudio::Compiler> CLFallback;
104*67e74705SXin Li 
105*67e74705SXin Li public:
106*67e74705SXin Li   // CAUTION! The first constructor argument ("clang") is not arbitrary,
107*67e74705SXin Li   // as it is for other tools. Some operations on a Tool actually test
108*67e74705SXin Li   // whether that tool is Clang based on the Tool's Name as a string.
Clang(const ToolChain & TC)109*67e74705SXin Li   Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC, RF_Full) {}
110*67e74705SXin Li 
hasGoodDiagnostics()111*67e74705SXin Li   bool hasGoodDiagnostics() const override { return true; }
hasIntegratedAssembler()112*67e74705SXin Li   bool hasIntegratedAssembler() const override { return true; }
hasIntegratedCPP()113*67e74705SXin Li   bool hasIntegratedCPP() const override { return true; }
canEmitIR()114*67e74705SXin Li   bool canEmitIR() const override { return true; }
115*67e74705SXin Li 
116*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
117*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
118*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
119*67e74705SXin Li                     const char *LinkingOutput) const override;
120*67e74705SXin Li };
121*67e74705SXin Li 
122*67e74705SXin Li /// \brief Clang integrated assembler tool.
123*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
124*67e74705SXin Li public:
ClangAs(const ToolChain & TC)125*67e74705SXin Li   ClangAs(const ToolChain &TC)
126*67e74705SXin Li       : Tool("clang::as", "clang integrated assembler", TC, RF_Full) {}
127*67e74705SXin Li   void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
128*67e74705SXin Li                          llvm::opt::ArgStringList &CmdArgs) const;
hasGoodDiagnostics()129*67e74705SXin Li   bool hasGoodDiagnostics() const override { return true; }
hasIntegratedAssembler()130*67e74705SXin Li   bool hasIntegratedAssembler() const override { return false; }
hasIntegratedCPP()131*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
132*67e74705SXin Li 
133*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
134*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
135*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
136*67e74705SXin Li                     const char *LinkingOutput) const override;
137*67e74705SXin Li };
138*67e74705SXin Li 
139*67e74705SXin Li /// \brief Base class for all GNU tools that provide the same behavior when
140*67e74705SXin Li /// it comes to response files support
141*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY GnuTool : public Tool {
142*67e74705SXin Li   virtual void anchor();
143*67e74705SXin Li 
144*67e74705SXin Li public:
GnuTool(const char * Name,const char * ShortName,const ToolChain & TC)145*67e74705SXin Li   GnuTool(const char *Name, const char *ShortName, const ToolChain &TC)
146*67e74705SXin Li       : Tool(Name, ShortName, TC, RF_Full, llvm::sys::WEM_CurrentCodePage) {}
147*67e74705SXin Li };
148*67e74705SXin Li 
149*67e74705SXin Li /// gcc - Generic GCC tool implementations.
150*67e74705SXin Li namespace gcc {
151*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Common : public GnuTool {
152*67e74705SXin Li public:
Common(const char * Name,const char * ShortName,const ToolChain & TC)153*67e74705SXin Li   Common(const char *Name, const char *ShortName, const ToolChain &TC)
154*67e74705SXin Li       : GnuTool(Name, ShortName, TC) {}
155*67e74705SXin Li 
156*67e74705SXin Li   // A gcc tool has an "integrated" assembler that it will call to produce an
157*67e74705SXin Li   // object. Let it use that assembler so that we don't have to deal with
158*67e74705SXin Li   // assembly syntax incompatibilities.
hasIntegratedAssembler()159*67e74705SXin Li   bool hasIntegratedAssembler() const override { return true; }
160*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
161*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
162*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
163*67e74705SXin Li                     const char *LinkingOutput) const override;
164*67e74705SXin Li 
165*67e74705SXin Li   /// RenderExtraToolArgs - Render any arguments necessary to force
166*67e74705SXin Li   /// the particular tool mode.
167*67e74705SXin Li   virtual void RenderExtraToolArgs(const JobAction &JA,
168*67e74705SXin Li                                    llvm::opt::ArgStringList &CmdArgs) const = 0;
169*67e74705SXin Li };
170*67e74705SXin Li 
171*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Preprocessor : public Common {
172*67e74705SXin Li public:
Preprocessor(const ToolChain & TC)173*67e74705SXin Li   Preprocessor(const ToolChain &TC)
174*67e74705SXin Li       : Common("gcc::Preprocessor", "gcc preprocessor", TC) {}
175*67e74705SXin Li 
hasGoodDiagnostics()176*67e74705SXin Li   bool hasGoodDiagnostics() const override { return true; }
hasIntegratedCPP()177*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
178*67e74705SXin Li 
179*67e74705SXin Li   void RenderExtraToolArgs(const JobAction &JA,
180*67e74705SXin Li                            llvm::opt::ArgStringList &CmdArgs) const override;
181*67e74705SXin Li };
182*67e74705SXin Li 
183*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Compiler : public Common {
184*67e74705SXin Li public:
Compiler(const ToolChain & TC)185*67e74705SXin Li   Compiler(const ToolChain &TC) : Common("gcc::Compiler", "gcc frontend", TC) {}
186*67e74705SXin Li 
hasGoodDiagnostics()187*67e74705SXin Li   bool hasGoodDiagnostics() const override { return true; }
hasIntegratedCPP()188*67e74705SXin Li   bool hasIntegratedCPP() const override { return true; }
189*67e74705SXin Li 
190*67e74705SXin Li   void RenderExtraToolArgs(const JobAction &JA,
191*67e74705SXin Li                            llvm::opt::ArgStringList &CmdArgs) const override;
192*67e74705SXin Li };
193*67e74705SXin Li 
194*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public Common {
195*67e74705SXin Li public:
Linker(const ToolChain & TC)196*67e74705SXin Li   Linker(const ToolChain &TC) : Common("gcc::Linker", "linker (via gcc)", TC) {}
197*67e74705SXin Li 
hasIntegratedCPP()198*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
isLinkJob()199*67e74705SXin Li   bool isLinkJob() const override { return true; }
200*67e74705SXin Li 
201*67e74705SXin Li   void RenderExtraToolArgs(const JobAction &JA,
202*67e74705SXin Li                            llvm::opt::ArgStringList &CmdArgs) const override;
203*67e74705SXin Li };
204*67e74705SXin Li } // end namespace gcc
205*67e74705SXin Li 
206*67e74705SXin Li namespace hexagon {
207*67e74705SXin Li // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile
208*67e74705SXin Li // and Compile.
209*67e74705SXin Li // We simply use "clang -cc1" for those actions.
210*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
211*67e74705SXin Li public:
Assembler(const ToolChain & TC)212*67e74705SXin Li   Assembler(const ToolChain &TC)
213*67e74705SXin Li       : GnuTool("hexagon::Assembler", "hexagon-as", TC) {}
214*67e74705SXin Li 
hasIntegratedCPP()215*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
216*67e74705SXin Li 
217*67e74705SXin Li   void RenderExtraToolArgs(const JobAction &JA,
218*67e74705SXin Li                            llvm::opt::ArgStringList &CmdArgs) const;
219*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
220*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
221*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
222*67e74705SXin Li                     const char *LinkingOutput) const override;
223*67e74705SXin Li };
224*67e74705SXin Li 
225*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
226*67e74705SXin Li public:
Linker(const ToolChain & TC)227*67e74705SXin Li   Linker(const ToolChain &TC) : GnuTool("hexagon::Linker", "hexagon-ld", TC) {}
228*67e74705SXin Li 
hasIntegratedCPP()229*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
isLinkJob()230*67e74705SXin Li   bool isLinkJob() const override { return true; }
231*67e74705SXin Li 
232*67e74705SXin Li   virtual void RenderExtraToolArgs(const JobAction &JA,
233*67e74705SXin Li                                    llvm::opt::ArgStringList &CmdArgs) const;
234*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
235*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
236*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
237*67e74705SXin Li                     const char *LinkingOutput) const override;
238*67e74705SXin Li };
239*67e74705SXin Li } // end namespace hexagon.
240*67e74705SXin Li 
241*67e74705SXin Li namespace amdgpu {
242*67e74705SXin Li 
243*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
244*67e74705SXin Li public:
Linker(const ToolChain & TC)245*67e74705SXin Li   Linker(const ToolChain &TC) : GnuTool("amdgpu::Linker", "ld.lld", TC) {}
isLinkJob()246*67e74705SXin Li   bool isLinkJob() const override { return true; }
hasIntegratedCPP()247*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
248*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
249*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
250*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
251*67e74705SXin Li                     const char *LinkingOutput) const override;
252*67e74705SXin Li };
253*67e74705SXin Li 
254*67e74705SXin Li } // end namespace amdgpu
255*67e74705SXin Li 
256*67e74705SXin Li namespace wasm {
257*67e74705SXin Li 
258*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
259*67e74705SXin Li public:
260*67e74705SXin Li   explicit Linker(const ToolChain &TC);
261*67e74705SXin Li   bool isLinkJob() const override;
262*67e74705SXin Li   bool hasIntegratedCPP() const override;
263*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
264*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
265*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
266*67e74705SXin Li                     const char *LinkingOutput) const override;
267*67e74705SXin Li };
268*67e74705SXin Li 
269*67e74705SXin Li } // end namespace wasm
270*67e74705SXin Li 
271*67e74705SXin Li namespace arm {
272*67e74705SXin Li std::string getARMTargetCPU(StringRef CPU, StringRef Arch,
273*67e74705SXin Li                             const llvm::Triple &Triple);
274*67e74705SXin Li const std::string getARMArch(StringRef Arch,
275*67e74705SXin Li                              const llvm::Triple &Triple);
276*67e74705SXin Li StringRef getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple);
277*67e74705SXin Li StringRef getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
278*67e74705SXin Li                                   const llvm::Triple &Triple);
279*67e74705SXin Li 
280*67e74705SXin Li void appendEBLinkFlags(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs,
281*67e74705SXin Li                        const llvm::Triple &Triple);
282*67e74705SXin Li } // end namespace arm
283*67e74705SXin Li 
284*67e74705SXin Li namespace mips {
285*67e74705SXin Li typedef enum { NanLegacy = 1, Nan2008 = 2 } NanEncoding;
286*67e74705SXin Li 
287*67e74705SXin Li enum class FloatABI {
288*67e74705SXin Li   Invalid,
289*67e74705SXin Li   Soft,
290*67e74705SXin Li   Hard,
291*67e74705SXin Li };
292*67e74705SXin Li 
293*67e74705SXin Li NanEncoding getSupportedNanEncoding(StringRef &CPU);
294*67e74705SXin Li bool hasCompactBranches(StringRef &CPU);
295*67e74705SXin Li void getMipsCPUAndABI(const llvm::opt::ArgList &Args,
296*67e74705SXin Li                       const llvm::Triple &Triple, StringRef &CPUName,
297*67e74705SXin Li                       StringRef &ABIName);
298*67e74705SXin Li std::string getMipsABILibSuffix(const llvm::opt::ArgList &Args,
299*67e74705SXin Li                                 const llvm::Triple &Triple);
300*67e74705SXin Li bool hasMipsAbiArg(const llvm::opt::ArgList &Args, const char *Value);
301*67e74705SXin Li bool isUCLibc(const llvm::opt::ArgList &Args);
302*67e74705SXin Li bool isNaN2008(const llvm::opt::ArgList &Args, const llvm::Triple &Triple);
303*67e74705SXin Li bool isFP64ADefault(const llvm::Triple &Triple, StringRef CPUName);
304*67e74705SXin Li bool isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
305*67e74705SXin Li                    StringRef ABIName, mips::FloatABI FloatABI);
306*67e74705SXin Li bool shouldUseFPXX(const llvm::opt::ArgList &Args, const llvm::Triple &Triple,
307*67e74705SXin Li                    StringRef CPUName, StringRef ABIName,
308*67e74705SXin Li                    mips::FloatABI FloatABI);
309*67e74705SXin Li } // end namespace mips
310*67e74705SXin Li 
311*67e74705SXin Li namespace ppc {
312*67e74705SXin Li bool hasPPCAbiArg(const llvm::opt::ArgList &Args, const char *Value);
313*67e74705SXin Li } // end namespace ppc
314*67e74705SXin Li 
315*67e74705SXin Li /// cloudabi -- Directly call GNU Binutils linker
316*67e74705SXin Li namespace cloudabi {
317*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
318*67e74705SXin Li public:
Linker(const ToolChain & TC)319*67e74705SXin Li   Linker(const ToolChain &TC) : GnuTool("cloudabi::Linker", "linker", TC) {}
320*67e74705SXin Li 
hasIntegratedCPP()321*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
isLinkJob()322*67e74705SXin Li   bool isLinkJob() const override { return true; }
323*67e74705SXin Li 
324*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
325*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
326*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
327*67e74705SXin Li                     const char *LinkingOutput) const override;
328*67e74705SXin Li };
329*67e74705SXin Li } // end namespace cloudabi
330*67e74705SXin Li 
331*67e74705SXin Li namespace darwin {
332*67e74705SXin Li llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
333*67e74705SXin Li void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
334*67e74705SXin Li 
335*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
336*67e74705SXin Li   virtual void anchor();
337*67e74705SXin Li 
338*67e74705SXin Li protected:
339*67e74705SXin Li   void AddMachOArch(const llvm::opt::ArgList &Args,
340*67e74705SXin Li                     llvm::opt::ArgStringList &CmdArgs) const;
341*67e74705SXin Li 
getMachOToolChain()342*67e74705SXin Li   const toolchains::MachO &getMachOToolChain() const {
343*67e74705SXin Li     return reinterpret_cast<const toolchains::MachO &>(getToolChain());
344*67e74705SXin Li   }
345*67e74705SXin Li 
346*67e74705SXin Li public:
347*67e74705SXin Li   MachOTool(
348*67e74705SXin Li       const char *Name, const char *ShortName, const ToolChain &TC,
349*67e74705SXin Li       ResponseFileSupport ResponseSupport = RF_None,
350*67e74705SXin Li       llvm::sys::WindowsEncodingMethod ResponseEncoding = llvm::sys::WEM_UTF8,
351*67e74705SXin Li       const char *ResponseFlag = "@")
Tool(Name,ShortName,TC,ResponseSupport,ResponseEncoding,ResponseFlag)352*67e74705SXin Li       : Tool(Name, ShortName, TC, ResponseSupport, ResponseEncoding,
353*67e74705SXin Li              ResponseFlag) {}
354*67e74705SXin Li };
355*67e74705SXin Li 
356*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public MachOTool {
357*67e74705SXin Li public:
Assembler(const ToolChain & TC)358*67e74705SXin Li   Assembler(const ToolChain &TC)
359*67e74705SXin Li       : MachOTool("darwin::Assembler", "assembler", TC) {}
360*67e74705SXin Li 
hasIntegratedCPP()361*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
362*67e74705SXin Li 
363*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
364*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
365*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
366*67e74705SXin Li                     const char *LinkingOutput) const override;
367*67e74705SXin Li };
368*67e74705SXin Li 
369*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public MachOTool {
370*67e74705SXin Li   bool NeedsTempPath(const InputInfoList &Inputs) const;
371*67e74705SXin Li   void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
372*67e74705SXin Li                    llvm::opt::ArgStringList &CmdArgs,
373*67e74705SXin Li                    const InputInfoList &Inputs) const;
374*67e74705SXin Li 
375*67e74705SXin Li public:
Linker(const ToolChain & TC)376*67e74705SXin Li   Linker(const ToolChain &TC)
377*67e74705SXin Li       : MachOTool("darwin::Linker", "linker", TC, RF_FileList,
378*67e74705SXin Li                   llvm::sys::WEM_UTF8, "-filelist") {}
379*67e74705SXin Li 
hasIntegratedCPP()380*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
isLinkJob()381*67e74705SXin Li   bool isLinkJob() const override { return true; }
382*67e74705SXin Li 
383*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
384*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
385*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
386*67e74705SXin Li                     const char *LinkingOutput) const override;
387*67e74705SXin Li };
388*67e74705SXin Li 
389*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool {
390*67e74705SXin Li public:
Lipo(const ToolChain & TC)391*67e74705SXin Li   Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {}
392*67e74705SXin Li 
hasIntegratedCPP()393*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
394*67e74705SXin Li 
395*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
396*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
397*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
398*67e74705SXin Li                     const char *LinkingOutput) const override;
399*67e74705SXin Li };
400*67e74705SXin Li 
401*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool {
402*67e74705SXin Li public:
Dsymutil(const ToolChain & TC)403*67e74705SXin Li   Dsymutil(const ToolChain &TC)
404*67e74705SXin Li       : MachOTool("darwin::Dsymutil", "dsymutil", TC) {}
405*67e74705SXin Li 
hasIntegratedCPP()406*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
isDsymutilJob()407*67e74705SXin Li   bool isDsymutilJob() const override { return true; }
408*67e74705SXin Li 
409*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
410*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
411*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
412*67e74705SXin Li                     const char *LinkingOutput) const override;
413*67e74705SXin Li };
414*67e74705SXin Li 
415*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool {
416*67e74705SXin Li public:
VerifyDebug(const ToolChain & TC)417*67e74705SXin Li   VerifyDebug(const ToolChain &TC)
418*67e74705SXin Li       : MachOTool("darwin::VerifyDebug", "dwarfdump", TC) {}
419*67e74705SXin Li 
hasIntegratedCPP()420*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
421*67e74705SXin Li 
422*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
423*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
424*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
425*67e74705SXin Li                     const char *LinkingOutput) const override;
426*67e74705SXin Li };
427*67e74705SXin Li } // end namespace darwin
428*67e74705SXin Li 
429*67e74705SXin Li /// openbsd -- Directly call GNU Binutils assembler and linker
430*67e74705SXin Li namespace openbsd {
431*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
432*67e74705SXin Li public:
Assembler(const ToolChain & TC)433*67e74705SXin Li   Assembler(const ToolChain &TC)
434*67e74705SXin Li       : GnuTool("openbsd::Assembler", "assembler", TC) {}
435*67e74705SXin Li 
hasIntegratedCPP()436*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
437*67e74705SXin Li 
438*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
439*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
440*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
441*67e74705SXin Li                     const char *LinkingOutput) const override;
442*67e74705SXin Li };
443*67e74705SXin Li 
444*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
445*67e74705SXin Li public:
Linker(const ToolChain & TC)446*67e74705SXin Li   Linker(const ToolChain &TC) : GnuTool("openbsd::Linker", "linker", TC) {}
447*67e74705SXin Li 
hasIntegratedCPP()448*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
isLinkJob()449*67e74705SXin Li   bool isLinkJob() const override { return true; }
450*67e74705SXin Li 
451*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
452*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
453*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
454*67e74705SXin Li                     const char *LinkingOutput) const override;
455*67e74705SXin Li };
456*67e74705SXin Li } // end namespace openbsd
457*67e74705SXin Li 
458*67e74705SXin Li /// bitrig -- Directly call GNU Binutils assembler and linker
459*67e74705SXin Li namespace bitrig {
460*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
461*67e74705SXin Li public:
Assembler(const ToolChain & TC)462*67e74705SXin Li   Assembler(const ToolChain &TC)
463*67e74705SXin Li       : GnuTool("bitrig::Assembler", "assembler", TC) {}
464*67e74705SXin Li 
hasIntegratedCPP()465*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
466*67e74705SXin Li 
467*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
468*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
469*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
470*67e74705SXin Li                     const char *LinkingOutput) const override;
471*67e74705SXin Li };
472*67e74705SXin Li 
473*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
474*67e74705SXin Li public:
Linker(const ToolChain & TC)475*67e74705SXin Li   Linker(const ToolChain &TC) : GnuTool("bitrig::Linker", "linker", TC) {}
476*67e74705SXin Li 
hasIntegratedCPP()477*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
isLinkJob()478*67e74705SXin Li   bool isLinkJob() const override { return true; }
479*67e74705SXin Li 
480*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
481*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
482*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
483*67e74705SXin Li                     const char *LinkingOutput) const override;
484*67e74705SXin Li };
485*67e74705SXin Li } // end namespace bitrig
486*67e74705SXin Li 
487*67e74705SXin Li /// freebsd -- Directly call GNU Binutils assembler and linker
488*67e74705SXin Li namespace freebsd {
489*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
490*67e74705SXin Li public:
Assembler(const ToolChain & TC)491*67e74705SXin Li   Assembler(const ToolChain &TC)
492*67e74705SXin Li       : GnuTool("freebsd::Assembler", "assembler", TC) {}
493*67e74705SXin Li 
hasIntegratedCPP()494*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
495*67e74705SXin Li 
496*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
497*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
498*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
499*67e74705SXin Li                     const char *LinkingOutput) const override;
500*67e74705SXin Li };
501*67e74705SXin Li 
502*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
503*67e74705SXin Li public:
Linker(const ToolChain & TC)504*67e74705SXin Li   Linker(const ToolChain &TC) : GnuTool("freebsd::Linker", "linker", TC) {}
505*67e74705SXin Li 
hasIntegratedCPP()506*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
isLinkJob()507*67e74705SXin Li   bool isLinkJob() const override { return true; }
508*67e74705SXin Li 
509*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
510*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
511*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
512*67e74705SXin Li                     const char *LinkingOutput) const override;
513*67e74705SXin Li };
514*67e74705SXin Li } // end namespace freebsd
515*67e74705SXin Li 
516*67e74705SXin Li /// netbsd -- Directly call GNU Binutils assembler and linker
517*67e74705SXin Li namespace netbsd {
518*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
519*67e74705SXin Li public:
Assembler(const ToolChain & TC)520*67e74705SXin Li   Assembler(const ToolChain &TC)
521*67e74705SXin Li       : GnuTool("netbsd::Assembler", "assembler", TC) {}
522*67e74705SXin Li 
hasIntegratedCPP()523*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
524*67e74705SXin Li 
525*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
526*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
527*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
528*67e74705SXin Li                     const char *LinkingOutput) const override;
529*67e74705SXin Li };
530*67e74705SXin Li 
531*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
532*67e74705SXin Li public:
Linker(const ToolChain & TC)533*67e74705SXin Li   Linker(const ToolChain &TC) : GnuTool("netbsd::Linker", "linker", TC) {}
534*67e74705SXin Li 
hasIntegratedCPP()535*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
isLinkJob()536*67e74705SXin Li   bool isLinkJob() const override { return true; }
537*67e74705SXin Li 
538*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
539*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
540*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
541*67e74705SXin Li                     const char *LinkingOutput) const override;
542*67e74705SXin Li };
543*67e74705SXin Li } // end namespace netbsd
544*67e74705SXin Li 
545*67e74705SXin Li /// Directly call GNU Binutils' assembler and linker.
546*67e74705SXin Li namespace gnutools {
547*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
548*67e74705SXin Li public:
Assembler(const ToolChain & TC)549*67e74705SXin Li   Assembler(const ToolChain &TC) : GnuTool("GNU::Assembler", "assembler", TC) {}
550*67e74705SXin Li 
hasIntegratedCPP()551*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
552*67e74705SXin Li 
553*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
554*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
555*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
556*67e74705SXin Li                     const char *LinkingOutput) const override;
557*67e74705SXin Li };
558*67e74705SXin Li 
559*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
560*67e74705SXin Li public:
Linker(const ToolChain & TC)561*67e74705SXin Li   Linker(const ToolChain &TC) : GnuTool("GNU::Linker", "linker", TC) {}
562*67e74705SXin Li 
hasIntegratedCPP()563*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
isLinkJob()564*67e74705SXin Li   bool isLinkJob() const override { return true; }
565*67e74705SXin Li 
566*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
567*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
568*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
569*67e74705SXin Li                     const char *LinkingOutput) const override;
570*67e74705SXin Li };
571*67e74705SXin Li } // end namespace gnutools
572*67e74705SXin Li 
573*67e74705SXin Li namespace nacltools {
574*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY AssemblerARM : public gnutools::Assembler {
575*67e74705SXin Li public:
AssemblerARM(const ToolChain & TC)576*67e74705SXin Li   AssemblerARM(const ToolChain &TC) : gnutools::Assembler(TC) {}
577*67e74705SXin Li 
578*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
579*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
580*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
581*67e74705SXin Li                     const char *LinkingOutput) const override;
582*67e74705SXin Li };
583*67e74705SXin Li 
584*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
585*67e74705SXin Li public:
Linker(const ToolChain & TC)586*67e74705SXin Li   Linker(const ToolChain &TC) : GnuTool("NaCl::Linker", "linker", TC) {}
587*67e74705SXin Li 
hasIntegratedCPP()588*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
isLinkJob()589*67e74705SXin Li   bool isLinkJob() const override { return true; }
590*67e74705SXin Li 
591*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
592*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
593*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
594*67e74705SXin Li                     const char *LinkingOutput) const override;
595*67e74705SXin Li };
596*67e74705SXin Li } // end namespace nacltools
597*67e74705SXin Li 
598*67e74705SXin Li /// minix -- Directly call GNU Binutils assembler and linker
599*67e74705SXin Li namespace minix {
600*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
601*67e74705SXin Li public:
Assembler(const ToolChain & TC)602*67e74705SXin Li   Assembler(const ToolChain &TC)
603*67e74705SXin Li       : GnuTool("minix::Assembler", "assembler", TC) {}
604*67e74705SXin Li 
hasIntegratedCPP()605*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
606*67e74705SXin Li 
607*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
608*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
609*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
610*67e74705SXin Li                     const char *LinkingOutput) const override;
611*67e74705SXin Li };
612*67e74705SXin Li 
613*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
614*67e74705SXin Li public:
Linker(const ToolChain & TC)615*67e74705SXin Li   Linker(const ToolChain &TC) : GnuTool("minix::Linker", "linker", TC) {}
616*67e74705SXin Li 
hasIntegratedCPP()617*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
isLinkJob()618*67e74705SXin Li   bool isLinkJob() const override { return true; }
619*67e74705SXin Li 
620*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
621*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
622*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
623*67e74705SXin Li                     const char *LinkingOutput) const override;
624*67e74705SXin Li };
625*67e74705SXin Li } // end namespace minix
626*67e74705SXin Li 
627*67e74705SXin Li /// solaris -- Directly call Solaris assembler and linker
628*67e74705SXin Li namespace solaris {
629*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
630*67e74705SXin Li public:
Assembler(const ToolChain & TC)631*67e74705SXin Li   Assembler(const ToolChain &TC)
632*67e74705SXin Li       : Tool("solaris::Assembler", "assembler", TC) {}
633*67e74705SXin Li 
hasIntegratedCPP()634*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
635*67e74705SXin Li 
636*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
637*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
638*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
639*67e74705SXin Li                     const char *LinkingOutput) const override;
640*67e74705SXin Li };
641*67e74705SXin Li 
642*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
643*67e74705SXin Li public:
Linker(const ToolChain & TC)644*67e74705SXin Li   Linker(const ToolChain &TC) : Tool("solaris::Linker", "linker", TC) {}
645*67e74705SXin Li 
hasIntegratedCPP()646*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
isLinkJob()647*67e74705SXin Li   bool isLinkJob() const override { return true; }
648*67e74705SXin Li 
649*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
650*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
651*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
652*67e74705SXin Li                     const char *LinkingOutput) const override;
653*67e74705SXin Li };
654*67e74705SXin Li } // end namespace solaris
655*67e74705SXin Li 
656*67e74705SXin Li /// dragonfly -- Directly call GNU Binutils assembler and linker
657*67e74705SXin Li namespace dragonfly {
658*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
659*67e74705SXin Li public:
Assembler(const ToolChain & TC)660*67e74705SXin Li   Assembler(const ToolChain &TC)
661*67e74705SXin Li       : GnuTool("dragonfly::Assembler", "assembler", TC) {}
662*67e74705SXin Li 
hasIntegratedCPP()663*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
664*67e74705SXin Li 
665*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
666*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
667*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
668*67e74705SXin Li                     const char *LinkingOutput) const override;
669*67e74705SXin Li };
670*67e74705SXin Li 
671*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
672*67e74705SXin Li public:
Linker(const ToolChain & TC)673*67e74705SXin Li   Linker(const ToolChain &TC) : GnuTool("dragonfly::Linker", "linker", TC) {}
674*67e74705SXin Li 
hasIntegratedCPP()675*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
isLinkJob()676*67e74705SXin Li   bool isLinkJob() const override { return true; }
677*67e74705SXin Li 
678*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
679*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
680*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
681*67e74705SXin Li                     const char *LinkingOutput) const override;
682*67e74705SXin Li };
683*67e74705SXin Li } // end namespace dragonfly
684*67e74705SXin Li 
685*67e74705SXin Li /// Visual studio tools.
686*67e74705SXin Li namespace visualstudio {
687*67e74705SXin Li VersionTuple getMSVCVersion(const Driver *D, const ToolChain &TC,
688*67e74705SXin Li                             const llvm::Triple &Triple,
689*67e74705SXin Li                             const llvm::opt::ArgList &Args, bool IsWindowsMSVC);
690*67e74705SXin Li 
691*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
692*67e74705SXin Li public:
Linker(const ToolChain & TC)693*67e74705SXin Li   Linker(const ToolChain &TC)
694*67e74705SXin Li       : Tool("visualstudio::Linker", "linker", TC, RF_Full,
695*67e74705SXin Li              llvm::sys::WEM_UTF16) {}
696*67e74705SXin Li 
hasIntegratedCPP()697*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
isLinkJob()698*67e74705SXin Li   bool isLinkJob() const override { return true; }
699*67e74705SXin Li 
700*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
701*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
702*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
703*67e74705SXin Li                     const char *LinkingOutput) const override;
704*67e74705SXin Li };
705*67e74705SXin Li 
706*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
707*67e74705SXin Li public:
Compiler(const ToolChain & TC)708*67e74705SXin Li   Compiler(const ToolChain &TC)
709*67e74705SXin Li       : Tool("visualstudio::Compiler", "compiler", TC, RF_Full,
710*67e74705SXin Li              llvm::sys::WEM_UTF16) {}
711*67e74705SXin Li 
hasIntegratedAssembler()712*67e74705SXin Li   bool hasIntegratedAssembler() const override { return true; }
hasIntegratedCPP()713*67e74705SXin Li   bool hasIntegratedCPP() const override { return true; }
isLinkJob()714*67e74705SXin Li   bool isLinkJob() const override { return false; }
715*67e74705SXin Li 
716*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
717*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
718*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
719*67e74705SXin Li                     const char *LinkingOutput) const override;
720*67e74705SXin Li 
721*67e74705SXin Li   std::unique_ptr<Command> GetCommand(Compilation &C, const JobAction &JA,
722*67e74705SXin Li                                       const InputInfo &Output,
723*67e74705SXin Li                                       const InputInfoList &Inputs,
724*67e74705SXin Li                                       const llvm::opt::ArgList &TCArgs,
725*67e74705SXin Li                                       const char *LinkingOutput) const;
726*67e74705SXin Li };
727*67e74705SXin Li } // end namespace visualstudio
728*67e74705SXin Li 
729*67e74705SXin Li /// MinGW -- Directly call GNU Binutils assembler and linker
730*67e74705SXin Li namespace MinGW {
731*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
732*67e74705SXin Li public:
Assembler(const ToolChain & TC)733*67e74705SXin Li   Assembler(const ToolChain &TC) : Tool("MinGW::Assemble", "assembler", TC) {}
734*67e74705SXin Li 
hasIntegratedCPP()735*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
736*67e74705SXin Li 
737*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
738*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
739*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
740*67e74705SXin Li                     const char *LinkingOutput) const override;
741*67e74705SXin Li };
742*67e74705SXin Li 
743*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
744*67e74705SXin Li public:
Linker(const ToolChain & TC)745*67e74705SXin Li   Linker(const ToolChain &TC) : Tool("MinGW::Linker", "linker", TC) {}
746*67e74705SXin Li 
hasIntegratedCPP()747*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
isLinkJob()748*67e74705SXin Li   bool isLinkJob() const override { return true; }
749*67e74705SXin Li 
750*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
751*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
752*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
753*67e74705SXin Li                     const char *LinkingOutput) const override;
754*67e74705SXin Li 
755*67e74705SXin Li private:
756*67e74705SXin Li   void AddLibGCC(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs) const;
757*67e74705SXin Li };
758*67e74705SXin Li } // end namespace MinGW
759*67e74705SXin Li 
760*67e74705SXin Li namespace arm {
761*67e74705SXin Li enum class FloatABI {
762*67e74705SXin Li   Invalid,
763*67e74705SXin Li   Soft,
764*67e74705SXin Li   SoftFP,
765*67e74705SXin Li   Hard,
766*67e74705SXin Li };
767*67e74705SXin Li 
768*67e74705SXin Li FloatABI getARMFloatABI(const ToolChain &TC, const llvm::opt::ArgList &Args);
769*67e74705SXin Li } // end namespace arm
770*67e74705SXin Li 
771*67e74705SXin Li namespace ppc {
772*67e74705SXin Li enum class FloatABI {
773*67e74705SXin Li   Invalid,
774*67e74705SXin Li   Soft,
775*67e74705SXin Li   Hard,
776*67e74705SXin Li };
777*67e74705SXin Li 
778*67e74705SXin Li FloatABI getPPCFloatABI(const Driver &D, const llvm::opt::ArgList &Args);
779*67e74705SXin Li } // end namespace ppc
780*67e74705SXin Li 
781*67e74705SXin Li namespace sparc {
782*67e74705SXin Li enum class FloatABI {
783*67e74705SXin Li   Invalid,
784*67e74705SXin Li   Soft,
785*67e74705SXin Li   Hard,
786*67e74705SXin Li };
787*67e74705SXin Li 
788*67e74705SXin Li FloatABI getSparcFloatABI(const Driver &D, const llvm::opt::ArgList &Args);
789*67e74705SXin Li } // end namespace sparc
790*67e74705SXin Li 
791*67e74705SXin Li namespace XCore {
792*67e74705SXin Li // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and
793*67e74705SXin Li // Compile.
794*67e74705SXin Li // We simply use "clang -cc1" for those actions.
795*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
796*67e74705SXin Li public:
Assembler(const ToolChain & TC)797*67e74705SXin Li   Assembler(const ToolChain &TC) : Tool("XCore::Assembler", "XCore-as", TC) {}
798*67e74705SXin Li 
hasIntegratedCPP()799*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
800*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
801*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
802*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
803*67e74705SXin Li                     const char *LinkingOutput) const override;
804*67e74705SXin Li };
805*67e74705SXin Li 
806*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
807*67e74705SXin Li public:
Linker(const ToolChain & TC)808*67e74705SXin Li   Linker(const ToolChain &TC) : Tool("XCore::Linker", "XCore-ld", TC) {}
809*67e74705SXin Li 
hasIntegratedCPP()810*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
isLinkJob()811*67e74705SXin Li   bool isLinkJob() const override { return true; }
812*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
813*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
814*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
815*67e74705SXin Li                     const char *LinkingOutput) const override;
816*67e74705SXin Li };
817*67e74705SXin Li } // end namespace XCore.
818*67e74705SXin Li 
819*67e74705SXin Li namespace CrossWindows {
820*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
821*67e74705SXin Li public:
Assembler(const ToolChain & TC)822*67e74705SXin Li   Assembler(const ToolChain &TC) : Tool("CrossWindows::Assembler", "as", TC) {}
823*67e74705SXin Li 
hasIntegratedCPP()824*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
825*67e74705SXin Li 
826*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
827*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
828*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
829*67e74705SXin Li                     const char *LinkingOutput) const override;
830*67e74705SXin Li };
831*67e74705SXin Li 
832*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
833*67e74705SXin Li public:
Linker(const ToolChain & TC)834*67e74705SXin Li   Linker(const ToolChain &TC)
835*67e74705SXin Li       : Tool("CrossWindows::Linker", "ld", TC, RF_Full) {}
836*67e74705SXin Li 
hasIntegratedCPP()837*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
isLinkJob()838*67e74705SXin Li   bool isLinkJob() const override { return true; }
839*67e74705SXin Li 
840*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
841*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
842*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
843*67e74705SXin Li                     const char *LinkingOutput) const override;
844*67e74705SXin Li };
845*67e74705SXin Li } // end namespace CrossWindows
846*67e74705SXin Li 
847*67e74705SXin Li /// SHAVE tools -- Directly call moviCompile and moviAsm
848*67e74705SXin Li namespace SHAVE {
849*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
850*67e74705SXin Li public:
Compiler(const ToolChain & TC)851*67e74705SXin Li   Compiler(const ToolChain &TC) : Tool("moviCompile", "movicompile", TC) {}
852*67e74705SXin Li 
hasIntegratedCPP()853*67e74705SXin Li   bool hasIntegratedCPP() const override { return true; }
854*67e74705SXin Li 
855*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
856*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
857*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
858*67e74705SXin Li                     const char *LinkingOutput) const override;
859*67e74705SXin Li };
860*67e74705SXin Li 
861*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
862*67e74705SXin Li public:
Assembler(const ToolChain & TC)863*67e74705SXin Li   Assembler(const ToolChain &TC) : Tool("moviAsm", "moviAsm", TC) {}
864*67e74705SXin Li 
hasIntegratedCPP()865*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; } // not sure.
866*67e74705SXin Li 
867*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
868*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
869*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
870*67e74705SXin Li                     const char *LinkingOutput) const override;
871*67e74705SXin Li };
872*67e74705SXin Li } // end namespace SHAVE
873*67e74705SXin Li 
874*67e74705SXin Li /// The Myriad toolchain uses tools that are in two different namespaces.
875*67e74705SXin Li /// The Compiler and Assembler as defined above are in the SHAVE namespace,
876*67e74705SXin Li /// whereas the linker, which accepts code for a mixture of Sparc and SHAVE,
877*67e74705SXin Li /// is in the Myriad namespace.
878*67e74705SXin Li namespace Myriad {
879*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
880*67e74705SXin Li public:
Linker(const ToolChain & TC)881*67e74705SXin Li   Linker(const ToolChain &TC) : GnuTool("shave::Linker", "ld", TC) {}
hasIntegratedCPP()882*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
isLinkJob()883*67e74705SXin Li   bool isLinkJob() const override { return true; }
884*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
885*67e74705SXin Li                     const InputInfo &Output, const InputInfoList &Inputs,
886*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
887*67e74705SXin Li                     const char *LinkingOutput) const override;
888*67e74705SXin Li };
889*67e74705SXin Li } // end namespace Myriad
890*67e74705SXin Li 
891*67e74705SXin Li namespace PS4cpu {
892*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
893*67e74705SXin Li public:
Assemble(const ToolChain & TC)894*67e74705SXin Li   Assemble(const ToolChain &TC)
895*67e74705SXin Li       : Tool("PS4cpu::Assemble", "assembler", TC, RF_Full) {}
896*67e74705SXin Li 
hasIntegratedCPP()897*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
898*67e74705SXin Li 
899*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
900*67e74705SXin Li                     const InputInfo &Output,
901*67e74705SXin Li                     const InputInfoList &Inputs,
902*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
903*67e74705SXin Li                     const char *LinkingOutput) const override;
904*67e74705SXin Li };
905*67e74705SXin Li 
906*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Link : public Tool {
907*67e74705SXin Li public:
Link(const ToolChain & TC)908*67e74705SXin Li   Link(const ToolChain &TC) : Tool("PS4cpu::Link", "linker", TC, RF_Full) {}
909*67e74705SXin Li 
hasIntegratedCPP()910*67e74705SXin Li   bool hasIntegratedCPP() const override { return false; }
isLinkJob()911*67e74705SXin Li   bool isLinkJob() const override { return true; }
912*67e74705SXin Li 
913*67e74705SXin Li   void ConstructJob(Compilation &C, const JobAction &JA,
914*67e74705SXin Li                     const InputInfo &Output,
915*67e74705SXin Li                     const InputInfoList &Inputs,
916*67e74705SXin Li                     const llvm::opt::ArgList &TCArgs,
917*67e74705SXin Li                     const char *LinkingOutput) const override;
918*67e74705SXin Li };
919*67e74705SXin Li } // end namespace PS4cpu
920*67e74705SXin Li 
921*67e74705SXin Li namespace NVPTX {
922*67e74705SXin Li 
923*67e74705SXin Li // Run ptxas, the NVPTX assembler.
924*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
925*67e74705SXin Li  public:
Assembler(const ToolChain & TC)926*67e74705SXin Li    Assembler(const ToolChain &TC)
927*67e74705SXin Li        : Tool("NVPTX::Assembler", "ptxas", TC, RF_Full, llvm::sys::WEM_UTF8,
928*67e74705SXin Li               "--options-file") {}
929*67e74705SXin Li 
hasIntegratedCPP()930*67e74705SXin Li    bool hasIntegratedCPP() const override { return false; }
931*67e74705SXin Li 
932*67e74705SXin Li    void ConstructJob(Compilation &C, const JobAction &JA,
933*67e74705SXin Li                      const InputInfo &Output, const InputInfoList &Inputs,
934*67e74705SXin Li                      const llvm::opt::ArgList &TCArgs,
935*67e74705SXin Li                      const char *LinkingOutput) const override;
936*67e74705SXin Li };
937*67e74705SXin Li 
938*67e74705SXin Li // Runs fatbinary, which combines GPU object files ("cubin" files) and/or PTX
939*67e74705SXin Li // assembly into a single output file.
940*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
941*67e74705SXin Li  public:
Linker(const ToolChain & TC)942*67e74705SXin Li    Linker(const ToolChain &TC)
943*67e74705SXin Li        : Tool("NVPTX::Linker", "fatbinary", TC, RF_Full, llvm::sys::WEM_UTF8,
944*67e74705SXin Li               "--options-file") {}
945*67e74705SXin Li 
hasIntegratedCPP()946*67e74705SXin Li    bool hasIntegratedCPP() const override { return false; }
947*67e74705SXin Li 
948*67e74705SXin Li    void ConstructJob(Compilation &C, const JobAction &JA,
949*67e74705SXin Li                      const InputInfo &Output, const InputInfoList &Inputs,
950*67e74705SXin Li                      const llvm::opt::ArgList &TCArgs,
951*67e74705SXin Li                      const char *LinkingOutput) const override;
952*67e74705SXin Li };
953*67e74705SXin Li 
954*67e74705SXin Li }  // end namespace NVPTX
955*67e74705SXin Li 
956*67e74705SXin Li } // end namespace tools
957*67e74705SXin Li } // end namespace driver
958*67e74705SXin Li } // end namespace clang
959*67e74705SXin Li 
960*67e74705SXin Li #endif // LLVM_CLANG_LIB_DRIVER_TOOLS_H
961