Skip to content

Commit 1c6c01f

Browse files
authored
[Attributes][HLSL] Teach EnumArgument to refer to an external enum (llvm#70835)
Rather than write a bunch of logic to shepherd between enums with the same sets of values, add the ability for EnumArgument to refer to an external enum in the first place.
1 parent f2c24cc commit 1c6c01f

File tree

7 files changed

+136
-155
lines changed

7 files changed

+136
-155
lines changed

clang-tools-extra/modularize/ModularizeUtilities.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ std::error_code ModularizeUtilities::loadModuleMap(
322322
// Walks the modules and collects referenced headers into
323323
// HeaderFileNames.
324324
bool ModularizeUtilities::collectModuleMapHeaders(clang::ModuleMap *ModMap) {
325-
SmallVector<std::pair<StringRef, const Module *>, 0> Vec;
325+
SmallVector<std::pair<StringRef, const clang::Module *>, 0> Vec;
326326
for (auto &M : ModMap->modules())
327327
Vec.emplace_back(M.first(), M.second);
328328
llvm::sort(Vec, llvm::less_first());
@@ -349,14 +349,14 @@ bool ModularizeUtilities::collectModuleHeaders(const clang::Module &Mod) {
349349
for (auto *Submodule : Mod.submodules())
350350
collectModuleHeaders(*Submodule);
351351

352-
if (std::optional<Module::Header> UmbrellaHeader =
352+
if (std::optional<clang::Module::Header> UmbrellaHeader =
353353
Mod.getUmbrellaHeaderAsWritten()) {
354354
std::string HeaderPath = getCanonicalPath(UmbrellaHeader->Entry.getName());
355355
// Collect umbrella header.
356356
HeaderFileNames.push_back(HeaderPath);
357357

358358
// FUTURE: When needed, umbrella header header collection goes here.
359-
} else if (std::optional<Module::DirectoryName> UmbrellaDir =
359+
} else if (std::optional<clang::Module::DirectoryName> UmbrellaDir =
360360
Mod.getUmbrellaDirAsWritten()) {
361361
// If there normal headers, assume these are umbrellas and skip collection.
362362
if (Mod.Headers->size() == 0) {

clang/include/clang/AST/Attr.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,12 @@
1919
#include "clang/AST/Type.h"
2020
#include "clang/Basic/AttrKinds.h"
2121
#include "clang/Basic/AttributeCommonInfo.h"
22-
#include "clang/Basic/LangOptions.h"
2322
#include "clang/Basic/LLVM.h"
23+
#include "clang/Basic/LangOptions.h"
2424
#include "clang/Basic/OpenMPKinds.h"
2525
#include "clang/Basic/Sanitizers.h"
2626
#include "clang/Basic/SourceLocation.h"
27+
#include "llvm/Frontend/HLSL/HLSLResource.h"
2728
#include "llvm/Support/ErrorHandling.h"
2829
#include "llvm/Support/VersionTuple.h"
2930
#include "llvm/Support/raw_ostream.h"

clang/include/clang/Basic/Attr.td

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -277,23 +277,28 @@ class DefaultIntArgument<string name, int default> : IntArgument<name, 1> {
277277
int Default = default;
278278
}
279279

280-
// This argument is more complex, it includes the enumerator type name,
281-
// a list of strings to accept, and a list of enumerators to map them to.
280+
// This argument is more complex, it includes the enumerator type
281+
// name, whether the enum type is externally defined, a list of
282+
// strings to accept, and a list of enumerators to map them to.
282283
class EnumArgument<string name, string type, list<string> values,
283-
list<string> enums, bit opt = 0, bit fake = 0>
284+
list<string> enums, bit opt = 0, bit fake = 0,
285+
bit isExternalType = 0>
284286
: Argument<name, opt, fake> {
285287
string Type = type;
286288
list<string> Values = values;
287289
list<string> Enums = enums;
290+
bit IsExternalType = isExternalType;
288291
}
289292

290293
// FIXME: There should be a VariadicArgument type that takes any other type
291294
// of argument and generates the appropriate type.
292295
class VariadicEnumArgument<string name, string type, list<string> values,
293-
list<string> enums> : Argument<name, 1> {
296+
list<string> enums, bit isExternalType = 0>
297+
: Argument<name, 1> {
294298
string Type = type;
295299
list<string> Values = values;
296300
list<string> Enums = enums;
301+
bit IsExternalType = isExternalType;
297302
}
298303

299304
// This handles one spelling of an attribute.
@@ -4182,26 +4187,26 @@ def HLSLResource : InheritableAttr {
41824187
let Spellings = [];
41834188
let Subjects = SubjectList<[Struct]>;
41844189
let LangOpts = [HLSL];
4185-
let Args = [EnumArgument<"ResourceType", "ResourceClass",
4190+
let Args = [EnumArgument<"ResourceClass", "llvm::hlsl::ResourceClass",
41864191
["SRV", "UAV", "CBuffer", "Sampler"],
4187-
["SRV", "UAV", "CBuffer", "Sampler"]
4188-
>,
4189-
EnumArgument<"ResourceShape", "ResourceKind",
4192+
["SRV", "UAV", "CBuffer", "Sampler"],
4193+
/*opt=*/0, /*fake=*/0, /*isExternalType=*/1>,
4194+
EnumArgument<"ResourceKind", "llvm::hlsl::ResourceKind",
41904195
["Texture1D", "Texture2D", "Texture2DMS",
41914196
"Texture3D", "TextureCube", "Texture1DArray",
41924197
"Texture2DArray", "Texture2DMSArray",
41934198
"TextureCubeArray", "TypedBuffer", "RawBuffer",
4194-
"StructuredBuffer", "CBufferKind", "SamplerKind",
4195-
"TBuffer", "RTAccelerationStructure", "FeedbackTexture2D",
4196-
"FeedbackTexture2DArray"],
4199+
"StructuredBuffer", "CBuffer", "Sampler",
4200+
"TBuffer", "RTAccelerationStructure",
4201+
"FeedbackTexture2D", "FeedbackTexture2DArray"],
41974202
["Texture1D", "Texture2D", "Texture2DMS",
41984203
"Texture3D", "TextureCube", "Texture1DArray",
41994204
"Texture2DArray", "Texture2DMSArray",
42004205
"TextureCubeArray", "TypedBuffer", "RawBuffer",
4201-
"StructuredBuffer", "CBufferKind", "SamplerKind",
4202-
"TBuffer", "RTAccelerationStructure", "FeedbackTexture2D",
4203-
"FeedbackTexture2DArray"]
4204-
>
4206+
"StructuredBuffer", "CBuffer", "Sampler",
4207+
"TBuffer", "RTAccelerationStructure",
4208+
"FeedbackTexture2D", "FeedbackTexture2DArray"],
4209+
/*opt=*/0, /*fake=*/0, /*isExternalType=*/1>
42054210
];
42064211
let Documentation = [InternalOnly];
42074212
}

clang/lib/CodeGen/CGHLSLRuntime.cpp

Lines changed: 3 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -223,56 +223,6 @@ void CGHLSLRuntime::addBufferResourceAnnotation(llvm::GlobalVariable *GV,
223223
ResourceMD->addOperand(Res.getMetadata());
224224
}
225225

226-
static llvm::hlsl::ResourceKind
227-
castResourceShapeToResourceKind(HLSLResourceAttr::ResourceKind RK) {
228-
switch (RK) {
229-
case HLSLResourceAttr::ResourceKind::Texture1D:
230-
return llvm::hlsl::ResourceKind::Texture1D;
231-
case HLSLResourceAttr::ResourceKind::Texture2D:
232-
return llvm::hlsl::ResourceKind::Texture2D;
233-
case HLSLResourceAttr::ResourceKind::Texture2DMS:
234-
return llvm::hlsl::ResourceKind::Texture2DMS;
235-
case HLSLResourceAttr::ResourceKind::Texture3D:
236-
return llvm::hlsl::ResourceKind::Texture3D;
237-
case HLSLResourceAttr::ResourceKind::TextureCube:
238-
return llvm::hlsl::ResourceKind::TextureCube;
239-
case HLSLResourceAttr::ResourceKind::Texture1DArray:
240-
return llvm::hlsl::ResourceKind::Texture1DArray;
241-
case HLSLResourceAttr::ResourceKind::Texture2DArray:
242-
return llvm::hlsl::ResourceKind::Texture2DArray;
243-
case HLSLResourceAttr::ResourceKind::Texture2DMSArray:
244-
return llvm::hlsl::ResourceKind::Texture2DMSArray;
245-
case HLSLResourceAttr::ResourceKind::TextureCubeArray:
246-
return llvm::hlsl::ResourceKind::TextureCubeArray;
247-
case HLSLResourceAttr::ResourceKind::TypedBuffer:
248-
return llvm::hlsl::ResourceKind::TypedBuffer;
249-
case HLSLResourceAttr::ResourceKind::RawBuffer:
250-
return llvm::hlsl::ResourceKind::RawBuffer;
251-
case HLSLResourceAttr::ResourceKind::StructuredBuffer:
252-
return llvm::hlsl::ResourceKind::StructuredBuffer;
253-
case HLSLResourceAttr::ResourceKind::CBufferKind:
254-
return llvm::hlsl::ResourceKind::CBuffer;
255-
case HLSLResourceAttr::ResourceKind::SamplerKind:
256-
return llvm::hlsl::ResourceKind::Sampler;
257-
case HLSLResourceAttr::ResourceKind::TBuffer:
258-
return llvm::hlsl::ResourceKind::TBuffer;
259-
case HLSLResourceAttr::ResourceKind::RTAccelerationStructure:
260-
return llvm::hlsl::ResourceKind::RTAccelerationStructure;
261-
case HLSLResourceAttr::ResourceKind::FeedbackTexture2D:
262-
return llvm::hlsl::ResourceKind::FeedbackTexture2D;
263-
case HLSLResourceAttr::ResourceKind::FeedbackTexture2DArray:
264-
return llvm::hlsl::ResourceKind::FeedbackTexture2DArray;
265-
}
266-
// Make sure to update HLSLResourceAttr::ResourceKind when add new Kind to
267-
// hlsl::ResourceKind. Assume FeedbackTexture2DArray is the last enum for
268-
// HLSLResourceAttr::ResourceKind.
269-
static_assert(
270-
static_cast<uint32_t>(
271-
HLSLResourceAttr::ResourceKind::FeedbackTexture2DArray) ==
272-
(static_cast<uint32_t>(llvm::hlsl::ResourceKind::NumEntries) - 2));
273-
llvm_unreachable("all switch cases should be covered");
274-
}
275-
276226
void CGHLSLRuntime::annotateHLSLResource(const VarDecl *D, GlobalVariable *GV) {
277227
const Type *Ty = D->getType()->getPointeeOrArrayElementType();
278228
if (!Ty)
@@ -284,15 +234,12 @@ void CGHLSLRuntime::annotateHLSLResource(const VarDecl *D, GlobalVariable *GV) {
284234
if (!Attr)
285235
return;
286236

287-
HLSLResourceAttr::ResourceClass RC = Attr->getResourceType();
288-
llvm::hlsl::ResourceKind RK =
289-
castResourceShapeToResourceKind(Attr->getResourceShape());
237+
llvm::hlsl::ResourceClass RC = Attr->getResourceClass();
238+
llvm::hlsl::ResourceKind RK = Attr->getResourceKind();
290239

291240
QualType QT(Ty, 0);
292241
BufferResBinding Binding(D->getAttr<HLSLResourceBindingAttr>());
293-
addBufferResourceAnnotation(GV, QT.getAsString(),
294-
static_cast<llvm::hlsl::ResourceClass>(RC), RK,
295-
Binding);
242+
addBufferResourceAnnotation(GV, QT.getAsString(), RC, RK, Binding);
296243
}
297244

298245
CGHLSLRuntime::BufferResBinding::BufferResBinding(

clang/lib/Sema/HLSLExternalSemaSource.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,8 @@ struct BuiltinTypeDeclBuilder {
115115
return addMemberVariable("h", Ty, Access);
116116
}
117117

118-
BuiltinTypeDeclBuilder &
119-
annotateResourceClass(HLSLResourceAttr::ResourceClass RC,
120-
HLSLResourceAttr::ResourceKind RK) {
118+
BuiltinTypeDeclBuilder &annotateResourceClass(ResourceClass RC,
119+
ResourceKind RK) {
121120
if (Record->isCompleteDefinition())
122121
return *this;
123122
Record->addAttr(
@@ -503,7 +502,6 @@ void HLSLExternalSemaSource::completeBufferType(CXXRecordDecl *Record) {
503502
.addHandleMember()
504503
.addDefaultHandleConstructor(*SemaPtr, ResourceClass::UAV)
505504
.addArraySubscriptOperators()
506-
.annotateResourceClass(HLSLResourceAttr::UAV,
507-
HLSLResourceAttr::TypedBuffer)
505+
.annotateResourceClass(ResourceClass::UAV, ResourceKind::TypedBuffer)
508506
.completeDefinition();
509507
}

clang/unittests/Sema/SemaNoloadLookupTest.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ class NoloadLookupConsumer : public SemaConsumer {
118118
if (!ID)
119119
return true;
120120

121-
Module *M = ID->getImportedModule();
121+
clang::Module *M = ID->getImportedModule();
122122
assert(M);
123123
if (M->Name != "R")
124124
return true;

0 commit comments

Comments
 (0)