107 lines · c
1//===--- HLSL.h - HLSL ToolChain 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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_HLSL_H10#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_HLSL_H11 12#include "clang/Driver/Tool.h"13#include "clang/Driver/ToolChain.h"14 15namespace clang {16namespace driver {17 18namespace tools {19 20namespace hlsl {21class LLVM_LIBRARY_VISIBILITY Validator : public Tool {22public:23 Validator(const ToolChain &TC) : Tool("hlsl::Validator", "dxv", TC) {}24 25 bool hasIntegratedCPP() const override { return false; }26 27 void ConstructJob(Compilation &C, const JobAction &JA,28 const InputInfo &Output, const InputInfoList &Inputs,29 const llvm::opt::ArgList &TCArgs,30 const char *LinkingOutput) const override;31};32 33class LLVM_LIBRARY_VISIBILITY MetalConverter : public Tool {34public:35 MetalConverter(const ToolChain &TC)36 : Tool("hlsl::MetalConverter", "metal-shaderconverter", TC) {}37 38 bool hasIntegratedCPP() const override { return false; }39 40 void ConstructJob(Compilation &C, const JobAction &JA,41 const InputInfo &Output, const InputInfoList &Inputs,42 const llvm::opt::ArgList &TCArgs,43 const char *LinkingOutput) const override;44};45 46class LLVM_LIBRARY_VISIBILITY LLVMObjcopy : public Tool {47public:48 LLVMObjcopy(const ToolChain &TC)49 : Tool("hlsl::LLVMObjcopy", "llvm-objcopy", TC) {}50 51 bool hasIntegratedCPP() const override { return false; }52 53 void ConstructJob(Compilation &C, const JobAction &JA,54 const InputInfo &Output, const InputInfoList &Inputs,55 const llvm::opt::ArgList &TCArgs,56 const char *LinkingOutput) const override;57};58 59} // namespace hlsl60} // namespace tools61 62namespace toolchains {63 64class LLVM_LIBRARY_VISIBILITY HLSLToolChain : public ToolChain {65public:66 HLSLToolChain(const Driver &D, const llvm::Triple &Triple,67 const llvm::opt::ArgList &Args);68 Tool *getTool(Action::ActionClass AC) const override;69 70 bool isPICDefault() const override { return false; }71 bool isPIEDefault(const llvm::opt::ArgList &Args) const override {72 return false;73 }74 bool isPICDefaultForced() const override { return false; }75 76 llvm::opt::DerivedArgList *77 TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch,78 Action::OffloadKind DeviceOffloadKind) const override;79 static std::optional<std::string> parseTargetProfile(StringRef TargetProfile);80 bool requiresValidation(llvm::opt::DerivedArgList &Args) const;81 bool requiresBinaryTranslation(llvm::opt::DerivedArgList &Args) const;82 bool requiresObjcopy(llvm::opt::DerivedArgList &Args) const;83 84 /// If we are targeting DXIL then the last job should output the DXContainer85 /// to the specified output file with /Fo. Otherwise, we will emit to a86 /// temporary file for the next job to use.87 ///88 /// Returns true if we should output to the final result file.89 bool isLastJob(llvm::opt::DerivedArgList &Args, Action::ActionClass AC) const;90 91 // Set default DWARF version to 4 for DXIL uses version 4.92 unsigned GetDefaultDwarfVersion() const override { return 4; }93 94 void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const override;95 96private:97 mutable std::unique_ptr<tools::hlsl::Validator> Validator;98 mutable std::unique_ptr<tools::hlsl::MetalConverter> MetalConverter;99 mutable std::unique_ptr<tools::hlsl::LLVMObjcopy> LLVMObjcopy;100};101 102} // end namespace toolchains103} // end namespace driver104} // end namespace clang105 106#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_HLSL_H107