[clang] [CIR] Add name for enum type in vtable (PR #163612)

Omar Hossam via cfe-commits cfe-commits at lists.llvm.org
Fri Oct 17 00:47:34 PDT 2025


https://github.com/moar55 updated https://github.com/llvm/llvm-project/pull/163612

>From 4590322c9c194f0f06e9d5622f9c71aad993e1b9 Mon Sep 17 00:00:00 2001
From: Omar Ibrahim <moar.ahmed at gmail.com>
Date: Wed, 15 Oct 2025 20:27:59 +0200
Subject: [PATCH 1/2] [CIR]#163601: Handle enum type

---
 clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp |  3 +-
 clang/test/CIR/CodeGen/throws.cpp             | 48 +++++++++++++++++++
 2 files changed, 49 insertions(+), 2 deletions(-)

diff --git a/clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp b/clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp
index d54d2e9cb29e5..c184d4a4b1d97 100644
--- a/clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp
@@ -950,8 +950,7 @@ const char *vTableClassNameForType(const CIRGenModule &cgm, const Type *ty) {
     break;
 
   case Type::Enum:
-    cgm.errorNYI("VTableClassNameForType: Enum");
-    break;
+    return "_ZTVN10__cxxabiv116__enum_type_infoE";
 
   case Type::Record: {
     const auto *rd = cast<CXXRecordDecl>(cast<RecordType>(ty)->getDecl())
diff --git a/clang/test/CIR/CodeGen/throws.cpp b/clang/test/CIR/CodeGen/throws.cpp
index 89cb0729c636c..d4df6b60b382d 100644
--- a/clang/test/CIR/CodeGen/throws.cpp
+++ b/clang/test/CIR/CodeGen/throws.cpp
@@ -196,3 +196,51 @@ void throw_ext_vector_type() {
 // OGCG: store <4 x i32> %[[TMP_A]], ptr %[[EXCEPTION_ADDR]], align 16
 // OGCG: call void @__cxa_throw(ptr %[[EXCEPTION_ADDR]], ptr @_ZTIDv4_i, ptr null)
 // OGCG: unreachable
+
+void throw_enum_expr() {
+  enum Test {
+    TestA,
+    TestB
+  };
+  throw Test::TestA;
+}
+
+//CIR: %[[EXCEPTION_ADDR:.*]]  = cir.alloc.exception 4 -> !cir.ptr<!u32i>
+//CIR: %[[EXCEPTION_VALUE:.*]] = cir.const #cir.int<0> : !u32i
+//CIR: cir.store{{.*}} %[[EXCEPTION_VALUE]], %[[EXCEPTION_ADDR]] : !u32i, !cir.ptr<!u32i>
+//CIR: cir.throw %[[EXCEPTION_ADDR]] : !cir.ptr<!u32i>, @_ZTIZ15throw_enum_exprvE4Test
+//CIR: cir.unreachable
+
+//LLVM: %[[EXCEPTION_ADDR:.*]] = call ptr @__cxa_allocate_exception(i64 4)
+//LLVM: store i32 0, ptr %[[EXCEPTION_ADDR]], align 16
+//LLVM: call void @__cxa_throw(ptr %[[EXCEPTION_ADDR]], ptr @_ZTIZ15throw_enum_exprvE4Test, ptr null)
+//LLVM: unreachable
+
+//OGCG: %[[EXCEPTION_ADDR:.*]]  = call ptr @__cxa_allocate_exception(i64 4)
+//OGCG: store i32 0, ptr %[[EXCEPTION_ADDR]], align 16
+//OGCG: call void @__cxa_throw(ptr %[[EXCEPTION_ADDR]], ptr @_ZTIZ15throw_enum_exprvE4Test, ptr null)
+//OGCG: unreachable
+
+void throw_enum_class_expr() {
+  enum class Test {
+    TestA,
+    TestB
+  };
+  throw Test::TestA;
+}
+
+//CIR: %[[EXCEPTION_ADDR:.*]]  = cir.alloc.exception 4 -> !cir.ptr<!s32i>
+//CIR: %[[EXCEPTION_VALUE:.*]] = cir.const #cir.int<0> : !s32i
+//CIR: cir.store{{.*}} %[[EXCEPTION_VALUE]], %[[EXCEPTION_ADDR]] : !s32i, !cir.ptr<!s32i>
+//CIR: cir.throw %[[EXCEPTION_ADDR]] : !cir.ptr<!s32i>, @_ZTIZ21throw_enum_class_exprvE4Test
+//CIR: cir.unreachable
+
+//LLVM: %[[EXCEPTION_ADDR:.*]] = call ptr @__cxa_allocate_exception(i64 4)
+//LLVM: store i32 0, ptr %[[EXCEPTION_ADDR]], align 16
+//LLVM: call void @__cxa_throw(ptr %[[EXCEPTION_ADDR]], ptr @_ZTIZ21throw_enum_class_exprvE4Test, ptr null)
+//LLVM: unreachable
+
+//OGCG: %[[EXCEPTION_ADDR:.*]]  = call ptr @__cxa_allocate_exception(i64 4)
+//OGCG: store i32 0, ptr %[[EXCEPTION_ADDR]], align 16
+//OGCG: call void @__cxa_throw(ptr %[[EXCEPTION_ADDR]], ptr @_ZTIZ21throw_enum_class_exprvE4Test, ptr null)
+//OGCG: unreachable

>From 10e23730787c75f70c479081e5ad45f4cc9018df Mon Sep 17 00:00:00 2001
From: Omar Ibrahim <moar.ahmed at gmail.com>
Date: Fri, 17 Oct 2025 09:42:59 +0200
Subject: [PATCH 2/2] address comments

---
 clang/test/CIR/CodeGen/throws.cpp | 60 +++++++++++++++----------------
 1 file changed, 30 insertions(+), 30 deletions(-)

diff --git a/clang/test/CIR/CodeGen/throws.cpp b/clang/test/CIR/CodeGen/throws.cpp
index d4df6b60b382d..53af1efc22cd4 100644
--- a/clang/test/CIR/CodeGen/throws.cpp
+++ b/clang/test/CIR/CodeGen/throws.cpp
@@ -205,21 +205,21 @@ void throw_enum_expr() {
   throw Test::TestA;
 }
 
-//CIR: %[[EXCEPTION_ADDR:.*]]  = cir.alloc.exception 4 -> !cir.ptr<!u32i>
-//CIR: %[[EXCEPTION_VALUE:.*]] = cir.const #cir.int<0> : !u32i
-//CIR: cir.store{{.*}} %[[EXCEPTION_VALUE]], %[[EXCEPTION_ADDR]] : !u32i, !cir.ptr<!u32i>
-//CIR: cir.throw %[[EXCEPTION_ADDR]] : !cir.ptr<!u32i>, @_ZTIZ15throw_enum_exprvE4Test
-//CIR: cir.unreachable
-
-//LLVM: %[[EXCEPTION_ADDR:.*]] = call ptr @__cxa_allocate_exception(i64 4)
-//LLVM: store i32 0, ptr %[[EXCEPTION_ADDR]], align 16
-//LLVM: call void @__cxa_throw(ptr %[[EXCEPTION_ADDR]], ptr @_ZTIZ15throw_enum_exprvE4Test, ptr null)
-//LLVM: unreachable
-
-//OGCG: %[[EXCEPTION_ADDR:.*]]  = call ptr @__cxa_allocate_exception(i64 4)
-//OGCG: store i32 0, ptr %[[EXCEPTION_ADDR]], align 16
-//OGCG: call void @__cxa_throw(ptr %[[EXCEPTION_ADDR]], ptr @_ZTIZ15throw_enum_exprvE4Test, ptr null)
-//OGCG: unreachable
+// CIR: %[[EXCEPTION_ADDR:.*]] = cir.alloc.exception 4 -> !cir.ptr<!u32i>
+// CIR: %[[EXCEPTION_VALUE:.*]] = cir.const #cir.int<0> : !u32i
+// CIR: cir.store{{.*}} %[[EXCEPTION_VALUE]], %[[EXCEPTION_ADDR]] : !u32i, !cir.ptr<!u32i>
+// CIR: cir.throw %[[EXCEPTION_ADDR]] : !cir.ptr<!u32i>, @_ZTIZ15throw_enum_exprvE4Test
+// CIR: cir.unreachable
+
+// LLVM: %[[EXCEPTION_ADDR:.*]] = call ptr @__cxa_allocate_exception(i64 4)
+// LLVM: store i32 0, ptr %[[EXCEPTION_ADDR]], align 16
+// LLVM: call void @__cxa_throw(ptr %[[EXCEPTION_ADDR]], ptr @_ZTIZ15throw_enum_exprvE4Test, ptr null)
+// LLVM: unreachable
+
+// OGCG: %[[EXCEPTION_ADDR:.*]] = call ptr @__cxa_allocate_exception(i64 4)
+// OGCG: store i32 0, ptr %[[EXCEPTION_ADDR]], align 16
+// OGCG: call void @__cxa_throw(ptr %[[EXCEPTION_ADDR]], ptr @_ZTIZ15throw_enum_exprvE4Test, ptr null)
+// OGCG: unreachable
 
 void throw_enum_class_expr() {
   enum class Test {
@@ -229,18 +229,18 @@ void throw_enum_class_expr() {
   throw Test::TestA;
 }
 
-//CIR: %[[EXCEPTION_ADDR:.*]]  = cir.alloc.exception 4 -> !cir.ptr<!s32i>
-//CIR: %[[EXCEPTION_VALUE:.*]] = cir.const #cir.int<0> : !s32i
-//CIR: cir.store{{.*}} %[[EXCEPTION_VALUE]], %[[EXCEPTION_ADDR]] : !s32i, !cir.ptr<!s32i>
-//CIR: cir.throw %[[EXCEPTION_ADDR]] : !cir.ptr<!s32i>, @_ZTIZ21throw_enum_class_exprvE4Test
-//CIR: cir.unreachable
-
-//LLVM: %[[EXCEPTION_ADDR:.*]] = call ptr @__cxa_allocate_exception(i64 4)
-//LLVM: store i32 0, ptr %[[EXCEPTION_ADDR]], align 16
-//LLVM: call void @__cxa_throw(ptr %[[EXCEPTION_ADDR]], ptr @_ZTIZ21throw_enum_class_exprvE4Test, ptr null)
-//LLVM: unreachable
-
-//OGCG: %[[EXCEPTION_ADDR:.*]]  = call ptr @__cxa_allocate_exception(i64 4)
-//OGCG: store i32 0, ptr %[[EXCEPTION_ADDR]], align 16
-//OGCG: call void @__cxa_throw(ptr %[[EXCEPTION_ADDR]], ptr @_ZTIZ21throw_enum_class_exprvE4Test, ptr null)
-//OGCG: unreachable
+// CIR: %[[EXCEPTION_ADDR:.*]] = cir.alloc.exception 4 -> !cir.ptr<!s32i>
+// CIR: %[[EXCEPTION_VALUE:.*]] = cir.const #cir.int<0> : !s32i
+// CIR: cir.store{{.*}} %[[EXCEPTION_VALUE]], %[[EXCEPTION_ADDR]] : !s32i, !cir.ptr<!s32i>
+// CIR: cir.throw %[[EXCEPTION_ADDR]] : !cir.ptr<!s32i>, @_ZTIZ21throw_enum_class_exprvE4Test
+// CIR: cir.unreachable
+
+// LLVM: %[[EXCEPTION_ADDR:.*]] = call ptr @__cxa_allocate_exception(i64 4)
+// LLVM: store i32 0, ptr %[[EXCEPTION_ADDR]], align 16
+// LLVM: call void @__cxa_throw(ptr %[[EXCEPTION_ADDR]], ptr @_ZTIZ21throw_enum_class_exprvE4Test, ptr null)
+// LLVM: unreachable
+
+// OGCG: %[[EXCEPTION_ADDR:.*]] = call ptr @__cxa_allocate_exception(i64 4)
+// OGCG: store i32 0, ptr %[[EXCEPTION_ADDR]], align 16
+// OGCG: call void @__cxa_throw(ptr %[[EXCEPTION_ADDR]], ptr @_ZTIZ21throw_enum_class_exprvE4Test, ptr null)
+// OGCG: unreachable



More information about the cfe-commits mailing list