[clang] [CIR] Add CIR vtable attribute (PR #154415)
Bruno Cardoso Lopes via cfe-commits
cfe-commits at lists.llvm.org
Wed Aug 20 15:52:00 PDT 2025
================
@@ -496,6 +496,72 @@ def CIR_GlobalViewAttr : CIR_Attr<"GlobalView", "global_view", [
}];
}
+//===----------------------------------------------------------------------===//
+// VTableAttr
+//===----------------------------------------------------------------------===//
+
+def CIR_VTableAttr : CIR_Attr<"VTable", "vtable", [TypedAttrInterface]> {
+ let summary = "Represents a C++ vtable";
+ let description = [{
+ Wraps a #cir.const_record containing one or more vtable arrays.
+
+ In most cases, the anonymous record type wrapped by this attribute will
+ contain a single array corresponding to the vtable for one class. However,
+ in the case of multiple inheritence, the anonymous structure may contain
+ multiple arrays, each of which is a vtable.
+
+ Example 1 (single vtable):
+ ```mlir
+ cir.global linkonce_odr @_ZTV6Mother =
+ #cir.vtable<{
+ #cir.const_array<[
+ #cir.ptr<null> : !cir.ptr<!u8i>,
+ #cir.global_view<@_ZTI6Mother> : !cir.ptr<!u8i>,
+ #cir.global_view<@_ZN6Mother9MotherFooEv> : !cir.ptr<!u8i>,
+ #cir.global_view<@_ZN6Mother10MotherFoo2Ev> : !cir.ptr<!u8i>
+ ]> : !cir.array<!cir.ptr<!u8i> x 4>
+ }> : !rec_anon_struct1
+ ```
+
+ Example 2 (multiple vtables):
+ ```mlir
+ cir.global linkonce_odr @_ZTV5Child =
+ #cir.vtable<{
+ #cir.const_array<[
+ #cir.ptr<null> : !cir.ptr<!u8i>,
+ #cir.global_view<@_ZTI5Child> : !cir.ptr<!u8i>,
+ #cir.global_view<@_ZN5Child9MotherFooEv> : !cir.ptr<!u8i>,
+ #cir.global_view<@_ZN6Mother10MotherFoo2Ev> : !cir.ptr<!u8i>
+ ]> : !cir.array<!cir.ptr<!u8i> x 4>,
+ #cir.const_array<[
+ #cir.ptr<-8 : i64> : !cir.ptr<!u8i>,
+ #cir.global_view<@_ZTI5Child> : !cir.ptr<!u8i>,
+ #cir.global_view<@_ZN6Father9FatherFooEv> : !cir.ptr<!u8i>
+ ]> : !cir.array<!cir.ptr<!u8i> x 3>
+ }> : !rec_anon_struct2
+ ```
+ }];
+
+ // `vtable_data` is a const record with one element, containing an array of
+ // vtable information.
+ let parameters = (ins
+ AttributeSelfTypeParameter<"">:$type,
+ "mlir::ArrayAttr":$vtable_data
----------------
bcardosolopes wrote:
Should we just call this one `data` instead of `vtable_data`? To use the param you need the casted attribute anyways, so repeating the name might not help much here.
https://github.com/llvm/llvm-project/pull/154415
More information about the cfe-commits
mailing list