https://github.com/andykaylor updated 
https://github.com/llvm/llvm-project/pull/155031

>From fd0bd309c13adba6966cfafbc884cb378e0212c4 Mon Sep 17 00:00:00 2001
From: Andy Kaylor <akay...@nvidia.com>
Date: Fri, 22 Aug 2025 14:23:50 -0700
Subject: [PATCH 1/2] [CIR] Add verifier for vtable initializer

This adds verification for the initializer, if present, of any global
passed to the `cir.vtable.address_point` op.
---
 clang/include/clang/CIR/MissingFeatures.h |  1 -
 clang/lib/CIR/Dialect/IR/CIRDialect.cpp   |  6 ++++--
 clang/test/CIR/IR/invalid-vtable.cir      | 11 +++++++++++
 3 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/clang/include/clang/CIR/MissingFeatures.h 
b/clang/include/clang/CIR/MissingFeatures.h
index e2326b1031765..d7a2e49ec162a 100644
--- a/clang/include/clang/CIR/MissingFeatures.h
+++ b/clang/include/clang/CIR/MissingFeatures.h
@@ -273,7 +273,6 @@ struct MissingFeatures {
   static bool thunks() { return false; }
   static bool tryEmitAsConstant() { return false; }
   static bool typeChecks() { return false; }
-  static bool vtableInitializer() { return false; }
   static bool weakRefReference() { return false; }
   static bool writebacks() { return false; }
   static bool appleKext() { return false; }
diff --git a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp 
b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
index b5d4be8da64ab..05a6a7f5eb144 100644
--- a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
+++ b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
@@ -1460,14 +1460,16 @@ 
cir::VTableAddrPointOp::verifySymbolUses(SymbolTableCollection &symbolTable) {
 
   // Verify that the result type underlying pointer type matches the type of
   // the referenced cir.global or cir.func op.
-  auto op = symbolTable.lookupNearestSymbolFrom<GlobalOp>(*this, 
getNameAttr());
+  auto op = symbolTable.lookupNearestSymbolFrom<cir::GlobalOp>(*this, 
getNameAttr());
   if (!op)
     return emitOpError("'")
            << name << "' does not reference a valid cir.global";
   std::optional<mlir::Attribute> init = op.getInitialValue();
   if (!init)
     return success();
-  assert(!cir::MissingFeatures::vtableInitializer());
+  if (!isa<cir::VTableAttr>(*init))
+    return emitOpError("Expected #cir.vtable in initializer for global '")
+           << name << "'";
   return success();
 }
 
diff --git a/clang/test/CIR/IR/invalid-vtable.cir 
b/clang/test/CIR/IR/invalid-vtable.cir
index 60aa9b29e2677..41ddd4c2419be 100644
--- a/clang/test/CIR/IR/invalid-vtable.cir
+++ b/clang/test/CIR/IR/invalid-vtable.cir
@@ -10,6 +10,17 @@ cir.func @reference_unknown_vtable() {
 
 // -----
 
+!u8i = !cir.int<u, 8>
+!u32i = !cir.int<u, 32>
+cir.global linkonce_odr @_ZTT1D = #cir.const_array<[#cir.global_view<@_ZTV1D, 
[0 : i32, 3 : i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTC1D0_1B, [0 : i32, 3 
: i32]> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 2>
+cir.func @reference_unknown_vtable() {
+  // expected-error @below {{Expected #cir.vtable in initializer for global 
'_ZTT1D'}}
+  %0 = cir.vtable.address_point(@_ZTT1D, address_point = <index = 0, offset = 
2>) : !cir.vptr
+  cir.return
+}
+
+// -----
+
 !rec_S = !cir.record<struct "S" {!cir.vptr}>
 !u8i = !cir.int<u, 8>
 !rec_anon_struct = !cir.record<struct {!cir.array<!cir.ptr<!u8i> x 4>}>

>From 5acbe963702d275a92283b5162512eae2bf0c679 Mon Sep 17 00:00:00 2001
From: Andy Kaylor <akay...@nvidia.com>
Date: Fri, 22 Aug 2025 14:31:04 -0700
Subject: [PATCH 2/2] Fix formatting

---
 clang/lib/CIR/Dialect/IR/CIRDialect.cpp | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp 
b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
index 05a6a7f5eb144..8c53939e89d01 100644
--- a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
+++ b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
@@ -1459,8 +1459,9 @@ 
cir::VTableAddrPointOp::verifySymbolUses(SymbolTableCollection &symbolTable) {
   StringRef name = getName();
 
   // Verify that the result type underlying pointer type matches the type of
-  // the referenced cir.global or cir.func op.
-  auto op = symbolTable.lookupNearestSymbolFrom<cir::GlobalOp>(*this, 
getNameAttr());
+  // the referenced cir.global.
+  auto op =
+      symbolTable.lookupNearestSymbolFrom<cir::GlobalOp>(*this, getNameAttr());
   if (!op)
     return emitOpError("'")
            << name << "' does not reference a valid cir.global";

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to