[clang] [CIR] Add support for emitting multi-vtables (PR #155027)
Erich Keane via cfe-commits
cfe-commits at lists.llvm.org
Mon Aug 25 06:49:29 PDT 2025
================
@@ -144,33 +144,29 @@ void CIRGenVTables::createVTableInitializer(cir::GlobalOp &vtableOp,
layout.getAddressPointIndices();
unsigned nextVTableThunkIndex = 0;
- if (layout.getNumVTables() > 1)
- cgm.errorNYI("emitVTableDefinitions: multiple vtables");
-
- // We'll need a loop here to handle multiple vtables, but for now we only
- // support one.
- unsigned vtableIndex = 0;
- size_t vtableStart = layout.getVTableOffset(vtableIndex);
- size_t vtableEnd = vtableStart + layout.getVTableSize(vtableIndex);
-
- // Build a ConstArrayAttr of the vtable components.
- llvm::SmallVector<mlir::Attribute> components;
- for (size_t componentIndex = vtableStart; componentIndex < vtableEnd;
- ++componentIndex) {
- components.push_back(
- getVTableComponent(layout, componentIndex, rtti, nextVTableThunkIndex,
- addressPoints[vtableIndex], vtableHasLocalLinkage));
- }
-
mlir::MLIRContext *mlirContext = &cgm.getMLIRContext();
- // Create a ConstArrayAttr to hold the components.
- auto arr = cir::ConstArrayAttr::get(
- cir::ArrayType::get(componentType, components.size()),
- mlir::ArrayAttr::get(mlirContext, components));
+ SmallVector<mlir::Attribute> vtables;
+ for (auto [vtableIndex, addressPoint] : llvm::enumerate(addressPoints)) {
+ // Build a ConstArrayAttr of the vtable components.
+ size_t vtableStart = layout.getVTableOffset(vtableIndex);
+ size_t vtableEnd = vtableStart + layout.getVTableSize(vtableIndex);
+ llvm::SmallVector<mlir::Attribute> components;
----------------
erichkeane wrote:
>llvm::SmallVector<mlir::Attribute, num_components>
THAT wouldn't work, since vtableStart/vtableEnd aren't constant expressions. But a `.reserve` isn't a terrible idea. That said, our growth rate and slab allocator makes reserve not particularly valuable for SmallVector.
https://github.com/llvm/llvm-project/pull/155027
More information about the cfe-commits
mailing list