llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-codegen Author: Finn Plummer (inbelic) <details> <summary>Changes</summary> This pr breaks-up `HLSLRootSignatureUtils` into separate orthogonal and meaningful libraries. This prevents it end up as a dumping grounds of many different parts. - Creates a library `RootSignatureMetadata` to contain helper functions for interacting the root signatures in their metadata representation - Create a library `RootSignatureValidations` to contain helper functions that will validation various values of root signatures - Move the serialization of root signature elements to `HLSLRootSignature` Resolves https://github.com/llvm/llvm-project/issues/145946 --- Patch is 45.71 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/146124.diff 13 Files Affected: - (modified) clang/lib/AST/TextNodeDumper.cpp (+1-1) - (modified) clang/lib/CodeGen/CGHLSLRuntime.cpp (+1-1) - (modified) clang/lib/Sema/SemaHLSL.cpp (+1-1) - (modified) llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h (+16) - (added) llvm/include/llvm/Frontend/HLSL/RootSignatureMetadata.h (+56) - (renamed) llvm/include/llvm/Frontend/HLSL/RootSignatureValidations.h (+4-56) - (modified) llvm/lib/Frontend/HLSL/CMakeLists.txt (+3-1) - (added) llvm/lib/Frontend/HLSL/HLSLRootSignature.cpp (+244) - (removed) llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp (-457) - (added) llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp (+194) - (added) llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp (+84) - (modified) llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp (+1-1) - (modified) llvm/unittests/Frontend/HLSLRootSignatureRangesTest.cpp (+1-1) ``````````diff diff --git a/clang/lib/AST/TextNodeDumper.cpp b/clang/lib/AST/TextNodeDumper.cpp index bb860a8f76742..9d7c2757d6ee4 100644 --- a/clang/lib/AST/TextNodeDumper.cpp +++ b/clang/lib/AST/TextNodeDumper.cpp @@ -24,7 +24,7 @@ #include "clang/Basic/Specifiers.h" #include "clang/Basic/TypeTraits.h" #include "llvm/ADT/StringExtras.h" -#include "llvm/Frontend/HLSL/HLSLRootSignatureUtils.h" +#include "llvm/Frontend/HLSL/HLSLRootSignature.h" #include <algorithm> #include <utility> diff --git a/clang/lib/CodeGen/CGHLSLRuntime.cpp b/clang/lib/CodeGen/CGHLSLRuntime.cpp index f2e992fb7fa69..73843247ce7f2 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.cpp +++ b/clang/lib/CodeGen/CGHLSLRuntime.cpp @@ -23,7 +23,7 @@ #include "clang/AST/Type.h" #include "clang/Basic/TargetOptions.h" #include "llvm/ADT/SmallVector.h" -#include "llvm/Frontend/HLSL/HLSLRootSignatureUtils.h" +#include "llvm/Frontend/HLSL/RootSignatureMetadata.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/GlobalVariable.h" diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index 3bab0da5edea8..ca66c71370d60 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -39,7 +39,7 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/Twine.h" -#include "llvm/Frontend/HLSL/HLSLRootSignatureUtils.h" +#include "llvm/Frontend/HLSL/RootSignatureValidations.h" #include "llvm/Support/Casting.h" #include "llvm/Support/DXILABI.h" #include "llvm/Support/ErrorHandling.h" diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h index f552040ab31cc..f747c8ccaeb18 100644 --- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h +++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h @@ -17,6 +17,7 @@ #include "llvm/BinaryFormat/DXContainer.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/DXILABI.h" +#include "llvm/Support/raw_ostream.h" #include <limits> #include <variant> @@ -135,6 +136,21 @@ using RootElement = std::variant<dxbc::RootFlags, RootConstants, RootDescriptor, DescriptorTable, DescriptorTableClause, StaticSampler>; +/// The following contains the serialization interface for root elements +LLVM_ABI raw_ostream &operator<<(raw_ostream &OS, const dxbc::RootFlags &Flags); +LLVM_ABI raw_ostream &operator<<(raw_ostream &OS, + const RootConstants &Constants); +LLVM_ABI raw_ostream &operator<<(raw_ostream &OS, + const DescriptorTableClause &Clause); +LLVM_ABI raw_ostream &operator<<(raw_ostream &OS, const DescriptorTable &Table); +LLVM_ABI raw_ostream &operator<<(raw_ostream &OS, + const RootDescriptor &Descriptor); +LLVM_ABI raw_ostream &operator<<(raw_ostream &OS, + const StaticSampler &StaticSampler); +LLVM_ABI raw_ostream &operator<<(raw_ostream &OS, const RootElement &Element); + +LLVM_ABI void dumpRootElements(raw_ostream &OS, ArrayRef<RootElement> Elements); + } // namespace rootsig } // namespace hlsl } // namespace llvm diff --git a/llvm/include/llvm/Frontend/HLSL/RootSignatureMetadata.h b/llvm/include/llvm/Frontend/HLSL/RootSignatureMetadata.h new file mode 100644 index 0000000000000..c473a7f1e02e5 --- /dev/null +++ b/llvm/include/llvm/Frontend/HLSL/RootSignatureMetadata.h @@ -0,0 +1,56 @@ +//===- RootSignatureMetadata.h - HLSL Root Signature helpers --------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// +/// \file This file contains a library for working with HLSL Root Signatures and +/// their metadata representation. +/// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_FRONTEND_HLSL_ROOTSIGNATUREMETADATA_H +#define LLVM_FRONTEND_HLSL_ROOTSIGNATUREMETADATA_H + +#include "llvm/Frontend/HLSL/HLSLRootSignature.h" + +namespace llvm { +class LLVMContext; +class MDNode; +class Metadata; + +namespace hlsl { +namespace rootsig { + +class MetadataBuilder { +public: + MetadataBuilder(llvm::LLVMContext &Ctx, ArrayRef<RootElement> Elements) + : Ctx(Ctx), Elements(Elements) {} + + /// Iterates through the elements and dispatches onto the correct Build method + /// + /// Accumulates the root signature and returns the Metadata node that is just + /// a list of all the elements + LLVM_ABI MDNode *BuildRootSignature(); + +private: + /// Define the various builders for the different metadata types + MDNode *BuildRootFlags(const dxbc::RootFlags &Flags); + MDNode *BuildRootConstants(const RootConstants &Constants); + MDNode *BuildRootDescriptor(const RootDescriptor &Descriptor); + MDNode *BuildDescriptorTable(const DescriptorTable &Table); + MDNode *BuildDescriptorTableClause(const DescriptorTableClause &Clause); + MDNode *BuildStaticSampler(const StaticSampler &Sampler); + + llvm::LLVMContext &Ctx; + ArrayRef<RootElement> Elements; + SmallVector<Metadata *> GeneratedMetadata; +}; + +} // namespace rootsig +} // namespace hlsl +} // namespace llvm + +#endif // LLVM_FRONTEND_HLSL_ROOTSIGNATUREMETADATA_H diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignatureUtils.h b/llvm/include/llvm/Frontend/HLSL/RootSignatureValidations.h similarity index 55% rename from llvm/include/llvm/Frontend/HLSL/HLSLRootSignatureUtils.h rename to llvm/include/llvm/Frontend/HLSL/RootSignatureValidations.h index 4fa080e949d54..14eb7c482c08c 100644 --- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignatureUtils.h +++ b/llvm/include/llvm/Frontend/HLSL/RootSignatureValidations.h @@ -1,4 +1,4 @@ -//===- HLSLRootSignatureUtils.h - HLSL Root Signature helpers -------------===// +//===- RootSignatureValidations.h - HLSL Root Signature helpers -----------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -11,68 +11,16 @@ /// //===----------------------------------------------------------------------===// -#ifndef LLVM_FRONTEND_HLSL_HLSLROOTSIGNATUREUTILS_H -#define LLVM_FRONTEND_HLSL_HLSLROOTSIGNATUREUTILS_H +#ifndef LLVM_FRONTEND_HLSL_ROOTSIGNATUREVALIDATIONS_H +#define LLVM_FRONTEND_HLSL_ROOTSIGNATUREVALIDATIONS_H -#include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/IntervalMap.h" #include "llvm/Frontend/HLSL/HLSLRootSignature.h" -#include "llvm/Support/Compiler.h" -#include "llvm/Support/raw_ostream.h" namespace llvm { -class LLVMContext; -class MDNode; -class Metadata; - namespace hlsl { namespace rootsig { -LLVM_ABI raw_ostream &operator<<(raw_ostream &OS, const dxbc::RootFlags &Flags); - -LLVM_ABI raw_ostream &operator<<(raw_ostream &OS, - const RootConstants &Constants); - -LLVM_ABI raw_ostream &operator<<(raw_ostream &OS, - const DescriptorTableClause &Clause); - -LLVM_ABI raw_ostream &operator<<(raw_ostream &OS, const DescriptorTable &Table); - -LLVM_ABI raw_ostream &operator<<(raw_ostream &OS, - const RootDescriptor &Descriptor); - -LLVM_ABI raw_ostream &operator<<(raw_ostream &OS, - const StaticSampler &StaticSampler); - -LLVM_ABI raw_ostream &operator<<(raw_ostream &OS, const RootElement &Element); - -LLVM_ABI void dumpRootElements(raw_ostream &OS, ArrayRef<RootElement> Elements); - -class MetadataBuilder { -public: - MetadataBuilder(llvm::LLVMContext &Ctx, ArrayRef<RootElement> Elements) - : Ctx(Ctx), Elements(Elements) {} - - /// Iterates through the elements and dispatches onto the correct Build method - /// - /// Accumulates the root signature and returns the Metadata node that is just - /// a list of all the elements - LLVM_ABI MDNode *BuildRootSignature(); - -private: - /// Define the various builders for the different metadata types - MDNode *BuildRootFlags(const dxbc::RootFlags &Flags); - MDNode *BuildRootConstants(const RootConstants &Constants); - MDNode *BuildRootDescriptor(const RootDescriptor &Descriptor); - MDNode *BuildDescriptorTable(const DescriptorTable &Table); - MDNode *BuildDescriptorTableClause(const DescriptorTableClause &Clause); - MDNode *BuildStaticSampler(const StaticSampler &Sampler); - - llvm::LLVMContext &Ctx; - ArrayRef<RootElement> Elements; - SmallVector<Metadata *> GeneratedMetadata; -}; - struct RangeInfo { const static uint32_t Unbounded = ~0u; @@ -140,4 +88,4 @@ class ResourceRange { } // namespace hlsl } // namespace llvm -#endif // LLVM_FRONTEND_HLSL_HLSLROOTSIGNATUREUTILS_H +#endif // LLVM_FRONTEND_HLSL_ROOTSIGNATUREVALIDATIONS_H diff --git a/llvm/lib/Frontend/HLSL/CMakeLists.txt b/llvm/lib/Frontend/HLSL/CMakeLists.txt index 8928144730477..534346920ff19 100644 --- a/llvm/lib/Frontend/HLSL/CMakeLists.txt +++ b/llvm/lib/Frontend/HLSL/CMakeLists.txt @@ -1,7 +1,9 @@ add_llvm_component_library(LLVMFrontendHLSL CBuffer.cpp HLSLResource.cpp - HLSLRootSignatureUtils.cpp + HLSLRootSignature.cpp + RootSignatureMetadata.cpp + RootSignatureValidations.cpp ADDITIONAL_HEADER_DIRS ${LLVM_MAIN_INCLUDE_DIR}/llvm/Frontend diff --git a/llvm/lib/Frontend/HLSL/HLSLRootSignature.cpp b/llvm/lib/Frontend/HLSL/HLSLRootSignature.cpp new file mode 100644 index 0000000000000..78c20a6c5c9ff --- /dev/null +++ b/llvm/lib/Frontend/HLSL/HLSLRootSignature.cpp @@ -0,0 +1,244 @@ +//===- HLSLRootSignature.cpp - HLSL Root Signature helpers ----------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// +/// \file This file contains helpers for working with HLSL Root Signatures. +/// +//===----------------------------------------------------------------------===// + +#include "llvm/Frontend/HLSL/HLSLRootSignature.h" +#include "llvm/Support/ScopedPrinter.h" + +namespace llvm { +namespace hlsl { +namespace rootsig { + +template <typename T> +static std::optional<StringRef> getEnumName(const T Value, + ArrayRef<EnumEntry<T>> Enums) { + for (const auto &EnumItem : Enums) + if (EnumItem.Value == Value) + return EnumItem.Name; + return std::nullopt; +} + +template <typename T> +static raw_ostream &printEnum(raw_ostream &OS, const T Value, + ArrayRef<EnumEntry<T>> Enums) { + auto MaybeName = getEnumName(Value, Enums); + if (MaybeName) + OS << *MaybeName; + return OS; +} + +template <typename T> +static raw_ostream &printFlags(raw_ostream &OS, const T Value, + ArrayRef<EnumEntry<T>> Flags) { + bool FlagSet = false; + unsigned Remaining = llvm::to_underlying(Value); + while (Remaining) { + unsigned Bit = 1u << llvm::countr_zero(Remaining); + if (Remaining & Bit) { + if (FlagSet) + OS << " | "; + + auto MaybeFlag = getEnumName(T(Bit), Flags); + if (MaybeFlag) + OS << *MaybeFlag; + else + OS << "invalid: " << Bit; + + FlagSet = true; + } + Remaining &= ~Bit; + } + + if (!FlagSet) + OS << "None"; + return OS; +} + +static const EnumEntry<RegisterType> RegisterNames[] = { + {"b", RegisterType::BReg}, + {"t", RegisterType::TReg}, + {"u", RegisterType::UReg}, + {"s", RegisterType::SReg}, +}; + +static raw_ostream &operator<<(raw_ostream &OS, const Register &Reg) { + printEnum(OS, Reg.ViewType, ArrayRef(RegisterNames)); + OS << Reg.Number; + + return OS; +} + +static raw_ostream &operator<<(raw_ostream &OS, + const llvm::dxbc::ShaderVisibility &Visibility) { + printEnum(OS, Visibility, dxbc::getShaderVisibility()); + + return OS; +} + +static raw_ostream &operator<<(raw_ostream &OS, + const llvm::dxbc::SamplerFilter &Filter) { + printEnum(OS, Filter, dxbc::getSamplerFilters()); + + return OS; +} + +static raw_ostream &operator<<(raw_ostream &OS, + const dxbc::TextureAddressMode &Address) { + printEnum(OS, Address, dxbc::getTextureAddressModes()); + + return OS; +} + +static raw_ostream &operator<<(raw_ostream &OS, + const dxbc::ComparisonFunc &CompFunc) { + printEnum(OS, CompFunc, dxbc::getComparisonFuncs()); + + return OS; +} + +static raw_ostream &operator<<(raw_ostream &OS, + const dxbc::StaticBorderColor &BorderColor) { + printEnum(OS, BorderColor, dxbc::getStaticBorderColors()); + + return OS; +} + +static const EnumEntry<dxil::ResourceClass> ResourceClassNames[] = { + {"CBV", dxil::ResourceClass::CBuffer}, + {"SRV", dxil::ResourceClass::SRV}, + {"UAV", dxil::ResourceClass::UAV}, + {"Sampler", dxil::ResourceClass::Sampler}, +}; + +static raw_ostream &operator<<(raw_ostream &OS, const ClauseType &Type) { + printEnum(OS, dxil::ResourceClass(llvm::to_underlying(Type)), + ArrayRef(ResourceClassNames)); + + return OS; +} + +static raw_ostream &operator<<(raw_ostream &OS, + const dxbc::RootDescriptorFlags &Flags) { + printFlags(OS, Flags, dxbc::getRootDescriptorFlags()); + + return OS; +} + +static raw_ostream &operator<<(raw_ostream &OS, + const llvm::dxbc::DescriptorRangeFlags &Flags) { + printFlags(OS, Flags, dxbc::getDescriptorRangeFlags()); + + return OS; +} + +raw_ostream &operator<<(raw_ostream &OS, const dxbc::RootFlags &Flags) { + OS << "RootFlags("; + printFlags(OS, Flags, dxbc::getRootFlags()); + OS << ")"; + + return OS; +} + +raw_ostream &operator<<(raw_ostream &OS, const RootConstants &Constants) { + OS << "RootConstants(num32BitConstants = " << Constants.Num32BitConstants + << ", " << Constants.Reg << ", space = " << Constants.Space + << ", visibility = " << Constants.Visibility << ")"; + + return OS; +} + +raw_ostream &operator<<(raw_ostream &OS, const DescriptorTable &Table) { + OS << "DescriptorTable(numClauses = " << Table.NumClauses + << ", visibility = " << Table.Visibility << ")"; + + return OS; +} + +raw_ostream &operator<<(raw_ostream &OS, const DescriptorTableClause &Clause) { + OS << Clause.Type << "(" << Clause.Reg << ", numDescriptors = "; + if (Clause.NumDescriptors == NumDescriptorsUnbounded) + OS << "unbounded"; + else + OS << Clause.NumDescriptors; + OS << ", space = " << Clause.Space << ", offset = "; + if (Clause.Offset == DescriptorTableOffsetAppend) + OS << "DescriptorTableOffsetAppend"; + else + OS << Clause.Offset; + OS << ", flags = " << Clause.Flags << ")"; + + return OS; +} + +raw_ostream &operator<<(raw_ostream &OS, const RootDescriptor &Descriptor) { + ClauseType Type = ClauseType(llvm::to_underlying(Descriptor.Type)); + OS << "Root" << Type << "(" << Descriptor.Reg + << ", space = " << Descriptor.Space + << ", visibility = " << Descriptor.Visibility + << ", flags = " << Descriptor.Flags << ")"; + + return OS; +} + +raw_ostream &operator<<(raw_ostream &OS, const StaticSampler &Sampler) { + OS << "StaticSampler(" << Sampler.Reg << ", filter = " << Sampler.Filter + << ", addressU = " << Sampler.AddressU + << ", addressV = " << Sampler.AddressV + << ", addressW = " << Sampler.AddressW + << ", mipLODBias = " << Sampler.MipLODBias + << ", maxAnisotropy = " << Sampler.MaxAnisotropy + << ", comparisonFunc = " << Sampler.CompFunc + << ", borderColor = " << Sampler.BorderColor + << ", minLOD = " << Sampler.MinLOD << ", maxLOD = " << Sampler.MaxLOD + << ", space = " << Sampler.Space << ", visibility = " << Sampler.Visibility + << ")"; + return OS; +} + +namespace { + +// We use the OverloadVisit with std::visit to ensure the compiler catches if a +// new RootElement variant type is added but it's operator<< isn't handled. +template <class... Ts> struct OverloadedVisit : Ts... { + using Ts::operator()...; +}; +template <class... Ts> OverloadedVisit(Ts...) -> OverloadedVisit<Ts...>; + +} // namespace + +raw_ostream &operator<<(raw_ostream &OS, const RootElement &Element) { + const auto Visitor = OverloadedVisit{ + [&OS](const dxbc::RootFlags &Flags) { OS << Flags; }, + [&OS](const RootConstants &Constants) { OS << Constants; }, + [&OS](const RootDescriptor &Descriptor) { OS << Descriptor; }, + [&OS](const DescriptorTableClause &Clause) { OS << Clause; }, + [&OS](const DescriptorTable &Table) { OS << Table; }, + [&OS](const StaticSampler &Sampler) { OS << Sampler; }, + }; + std::visit(Visitor, Element); + return OS; +} + +void dumpRootElements(raw_ostream &OS, ArrayRef<RootElement> Elements) { + OS << " RootElements{"; + bool First = true; + for (const RootElement &Element : Elements) { + if (!First) + OS << ","; + OS << " " << Element; + First = false; + } + OS << "}"; +} + +} // namespace rootsig +} // namespace hlsl +} // namespace llvm diff --git a/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp b/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp deleted file mode 100644 index 67f512008b069..0000000000000 --- a/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp +++ /dev/null @@ -1,457 +0,0 @@ -//===- HLSLRootSignatureUtils.cpp - HLSL Root Signature helpers -----------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -/// -/// \file This file contains helpers for working with HLSL Root Signatures. -/// -//===----------------------------------------------------------------------===// - -#include "llvm/Frontend/HLSL/HLSLRootSignatureUtils.h" -#include "llvm/ADT/SmallString.h" -#include "llvm/ADT/bit.h" -#include "llvm/IR/IRBuilder.h" -#include "llvm/IR/Metadata.h" -#include "llvm/Support/ScopedPrinter.h" - -namespace llvm { -namespace hlsl { -namespace rootsig { - -template <typename T> -static std::optional<StringRef> getEnumName(const T Value, - ArrayRef<EnumEntry<T>> Enums) { - for (const auto &EnumItem : Enums) - if (EnumItem.Value == Value) - return EnumItem.Name; - return std::nullopt; -} - -template <typename T> -static raw_ostream &printEnum(raw_ostream &OS, const T Value, - ArrayRef<EnumEntry<T>> Enums) { - auto MaybeName = getEnumName(Value, Enums); - if (MaybeName) - OS << *MaybeName; - return OS; -} - -template <typename T> -static raw_ostream &printFlags(raw_ostream &OS, const T Value, - ArrayRef<EnumEntry<T>> Flags) { - bool FlagSet = false; - unsigned Remaining = llvm::to_underlying(Value); - while (Remaining) { - unsigned Bit = 1u << llvm::countr_zero(Remaining); - if (Remaining & Bit) { - if (FlagSet) - OS << " | "; - - auto MaybeFlag = getEnumName(T(Bit), Flags); - if (MaybeFlag) - OS << *MaybeFlag; - else - OS << "invalid: " << Bit; - - FlagSet = true; - } - Remaining &= ~Bit; - } - - if (!FlagSet) - OS << "None"; - return OS; -} - -static const EnumEntry<RegisterType> RegisterNames[] = { - {"b", RegisterType::BReg}, - {"t", RegisterType::TReg}, - {"u", RegisterType::UReg}, - {"s", RegisterType::SReg}, -}; - -static raw_ostream &operator<<(raw_ostream &OS, const Register &Reg) { - printEnum(OS, Reg.ViewType, ArrayRef(RegisterNames)); - OS << Reg.Number; - - return OS; -} - -static raw_ostream &operator<<(raw_ostream &OS, - const llvm::dxbc::ShaderVisibility &Visibility) { - printEnum(OS, Visibility, dxbc::getShaderVisibility()); - - return OS; -} - -static raw_ostream &operator<<(raw_ostream &OS, - const llvm::dxbc::SamplerFilter &Filter) { - printEnum(OS, Filter, dxbc::getSamplerFilters()); - - return OS; -} - -static raw_ostream &operator<<(raw_ostream &OS, - const dxbc::TextureAddressMode... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/146124 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits