[llvm] [Offload] Make EnumValueRec::getTaggedType() optional (PR #147998)

Kenneth Benzie via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 10 09:37:10 PDT 2025


https://github.com/kbenzie created https://github.com/llvm/llvm-project/pull/147998

Not all `EnumValue`s specify a tagged type, this patch reflects that in the record definitions whilst also including the tagged type in the docs when it is specified.


>From 5649d6ac31c5d8d9241928e333b19ad65a0bb8f2 Mon Sep 17 00:00:00 2001
From: "Kenneth Benzie (Benie)" <k.benzie83 at gmail.com>
Date: Thu, 10 Jul 2025 17:33:18 +0100
Subject: [PATCH] [Offload] Make EnumValueRec::getTaggedType() optional

Not all `EnumValue`s specify a tagged type, this patch reflects that in
the record definitions whilst also including the tagged type in the docs
when it is specified.
---
 offload/tools/offload-tblgen/DocGen.cpp      |  6 ++++-
 offload/tools/offload-tblgen/PrintGen.cpp    | 24 +++++++++++---------
 offload/tools/offload-tblgen/RecordTypes.hpp |  4 ++--
 3 files changed, 20 insertions(+), 14 deletions(-)

diff --git a/offload/tools/offload-tblgen/DocGen.cpp b/offload/tools/offload-tblgen/DocGen.cpp
index 29d00cb3b5098..c9899f7e72748 100644
--- a/offload/tools/offload-tblgen/DocGen.cpp
+++ b/offload/tools/offload-tblgen/DocGen.cpp
@@ -86,7 +86,11 @@ void processEnum(const EnumRec &E, raw_ostream &OS) {
   for (const EnumValueRec Etor : E.getValues()) {
     OS << formatv("  .. c:enumerator:: {0}_{1}\n\n", E.getEnumValNamePrefix(),
                   Etor.getName());
-    OS << "    " << Etor.getDesc() << "\n\n";
+    OS << "    ";
+    if (Etor.getTaggedType()) {
+      OS << ":c:expr:`" << *Etor.getTaggedType() << "` — ";
+    }
+    OS << Etor.getDesc() << "\n\n";
   }
 }
 
diff --git a/offload/tools/offload-tblgen/PrintGen.cpp b/offload/tools/offload-tblgen/PrintGen.cpp
index d1189688a90a3..98f51b0a1a3e1 100644
--- a/offload/tools/offload-tblgen/PrintGen.cpp
+++ b/offload/tools/offload-tblgen/PrintGen.cpp
@@ -71,19 +71,21 @@ inline void printTagged(llvm::raw_ostream &os, const void *ptr, {0} value, size_
     auto Type = Val.getTaggedType();
     OS << formatv(TAB_1 "case {0}: {{\n", Name);
     // Special case for strings
-    if (Type == "char[]") {
-      OS << formatv(TAB_2 "printPtr(os, (const char*) ptr);\n");
-    } else {
-      OS << formatv(TAB_2 "const {0} * const tptr = (const {0} * const)ptr;\n",
-                    Type);
-      // TODO: Handle other cases here
-      OS << TAB_2 "os << (const void *)tptr << \" (\";\n";
-      if (Type.ends_with("*")) {
-        OS << TAB_2 "os << printPtr(os, tptr);\n";
+    if (Type) {
+      if (Type == "char[]") {
+        OS << formatv(TAB_2 "printPtr(os, (const char*) ptr);\n");
       } else {
-        OS << TAB_2 "os << *tptr;\n";
+        OS << formatv(
+            TAB_2 "const {0} * const tptr = (const {0} * const)ptr;\n", Type);
+        // TODO: Handle other cases here
+        OS << TAB_2 "os << (const void *)tptr << \" (\";\n";
+        if (Type->ends_with("*")) {
+          OS << TAB_2 "os << printPtr(os, tptr);\n";
+        } else {
+          OS << TAB_2 "os << *tptr;\n";
+        }
+        OS << TAB_2 "os << \")\";\n";
       }
-      OS << TAB_2 "os << \")\";\n";
     }
     OS << formatv(TAB_2 "break;\n" TAB_1 "}\n");
   }
diff --git a/offload/tools/offload-tblgen/RecordTypes.hpp b/offload/tools/offload-tblgen/RecordTypes.hpp
index 65c0a4ce4a2c7..c63876bc346da 100644
--- a/offload/tools/offload-tblgen/RecordTypes.hpp
+++ b/offload/tools/offload-tblgen/RecordTypes.hpp
@@ -66,8 +66,8 @@ class EnumValueRec {
   explicit EnumValueRec(const Record *rec) : rec(rec) {}
   std::string getName() const { return rec->getValueAsString("name").upper(); }
   StringRef getDesc() const { return rec->getValueAsString("desc"); }
-  StringRef getTaggedType() const {
-    return rec->getValueAsString("tagged_type");
+  std::optional<StringRef> getTaggedType() const {
+    return rec->getValueAsOptionalString("tagged_type");
   }
 
 private:



More information about the llvm-commits mailing list