@@ -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,45 @@ 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+ 
2421+   return  mlir::LLVM::AddressOfOp::create (
2422+       rewriter, op->getLoc (),
2423+       mlir::LLVM::LLVMPointerType::get (op->getContext ()), nameAttr.getValue ());
2424+ }
2425+ 
2426+ mlir::LogicalResult CIRToLLVMVTableAddrPointOpLowering::matchAndRewrite (
2427+     cir::VTableAddrPointOp op, OpAdaptor adaptor,
2428+     mlir::ConversionPatternRewriter &rewriter) const  {
2429+   const  mlir::TypeConverter *converter = getTypeConverter ();
2430+   mlir::Type targetType = converter->convertType (op.getType ());
2431+   llvm::SmallVector<mlir::LLVM::GEPArg> offsets;
2432+   mlir::Type eltType;
2433+   mlir::Value symAddr = getValueForVTableSymbol (op, rewriter, converter,
2434+                                                 op.getNameAttr (), eltType);
2435+   offsets = llvm::SmallVector<mlir::LLVM::GEPArg>{
2436+       0 , op.getAddressPointAttr ().getIndex (),
2437+       op.getAddressPointAttr ().getOffset ()};
2438+ 
2439+   assert (eltType && " Shouldn't ever be missing an eltType here"  );
2440+   mlir::LLVM::GEPNoWrapFlags inboundsNuw =
2441+       mlir::LLVM::GEPNoWrapFlags::inbounds | mlir::LLVM::GEPNoWrapFlags::nuw;
2442+   rewriter.replaceOpWithNewOp <mlir::LLVM::GEPOp>(op, targetType, eltType,
2443+                                                  symAddr, offsets, inboundsNuw);
2444+ 
2445+   return  mlir::success ();
2446+ }
2447+ 
24032448mlir::LogicalResult CIRToLLVMStackSaveOpLowering::matchAndRewrite (
24042449    cir::StackSaveOp op, OpAdaptor adaptor,
24052450    mlir::ConversionPatternRewriter &rewriter) const  {
0 commit comments