@@ -2083,6 +2083,10 @@ static void prepareTypeConverter(mlir::LLVMTypeConverter &converter,
20832083
20842084 return mlir::LLVM::LLVMPointerType::get (type.getContext (), targetAS);
20852085 });
2086+ converter.addConversion ([&](cir::VPtrType type) -> mlir::Type {
2087+ assert (!cir::MissingFeatures::addressSpace ());
2088+ return mlir::LLVM::LLVMPointerType::get (type.getContext ());
2089+ });
20862090 converter.addConversion ([&](cir::ArrayType type) -> mlir::Type {
20872091 mlir::Type ty =
20882092 convertTypeForMemory (converter, dataLayout, type.getElementType ());
@@ -2314,6 +2318,7 @@ void ConvertCIRToLLVMPass::runOnOperation() {
23142318 CIRToLLVMSwitchFlatOpLowering,
23152319 CIRToLLVMTrapOpLowering,
23162320 CIRToLLVMUnaryOpLowering,
2321+ CIRToLLVMUnreachableOpLowering,
23172322 CIRToLLVMVecCmpOpLowering,
23182323 CIRToLLVMVecCreateOpLowering,
23192324 CIRToLLVMVecExtractOpLowering,
@@ -2322,7 +2327,8 @@ void ConvertCIRToLLVMPass::runOnOperation() {
23222327 CIRToLLVMVecShuffleOpLowering,
23232328 CIRToLLVMVecSplatOpLowering,
23242329 CIRToLLVMVecTernaryOpLowering,
2325- CIRToLLVMUnreachableOpLowering
2330+ CIRToLLVMVTableAddrPointOpLowering
2331+ // clang-format on
23262332 >(converter, patterns.getContext ());
23272333
23282334 processCIRAttrs (module );
@@ -2400,6 +2406,51 @@ mlir::LogicalResult CIRToLLVMTrapOpLowering::matchAndRewrite(
24002406 return mlir::success ();
24012407}
24022408
2409+ static mlir::Value
2410+ getValueForVTableSymbol (mlir::Operation *op,
2411+ mlir::ConversionPatternRewriter &rewriter,
2412+ const mlir::TypeConverter *converter,
2413+ mlir::FlatSymbolRefAttr nameAttr, mlir::Type &eltType) {
2414+ auto module = op->getParentOfType <mlir::ModuleOp>();
2415+ mlir::Operation *symbol = mlir::SymbolTable::lookupSymbolIn (module , nameAttr);
2416+ if (auto llvmSymbol = mlir::dyn_cast<mlir::LLVM::GlobalOp>(symbol)) {
2417+ eltType = llvmSymbol.getType ();
2418+ } else if (auto cirSymbol = mlir::dyn_cast<cir::GlobalOp>(symbol)) {
2419+ eltType = converter->convertType (cirSymbol.getSymType ());
2420+ } else {
2421+ op->emitError () << " unexpected symbol type for " << symbol;
2422+ return {};
2423+ }
2424+
2425+ return mlir::LLVM::AddressOfOp::create (
2426+ rewriter, op->getLoc (),
2427+ mlir::LLVM::LLVMPointerType::get (op->getContext ()), nameAttr.getValue ());
2428+ }
2429+
2430+ mlir::LogicalResult CIRToLLVMVTableAddrPointOpLowering::matchAndRewrite (
2431+ cir::VTableAddrPointOp op, OpAdaptor adaptor,
2432+ mlir::ConversionPatternRewriter &rewriter) const {
2433+ const mlir::TypeConverter *converter = getTypeConverter ();
2434+ mlir::Type targetType = converter->convertType (op.getType ());
2435+ llvm::SmallVector<mlir::LLVM::GEPArg> offsets;
2436+ mlir::Type eltType;
2437+ mlir::Value symAddr = getValueForVTableSymbol (op, rewriter, converter,
2438+ op.getNameAttr (), eltType);
2439+ if (!symAddr)
2440+ return op.emitError () << " Unable to get value for vtable symbol" ;
2441+
2442+ offsets = llvm::SmallVector<mlir::LLVM::GEPArg>{
2443+ 0 , op.getAddressPointAttr ().getIndex (),
2444+ op.getAddressPointAttr ().getOffset ()};
2445+
2446+ assert (eltType && " Shouldn't ever be missing an eltType here" );
2447+ mlir::LLVM::GEPNoWrapFlags inboundsNuw =
2448+ mlir::LLVM::GEPNoWrapFlags::inbounds | mlir::LLVM::GEPNoWrapFlags::nuw;
2449+ rewriter.replaceOpWithNewOp <mlir::LLVM::GEPOp>(op, targetType, eltType,
2450+ symAddr, offsets, inboundsNuw);
2451+ return mlir::success ();
2452+ }
2453+
24032454mlir::LogicalResult CIRToLLVMStackSaveOpLowering::matchAndRewrite (
24042455 cir::StackSaveOp op, OpAdaptor adaptor,
24052456 mlir::ConversionPatternRewriter &rewriter) const {
0 commit comments