@@ -566,6 +566,36 @@ lowerCirAttrAsValue(mlir::Operation *parentOp, cir::ConstVectorAttr constVec,
566
566
mlirValues));
567
567
}
568
568
569
+ static void lookupGlobalSymbolInfo (mlir::ModuleOp module,
570
+ mlir::FlatSymbolRefAttr symbolRef,
571
+ mlir::Type *sourceType,
572
+ unsigned *sourceAddrSpace,
573
+ llvm::StringRef *symName,
574
+ mlir::ConversionPatternRewriter &rewriter,
575
+ const mlir::TypeConverter &converter) {
576
+ auto *sourceSymbol = mlir::SymbolTable::lookupSymbolIn (module, symbolRef);
577
+ if (auto llvmSymbol = dyn_cast<mlir::LLVM::GlobalOp>(sourceSymbol)) {
578
+ *sourceType = llvmSymbol.getType ();
579
+ *symName = llvmSymbol.getSymName ();
580
+ *sourceAddrSpace = llvmSymbol.getAddrSpace ();
581
+ } else if (auto cirSymbol = dyn_cast<cir::GlobalOp>(sourceSymbol)) {
582
+ *sourceType = converter.convertType (cirSymbol.getSymType ());
583
+ *symName = cirSymbol.getSymName ();
584
+ *sourceAddrSpace =
585
+ getGlobalOpTargetAddrSpace (rewriter, &converter, cirSymbol);
586
+ } else if (auto llvmFun = dyn_cast<mlir::LLVM::LLVMFuncOp>(sourceSymbol)) {
587
+ *sourceType = llvmFun.getFunctionType ();
588
+ *symName = llvmFun.getSymName ();
589
+ *sourceAddrSpace = 0 ;
590
+ } else if (auto fun = dyn_cast<cir::FuncOp>(sourceSymbol)) {
591
+ *sourceType = converter.convertType (fun.getFunctionType ());
592
+ *symName = fun.getSymName ();
593
+ *sourceAddrSpace = 0 ;
594
+ } else {
595
+ llvm_unreachable (" Unexpected GlobalOp type" );
596
+ }
597
+ }
598
+
569
599
// GlobalViewAttr visitor.
570
600
static mlir::Value
571
601
lowerCirAttrAsValue (mlir::Operation *parentOp, cir::GlobalViewAttr globalAttr,
@@ -575,28 +605,8 @@ lowerCirAttrAsValue(mlir::Operation *parentOp, cir::GlobalViewAttr globalAttr,
575
605
mlir::Type sourceType;
576
606
unsigned sourceAddrSpace = 0 ;
577
607
llvm::StringRef symName;
578
- auto *sourceSymbol =
579
- mlir::SymbolTable::lookupSymbolIn (module, globalAttr.getSymbol ());
580
- if (auto llvmSymbol = dyn_cast<mlir::LLVM::GlobalOp>(sourceSymbol)) {
581
- sourceType = llvmSymbol.getType ();
582
- symName = llvmSymbol.getSymName ();
583
- sourceAddrSpace = llvmSymbol.getAddrSpace ();
584
- } else if (auto cirSymbol = dyn_cast<cir::GlobalOp>(sourceSymbol)) {
585
- sourceType = converter->convertType (cirSymbol.getSymType ());
586
- symName = cirSymbol.getSymName ();
587
- sourceAddrSpace =
588
- getGlobalOpTargetAddrSpace (rewriter, converter, cirSymbol);
589
- } else if (auto llvmFun = dyn_cast<mlir::LLVM::LLVMFuncOp>(sourceSymbol)) {
590
- sourceType = llvmFun.getFunctionType ();
591
- symName = llvmFun.getSymName ();
592
- sourceAddrSpace = 0 ;
593
- } else if (auto fun = dyn_cast<cir::FuncOp>(sourceSymbol)) {
594
- sourceType = converter->convertType (fun.getFunctionType ());
595
- symName = fun.getSymName ();
596
- sourceAddrSpace = 0 ;
597
- } else {
598
- llvm_unreachable (" Unexpected GlobalOp type" );
599
- }
608
+ lookupGlobalSymbolInfo (module, globalAttr.getSymbol (), &sourceType,
609
+ &sourceAddrSpace, &symName, rewriter, *converter);
600
610
601
611
auto loc = parentOp->getLoc ();
602
612
mlir::Value addrOp = rewriter.create <mlir::LLVM::AddressOfOp>(
@@ -637,36 +647,53 @@ lowerCirAttrAsValue(mlir::Operation *parentOp, cir::GlobalViewAttr globalAttr,
637
647
addrOp);
638
648
}
639
649
650
+ // GlobalViewAddr visitor.
651
+ static mlir::Value
652
+ lowerCirAttrAsValue (mlir::Operation *parentOp, cir::GlobalAddrAttr globalAttr,
653
+ mlir::ConversionPatternRewriter &rewriter,
654
+ const mlir::TypeConverter *converter) {
655
+ auto module = parentOp->getParentOfType <mlir::ModuleOp>();
656
+ mlir::Type sourceType;
657
+ unsigned sourceAddrSpace = 0 ;
658
+ llvm::StringRef symName;
659
+ lookupGlobalSymbolInfo (module, globalAttr.getSymbol (), &sourceType,
660
+ &sourceAddrSpace, &symName, rewriter, *converter);
661
+
662
+ auto loc = parentOp->getLoc ();
663
+ auto addrTy =
664
+ mlir::LLVM::LLVMPointerType::get (rewriter.getContext (), sourceAddrSpace);
665
+ mlir::Value addrOp =
666
+ rewriter.create <mlir::LLVM::AddressOfOp>(loc, addrTy, symName);
667
+
668
+ auto llvmDstTy = converter->convertType (globalAttr.getType ());
669
+ return rewriter.create <mlir::LLVM::PtrToIntOp>(parentOp->getLoc (), llvmDstTy,
670
+ addrOp);
671
+ }
672
+
640
673
// / Switches on the type of attribute and calls the appropriate conversion.
641
674
mlir::Value lowerCirAttrAsValue (mlir::Operation *parentOp, mlir::Attribute attr,
642
675
mlir::ConversionPatternRewriter &rewriter,
643
676
const mlir::TypeConverter *converter) {
644
- if (const auto intAttr = mlir::dyn_cast<cir::IntAttr>(attr))
645
- return lowerCirAttrAsValue (parentOp, intAttr, rewriter, converter);
646
- if (const auto fltAttr = mlir::dyn_cast<cir::FPAttr>(attr))
647
- return lowerCirAttrAsValue (parentOp, fltAttr, rewriter, converter);
648
- if (const auto ptrAttr = mlir::dyn_cast<cir::ConstPtrAttr>(attr))
649
- return lowerCirAttrAsValue (parentOp, ptrAttr, rewriter, converter);
650
- if (const auto constStruct = mlir::dyn_cast<cir::ConstStructAttr>(attr))
651
- return lowerCirAttrAsValue (parentOp, constStruct, rewriter, converter);
652
- if (const auto constArr = mlir::dyn_cast<cir::ConstArrayAttr>(attr))
653
- return lowerCirAttrAsValue (parentOp, constArr, rewriter, converter);
654
- if (const auto constVec = mlir::dyn_cast<cir::ConstVectorAttr>(attr))
655
- return lowerCirAttrAsValue (parentOp, constVec, rewriter, converter);
656
- if (const auto boolAttr = mlir::dyn_cast<cir::BoolAttr>(attr))
657
- return lowerCirAttrAsValue (parentOp, boolAttr, rewriter, converter);
658
- if (const auto zeroAttr = mlir::dyn_cast<cir::ZeroAttr>(attr))
659
- return lowerCirAttrAsValue (parentOp, zeroAttr, rewriter, converter);
660
- if (const auto undefAttr = mlir::dyn_cast<cir::UndefAttr>(attr))
661
- return lowerCirAttrAsValue (parentOp, undefAttr, rewriter, converter);
662
- if (const auto poisonAttr = mlir::dyn_cast<cir::PoisonAttr>(attr))
663
- return lowerCirAttrAsValue (parentOp, poisonAttr, rewriter, converter);
664
- if (const auto globalAttr = mlir::dyn_cast<cir::GlobalViewAttr>(attr))
665
- return lowerCirAttrAsValue (parentOp, globalAttr, rewriter, converter);
666
- if (const auto vtableAttr = mlir::dyn_cast<cir::VTableAttr>(attr))
667
- return lowerCirAttrAsValue (parentOp, vtableAttr, rewriter, converter);
668
- if (const auto typeinfoAttr = mlir::dyn_cast<cir::TypeInfoAttr>(attr))
669
- return lowerCirAttrAsValue (parentOp, typeinfoAttr, rewriter, converter);
677
+ #define LOWER_CIR_ATTR (type ) \
678
+ if (const auto castedAttr = mlir::dyn_cast<type>(attr)) \
679
+ return lowerCirAttrAsValue (parentOp, castedAttr, rewriter, converter);
680
+
681
+ LOWER_CIR_ATTR (cir::BoolAttr)
682
+ LOWER_CIR_ATTR (cir::ConstArrayAttr)
683
+ LOWER_CIR_ATTR (cir::ConstPtrAttr)
684
+ LOWER_CIR_ATTR (cir::ConstStructAttr)
685
+ LOWER_CIR_ATTR (cir::ConstVectorAttr)
686
+ LOWER_CIR_ATTR (cir::FPAttr)
687
+ LOWER_CIR_ATTR (cir::GlobalAddrAttr)
688
+ LOWER_CIR_ATTR (cir::GlobalViewAttr)
689
+ LOWER_CIR_ATTR (cir::IntAttr)
690
+ LOWER_CIR_ATTR (cir::PoisonAttr)
691
+ LOWER_CIR_ATTR (cir::TypeInfoAttr)
692
+ LOWER_CIR_ATTR (cir::UndefAttr)
693
+ LOWER_CIR_ATTR (cir::VTableAttr)
694
+ LOWER_CIR_ATTR (cir::ZeroAttr)
695
+
696
+ #undef LOWER_CIR_ATTR
670
697
671
698
llvm_unreachable (" unhandled attribute type" );
672
699
}
@@ -1663,6 +1690,13 @@ mlir::LogicalResult CIRToLLVMConstantOpLowering::matchAndRewrite(
1663
1690
attr = rewriter.getIntegerAttr (typeConverter->convertType (op.getType ()),
1664
1691
value);
1665
1692
} else if (mlir::isa<cir::IntType>(op.getType ())) {
1693
+ // Lower GlobalAddrAttr to llvm.mlir.addressof + llvm.mlir.ptrtoint
1694
+ if (auto ga = mlir::dyn_cast<cir::GlobalAddrAttr>(op.getValue ())) {
1695
+ auto newOp = lowerCirAttrAsValue (op, ga, rewriter, getTypeConverter ());
1696
+ rewriter.replaceOp (op, newOp);
1697
+ return mlir::success ();
1698
+ }
1699
+
1666
1700
attr = rewriter.getIntegerAttr (
1667
1701
typeConverter->convertType (op.getType ()),
1668
1702
mlir::cast<cir::IntAttr>(op.getValue ()).getValue ());
@@ -2348,6 +2382,11 @@ mlir::LogicalResult CIRToLLVMGlobalOpLowering::matchAndRewrite(
2348
2382
rewriter.create <mlir::LLVM::ReturnOp>(
2349
2383
loc, lowerCirAttrAsValue (op, attr, rewriter, typeConverter));
2350
2384
return mlir::success ();
2385
+ } else if (auto attr = mlir::dyn_cast<cir::GlobalAddrAttr>(init.value ())) {
2386
+ setupRegionInitializedLLVMGlobalOp (op, rewriter);
2387
+ rewriter.create <mlir::LLVM::ReturnOp>(
2388
+ loc, lowerCirAttrAsValue (op, attr, rewriter, typeConverter));
2389
+ return mlir::success ();
2351
2390
} else if (const auto vtableAttr =
2352
2391
mlir::dyn_cast<cir::VTableAttr>(init.value ())) {
2353
2392
setupRegionInitializedLLVMGlobalOp (op, rewriter);
0 commit comments