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