@@ -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