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