aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Bogner <mail@justinbogner.com>2024-06-21 12:39:28 -0600
committerGitHub <noreply@github.com>2024-06-21 12:39:28 -0600
commit39048b69b85e530b9b8a4226d9043a0bd340fe8a (patch)
tree1edf7365c3e06ea2efd52b416798851e5724570d
parentbf3e3289d67cb0fe136b0660cac39c24c9f65069 (diff)
downloadllvm-39048b69b85e530b9b8a4226d9043a0bd340fe8a.zip
llvm-39048b69b85e530b9b8a4226d9043a0bd340fe8a.tar.gz
llvm-39048b69b85e530b9b8a4226d9043a0bd340fe8a.tar.bz2
[DirectX] Move ResourceClass enum into DXILABI. NFC (#96335)
The resource class isn't HLSL specific, and we'll need to use it in the DirectX backend as well. I've also removed the "invalid" enum value since it isn't needed or used, which necessitates fixing up the clang attr emitter to handle external enum types that are fully covered by the attribute.
-rw-r--r--clang/include/clang/Basic/Attr.td63
-rw-r--r--clang/utils/TableGen/ClangAttrEmitter.cpp19
-rw-r--r--llvm/include/llvm/Frontend/HLSL/HLSLResource.h10
-rw-r--r--llvm/include/llvm/Support/DXILABI.h7
4 files changed, 58 insertions, 41 deletions
diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td
index e801c7f..c8e2015 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -287,7 +287,7 @@ class DefaultIntArgument<string name, int default> : IntArgument<name, 1> {
// possible values, and a list of enumerators to map them to.
class EnumArgument<string name, string type, bit is_string, list<string> values,
list<string> enums, bit opt = 0, bit fake = 0,
- bit isExternalType = 0>
+ bit isExternalType = 0, bit isCovered = 1>
: Argument<name, opt, fake> {
string Type = type;
// When true, the argument will be parsed as an unevaluated string literal
@@ -296,13 +296,16 @@ class EnumArgument<string name, string type, bit is_string, list<string> values,
list<string> Values = values;
list<string> Enums = enums;
bit IsExternalType = isExternalType;
+ // We need to know whether an external enum is fully covered by the options
+ // in order to decide whether to emit unreachable default labels in a switch.
+ bit IsCovered = isCovered;
}
// FIXME: There should be a VariadicArgument type that takes any other type
// of argument and generates the appropriate type.
class VariadicEnumArgument<string name, string type, bit is_string,
list<string> values, list<string> enums,
- bit isExternalType = 0>
+ bit isExternalType = 0, bit isCovered = 1>
: Argument<name, 1> {
string Type = type;
// When true, the argument will be parsed as an unevaluated string literal
@@ -311,6 +314,9 @@ class VariadicEnumArgument<string name, string type, bit is_string,
list<string> Values = values;
list<string> Enums = enums;
bit IsExternalType = isExternalType;
+ // We need to know whether an external enum is fully covered by the options
+ // in order to decide whether to emit unreachable default labels in a switch.
+ bit IsCovered = isCovered;
}
// Represents an attribute wrapped by another attribute.
@@ -2913,7 +2919,7 @@ def CodeModel : InheritableAttr, TargetSpecificAttr<TargetLoongArch> {
let Spellings = [GCC<"model">];
let Args = [EnumArgument<"Model", "llvm::CodeModel::Model", /*is_string=*/1,
["normal", "medium", "extreme"], ["Small", "Medium", "Large"],
- /*opt=*/0, /*fake=*/0, /*isExternalType=*/1>];
+ /*opt=*/0, /*fake=*/0, /*isExternalType=*/1, /*isCovered=*/0>];
let Subjects = SubjectList<[NonTLSGlobalVar], ErrorDiag>;
let Documentation = [CodeModelDocs];
}
@@ -4472,7 +4478,7 @@ def HLSLShader : InheritableAttr {
["Pixel", "Vertex", "Geometry", "Hull", "Domain", "Compute",
"RayGeneration", "Intersection", "AnyHit", "ClosestHit",
"Miss", "Callable", "Mesh", "Amplification"],
- /*opt=*/0, /*fake=*/0, /*isExternalType=*/1>
+ /*opt=*/0, /*fake=*/0, /*isExternalType=*/1, /*isCovered=*/0>
];
let Documentation = [HLSLSV_ShaderTypeAttrDocs];
let AdditionalMembers =
@@ -4487,30 +4493,31 @@ def HLSLResource : InheritableAttr {
let Spellings = [];
let Subjects = SubjectList<[Struct]>;
let LangOpts = [HLSL];
- let Args = [EnumArgument<"ResourceClass", "llvm::hlsl::ResourceClass",
- /*is_string=*/0,
- ["SRV", "UAV", "CBuffer", "Sampler"],
- ["SRV", "UAV", "CBuffer", "Sampler"],
- /*opt=*/0, /*fake=*/0, /*isExternalType=*/1>,
- EnumArgument<"ResourceKind", "llvm::hlsl::ResourceKind",
- /*is_string=*/0,
- ["Texture1D", "Texture2D", "Texture2DMS",
- "Texture3D", "TextureCube", "Texture1DArray",
- "Texture2DArray", "Texture2DMSArray",
- "TextureCubeArray", "TypedBuffer", "RawBuffer",
- "StructuredBuffer", "CBuffer", "Sampler",
- "TBuffer", "RTAccelerationStructure",
- "FeedbackTexture2D", "FeedbackTexture2DArray"],
- ["Texture1D", "Texture2D", "Texture2DMS",
- "Texture3D", "TextureCube", "Texture1DArray",
- "Texture2DArray", "Texture2DMSArray",
- "TextureCubeArray", "TypedBuffer", "RawBuffer",
- "StructuredBuffer", "CBuffer", "Sampler",
- "TBuffer", "RTAccelerationStructure",
- "FeedbackTexture2D", "FeedbackTexture2DArray"],
- /*opt=*/0, /*fake=*/0, /*isExternalType=*/1>,
- DefaultBoolArgument<"isROV", /*default=*/0>
- ];
+ let Args = [
+ EnumArgument<"ResourceClass", "llvm::hlsl::ResourceClass",
+ /*is_string=*/0, ["SRV", "UAV", "CBuffer", "Sampler"],
+ ["SRV", "UAV", "CBuffer", "Sampler"],
+ /*opt=*/0, /*fake=*/0, /*isExternalType=*/1>,
+ EnumArgument<
+ "ResourceKind", "llvm::hlsl::ResourceKind",
+ /*is_string=*/0,
+ [
+ "Texture1D", "Texture2D", "Texture2DMS", "Texture3D", "TextureCube",
+ "Texture1DArray", "Texture2DArray", "Texture2DMSArray",
+ "TextureCubeArray", "TypedBuffer", "RawBuffer", "StructuredBuffer",
+ "CBuffer", "Sampler", "TBuffer", "RTAccelerationStructure",
+ "FeedbackTexture2D", "FeedbackTexture2DArray"
+ ],
+ [
+ "Texture1D", "Texture2D", "Texture2DMS", "Texture3D", "TextureCube",
+ "Texture1DArray", "Texture2DArray", "Texture2DMSArray",
+ "TextureCubeArray", "TypedBuffer", "RawBuffer", "StructuredBuffer",
+ "CBuffer", "Sampler", "TBuffer", "RTAccelerationStructure",
+ "FeedbackTexture2D", "FeedbackTexture2DArray"
+ ],
+ /*opt=*/0, /*fake=*/0, /*isExternalType=*/1, /*isCovered=*/0>,
+ DefaultBoolArgument<"isROV", /*default=*/0>
+ ];
let Documentation = [InternalOnly];
}
diff --git a/clang/utils/TableGen/ClangAttrEmitter.cpp b/clang/utils/TableGen/ClangAttrEmitter.cpp
index 660d7b5..307334a 100644
--- a/clang/utils/TableGen/ClangAttrEmitter.cpp
+++ b/clang/utils/TableGen/ClangAttrEmitter.cpp
@@ -903,13 +903,15 @@ namespace {
StringRef shortType;
std::vector<StringRef> values, enums, uniques;
bool isExternal;
+ bool isCovered;
public:
EnumArgument(const Record &Arg, StringRef Attr)
: Argument(Arg, Attr), values(Arg.getValueAsListOfStrings("Values")),
enums(Arg.getValueAsListOfStrings("Enums")),
uniques(uniqueEnumsInOrder(enums)),
- isExternal(Arg.getValueAsBit("IsExternalType")) {
+ isExternal(Arg.getValueAsBit("IsExternalType")),
+ isCovered(Arg.getValueAsBit("IsCovered")) {
StringRef Type = Arg.getValueAsString("Type");
shortType = isExternal ? Type.rsplit("::").second : Type;
// If shortType didn't contain :: at all rsplit will give us an empty
@@ -993,7 +995,7 @@ namespace {
OS << " OS << \" " << I << "\";\n";
OS << " break;\n";
}
- if (isExternal) {
+ if (!isCovered) {
OS << " default:\n";
OS << " llvm_unreachable(\"Invalid attribute value\");\n";
}
@@ -1036,7 +1038,7 @@ namespace {
OS << " case " << fullType << "::" << enums[I] << ": return \""
<< values[I] << "\";\n";
}
- if (isExternal) {
+ if (!isCovered) {
OS << " default: llvm_unreachable(\"Invalid attribute value\");\n";
}
OS << " }\n"
@@ -1050,6 +1052,7 @@ namespace {
StringRef shortType;
std::vector<StringRef> values, enums, uniques;
bool isExternal;
+ bool isCovered;
protected:
void writeValueImpl(raw_ostream &OS) const override {
@@ -1068,7 +1071,8 @@ namespace {
values(Arg.getValueAsListOfStrings("Values")),
enums(Arg.getValueAsListOfStrings("Enums")),
uniques(uniqueEnumsInOrder(enums)),
- isExternal(Arg.getValueAsBit("IsExternalType")) {
+ isExternal(Arg.getValueAsBit("IsExternalType")),
+ isCovered(Arg.getValueAsBit("IsCovered")) {
StringRef Type = Arg.getValueAsString("Type");
shortType = isExternal ? Type.rsplit("::").second : Type;
// If shortType didn't contain :: at all rsplit will give us an empty
@@ -1111,6 +1115,10 @@ namespace {
OS << " OS << \" " << UI << "\";\n";
OS << " break;\n";
}
+ if (!isCovered) {
+ OS << " default:\n";
+ OS << " llvm_unreachable(\"Invalid attribute value\");\n";
+ }
OS << " }\n";
OS << " }\n";
}
@@ -1168,6 +1176,9 @@ namespace {
OS << " case " << fullType << "::" << enums[I] << ": return \""
<< values[I] << "\";\n";
}
+ if (!isCovered) {
+ OS << " default: llvm_unreachable(\"Invalid attribute value\");\n";
+ }
OS << " }\n"
<< " llvm_unreachable(\"No enumerator with that value\");\n"
<< "}\n";
diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLResource.h b/llvm/include/llvm/Frontend/HLSL/HLSLResource.h
index 5c22d2a..4ed742b 100644
--- a/llvm/include/llvm/Frontend/HLSL/HLSLResource.h
+++ b/llvm/include/llvm/Frontend/HLSL/HLSLResource.h
@@ -21,16 +21,8 @@ class MDNode;
namespace hlsl {
-enum class ResourceClass : uint8_t {
- SRV = 0,
- UAV,
- CBuffer,
- Sampler,
- Invalid,
- NumClasses = Invalid,
-};
-
// For now we use DXIL ABI enum values directly. This may change in the future.
+using dxil::ResourceClass;
using dxil::ElementType;
using dxil::ResourceKind;
diff --git a/llvm/include/llvm/Support/DXILABI.h b/llvm/include/llvm/Support/DXILABI.h
index da4bea8..78099ae 100644
--- a/llvm/include/llvm/Support/DXILABI.h
+++ b/llvm/include/llvm/Support/DXILABI.h
@@ -39,6 +39,13 @@ enum class ParameterKind : uint8_t {
DXILHandle,
};
+enum class ResourceClass : uint8_t {
+ SRV = 0,
+ UAV,
+ CBuffer,
+ Sampler,
+};
+
/// The kind of resource for an SRV or UAV resource. Sometimes referred to as
/// "Shape" in the DXIL docs.
enum class ResourceKind : uint32_t {