================ @@ -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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits