xref: /openbsd-src/gnu/llvm/clang/lib/Driver/ToolChains/SPIRV.h (revision 12c855180aad702bbcca06e0398d774beeafb155)
1*12c85518Srobert //===--- SPIRV.h - SPIR-V Tool Implementations ------------------*- C++ -*-===//
2*12c85518Srobert //
3*12c85518Srobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*12c85518Srobert // See https://llvm.org/LICENSE.txt for license information.
5*12c85518Srobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*12c85518Srobert //
7*12c85518Srobert //===----------------------------------------------------------------------===//
8*12c85518Srobert 
9*12c85518Srobert #ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_SPIRV_H
10*12c85518Srobert #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_SPIRV_H
11*12c85518Srobert 
12*12c85518Srobert #include "clang/Driver/Tool.h"
13*12c85518Srobert #include "clang/Driver/ToolChain.h"
14*12c85518Srobert 
15*12c85518Srobert namespace clang {
16*12c85518Srobert namespace driver {
17*12c85518Srobert namespace tools {
18*12c85518Srobert namespace SPIRV {
19*12c85518Srobert 
20*12c85518Srobert void addTranslatorArgs(const llvm::opt::ArgList &InArgs,
21*12c85518Srobert                        llvm::opt::ArgStringList &OutArgs);
22*12c85518Srobert 
23*12c85518Srobert void constructTranslateCommand(Compilation &C, const Tool &T,
24*12c85518Srobert                                const JobAction &JA, const InputInfo &Output,
25*12c85518Srobert                                const InputInfo &Input,
26*12c85518Srobert                                const llvm::opt::ArgStringList &Args);
27*12c85518Srobert 
28*12c85518Srobert class LLVM_LIBRARY_VISIBILITY Translator : public Tool {
29*12c85518Srobert public:
Translator(const ToolChain & TC)30*12c85518Srobert   Translator(const ToolChain &TC)
31*12c85518Srobert       : Tool("SPIR-V::Translator", "llvm-spirv", TC) {}
32*12c85518Srobert 
hasIntegratedCPP()33*12c85518Srobert   bool hasIntegratedCPP() const override { return false; }
hasIntegratedAssembler()34*12c85518Srobert   bool hasIntegratedAssembler() const override { return true; }
35*12c85518Srobert 
36*12c85518Srobert   void ConstructJob(Compilation &C, const JobAction &JA,
37*12c85518Srobert                     const InputInfo &Output, const InputInfoList &Inputs,
38*12c85518Srobert                     const llvm::opt::ArgList &TCArgs,
39*12c85518Srobert                     const char *LinkingOutput) const override;
40*12c85518Srobert };
41*12c85518Srobert 
42*12c85518Srobert class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
43*12c85518Srobert public:
Linker(const ToolChain & TC)44*12c85518Srobert   Linker(const ToolChain &TC) : Tool("SPIRV::Linker", "spirv-link", TC) {}
hasIntegratedCPP()45*12c85518Srobert   bool hasIntegratedCPP() const override { return false; }
isLinkJob()46*12c85518Srobert   bool isLinkJob() const override { return true; }
47*12c85518Srobert   void ConstructJob(Compilation &C, const JobAction &JA,
48*12c85518Srobert                     const InputInfo &Output, const InputInfoList &Inputs,
49*12c85518Srobert                     const llvm::opt::ArgList &TCArgs,
50*12c85518Srobert                     const char *LinkingOutput) const override;
51*12c85518Srobert };
52*12c85518Srobert 
53*12c85518Srobert } // namespace SPIRV
54*12c85518Srobert } // namespace tools
55*12c85518Srobert 
56*12c85518Srobert namespace toolchains {
57*12c85518Srobert 
58*12c85518Srobert class LLVM_LIBRARY_VISIBILITY SPIRVToolChain final : public ToolChain {
59*12c85518Srobert   mutable std::unique_ptr<Tool> Translator;
60*12c85518Srobert 
61*12c85518Srobert public:
SPIRVToolChain(const Driver & D,const llvm::Triple & Triple,const llvm::opt::ArgList & Args)62*12c85518Srobert   SPIRVToolChain(const Driver &D, const llvm::Triple &Triple,
63*12c85518Srobert                  const llvm::opt::ArgList &Args)
64*12c85518Srobert       : ToolChain(D, Triple, Args) {}
65*12c85518Srobert 
useIntegratedAs()66*12c85518Srobert   bool useIntegratedAs() const override { return true; }
67*12c85518Srobert 
IsIntegratedBackendDefault()68*12c85518Srobert   bool IsIntegratedBackendDefault() const override { return false; }
IsNonIntegratedBackendSupported()69*12c85518Srobert   bool IsNonIntegratedBackendSupported() const override { return true; }
IsMathErrnoDefault()70*12c85518Srobert   bool IsMathErrnoDefault() const override { return false; }
isCrossCompiling()71*12c85518Srobert   bool isCrossCompiling() const override { return true; }
isPICDefault()72*12c85518Srobert   bool isPICDefault() const override { return false; }
isPIEDefault(const llvm::opt::ArgList & Args)73*12c85518Srobert   bool isPIEDefault(const llvm::opt::ArgList &Args) const override {
74*12c85518Srobert     return false;
75*12c85518Srobert   }
isPICDefaultForced()76*12c85518Srobert   bool isPICDefaultForced() const override { return false; }
SupportsProfiling()77*12c85518Srobert   bool SupportsProfiling() const override { return false; }
78*12c85518Srobert 
79*12c85518Srobert   clang::driver::Tool *SelectTool(const JobAction &JA) const override;
80*12c85518Srobert 
81*12c85518Srobert protected:
82*12c85518Srobert   clang::driver::Tool *getTool(Action::ActionClass AC) const override;
83*12c85518Srobert   Tool *buildLinker() const override;
84*12c85518Srobert 
85*12c85518Srobert private:
86*12c85518Srobert   clang::driver::Tool *getTranslator() const;
87*12c85518Srobert };
88*12c85518Srobert 
89*12c85518Srobert } // namespace toolchains
90*12c85518Srobert } // namespace driver
91*12c85518Srobert } // namespace clang
92*12c85518Srobert #endif
93