[clang] [clang-tools-extra] [Attributes][HLSL] Teach EnumArgument to refer to an external enum (PR #70835)
Justin Bogner via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 31 11:46:22 PDT 2023
================
@@ -930,77 +936,83 @@ namespace {
OS << getLowerName() << "(" << getUpperName() << ")";
}
void writeCtorDefaultInitializers(raw_ostream &OS) const override {
- OS << getLowerName() << "(" << type << "(0))";
+ OS << getLowerName() << "(" << fullType << "(0))";
}
void writeCtorParameters(raw_ostream &OS) const override {
- OS << type << " " << getUpperName();
+ OS << fullType << " " << getUpperName();
}
void writeDeclarations(raw_ostream &OS) const override {
- auto i = uniques.cbegin(), e = uniques.cend();
- // The last one needs to not have a comma.
- --e;
+ if (!isExternal) {
+ auto i = uniques.cbegin(), e = uniques.cend();
+ // The last one needs to not have a comma.
+ --e;
+
+ OS << "public:\n";
+ OS << " enum " << shortType << " {\n";
+ for (; i != e; ++i)
+ OS << " " << *i << ",\n";
+ OS << " " << *e << "\n";
+ OS << " };\n";
+ }
- OS << "public:\n";
- OS << " enum " << type << " {\n";
- for (; i != e; ++i)
- OS << " " << *i << ",\n";
- OS << " " << *e << "\n";
- OS << " };\n";
OS << "private:\n";
- OS << " " << type << " " << getLowerName() << ";";
+ OS << " " << fullType << " " << getLowerName() << ";";
}
void writePCHReadDecls(raw_ostream &OS) const override {
- OS << " " << getAttrName() << "Attr::" << type << " " << getLowerName()
- << "(static_cast<" << getAttrName() << "Attr::" << type
- << ">(Record.readInt()));\n";
+ OS << " " << fullType << " " << getLowerName()
+ << "(static_cast<" << fullType << ">(Record.readInt()));\n";
}
void writePCHReadArgs(raw_ostream &OS) const override {
OS << getLowerName();
}
void writePCHWrite(raw_ostream &OS) const override {
- OS << "Record.push_back(SA->get" << getUpperName() << "());\n";
+ OS << "Record.push_back(static_cast<uint64_t>(SA->get" << getUpperName()
+ << "()));\n";
}
void writeValue(raw_ostream &OS) const override {
// FIXME: this isn't 100% correct -- some enum arguments require printing
// as a string literal, while others require printing as an identifier.
// Tablegen currently does not distinguish between the two forms.
- OS << "\\\"\" << " << getAttrName() << "Attr::Convert" << type << "ToStr(get"
- << getUpperName() << "()) << \"\\\"";
+ OS << "\\\"\" << " << getAttrName() << "Attr::Convert" << shortType
+ << "ToStr(get" << getUpperName() << "()) << \"\\\"";
}
void writeDump(raw_ostream &OS) const override {
OS << " switch(SA->get" << getUpperName() << "()) {\n";
for (const auto &I : uniques) {
- OS << " case " << getAttrName() << "Attr::" << I << ":\n";
+ OS << " case " << fullType << "::" << I << ":\n";
OS << " OS << \" " << I << "\";\n";
OS << " break;\n";
}
+ if (isExternal) {
+ OS << " default:\n";
+ OS << " llvm_unreachable(\"Invalid attribute value\");\n";
+ }
----------------
bogner wrote:
It's used in [clang::TextNodeDumper](https://clang.llvm.org/doxygen/classclang_1_1TextNodeDumper.html). I'm not really familiar what that's used for, but it doesn't look like it would be easy to use return here, as it goes through each attribute in order:
```c++
void VisitHLSLResourceAttr(const HLSLResourceAttr *A) {
const auto *SA = cast<HLSLResourceAttr>(A); (void)SA;
switch(SA->getResourceClass()) {
case llvm::hlsl::ResourceClass::SRV:
OS << " SRV";
break;
case llvm::hlsl::ResourceClass::UAV:
OS << " UAV";
break;
case llvm::hlsl::ResourceClass::CBuffer:
OS << " CBuffer";
break;
case llvm::hlsl::ResourceClass::Sampler:
OS << " Sampler";
break;
default:
llvm_unreachable("Invalid attribute value");
}
switch(SA->getResourceKind()) {
case llvm::hlsl::ResourceKind::Texture1D:
OS << " Texture1D";
break;
case llvm::hlsl::ResourceKind::Texture2D:
OS << " Texture2D";
break;
...
```
https://github.com/llvm/llvm-project/pull/70835
More information about the cfe-commits
mailing list