@@ -2083,6 +2083,10 @@ static void prepareTypeConverter(mlir::LLVMTypeConverter &converter,
2083
2083
2084
2084
return mlir::LLVM::LLVMPointerType::get (type.getContext (), targetAS);
2085
2085
});
2086
+ converter.addConversion ([&](cir::VPtrType type) -> mlir::Type {
2087
+ assert (!cir::MissingFeatures::addressSpace ());
2088
+ return mlir::LLVM::LLVMPointerType::get (type.getContext ());
2089
+ });
2086
2090
converter.addConversion ([&](cir::ArrayType type) -> mlir::Type {
2087
2091
mlir::Type ty =
2088
2092
convertTypeForMemory (converter, dataLayout, type.getElementType ());
@@ -2314,6 +2318,7 @@ void ConvertCIRToLLVMPass::runOnOperation() {
2314
2318
CIRToLLVMSwitchFlatOpLowering,
2315
2319
CIRToLLVMTrapOpLowering,
2316
2320
CIRToLLVMUnaryOpLowering,
2321
+ CIRToLLVMUnreachableOpLowering,
2317
2322
CIRToLLVMVecCmpOpLowering,
2318
2323
CIRToLLVMVecCreateOpLowering,
2319
2324
CIRToLLVMVecExtractOpLowering,
@@ -2322,7 +2327,8 @@ void ConvertCIRToLLVMPass::runOnOperation() {
2322
2327
CIRToLLVMVecShuffleOpLowering,
2323
2328
CIRToLLVMVecSplatOpLowering,
2324
2329
CIRToLLVMVecTernaryOpLowering,
2325
- CIRToLLVMUnreachableOpLowering
2330
+ CIRToLLVMVTableAddrPointOpLowering
2331
+ // clang-format on
2326
2332
>(converter, patterns.getContext ());
2327
2333
2328
2334
processCIRAttrs (module );
@@ -2400,6 +2406,51 @@ mlir::LogicalResult CIRToLLVMTrapOpLowering::matchAndRewrite(
2400
2406
return mlir::success ();
2401
2407
}
2402
2408
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
+
2403
2454
mlir::LogicalResult CIRToLLVMStackSaveOpLowering::matchAndRewrite (
2404
2455
cir::StackSaveOp op, OpAdaptor adaptor,
2405
2456
mlir::ConversionPatternRewriter &rewriter) const {
0 commit comments