@@ -1521,28 +1521,6 @@ bool hasTrailingZeros(cir::ConstArrayAttr attr) {
1521
1521
}));
1522
1522
}
1523
1523
1524
- static mlir::Attribute
1525
- lowerDataMemberAttr (mlir::ModuleOp moduleOp, cir::DataMemberAttr attr,
1526
- const mlir::TypeConverter &typeConverter) {
1527
- mlir::DataLayout layout{moduleOp};
1528
-
1529
- uint64_t memberOffset;
1530
- if (attr.isNullPtr ()) {
1531
- // TODO(cir): the numerical value of a null data member pointer is
1532
- // ABI-specific and should be queried through ABI.
1533
- assert (!MissingFeatures::targetCodeGenInfoGetNullPointer ());
1534
- memberOffset = -1ull ;
1535
- } else {
1536
- auto memberIndex = attr.getMemberIndex ().value ();
1537
- memberOffset =
1538
- attr.getType ().getClsTy ().getElementOffset (layout, memberIndex);
1539
- }
1540
-
1541
- auto underlyingIntTy = mlir::IntegerType::get (
1542
- moduleOp->getContext (), layout.getTypeSizeInBits (attr.getType ()));
1543
- return mlir::IntegerAttr::get (underlyingIntTy, memberOffset);
1544
- }
1545
-
1546
1524
mlir::LogicalResult CIRToLLVMConstantOpLowering::matchAndRewrite (
1547
1525
cir::ConstantOp op, OpAdaptor adaptor,
1548
1526
mlir::ConversionPatternRewriter &rewriter) const {
@@ -1602,9 +1580,13 @@ mlir::LogicalResult CIRToLLVMConstantOpLowering::matchAndRewrite(
1602
1580
}
1603
1581
attr = op.getValue ();
1604
1582
} else if (mlir::isa<cir::DataMemberType>(op.getType ())) {
1583
+ assert (lowerMod && " lower module is not available" );
1605
1584
auto dataMember = mlir::cast<cir::DataMemberAttr>(op.getValue ());
1606
- attr = lowerDataMemberAttr (op->getParentOfType <mlir::ModuleOp>(),
1607
- dataMember, *typeConverter);
1585
+ mlir::DataLayout layout (op->getParentOfType <mlir::ModuleOp>());
1586
+ mlir::TypedAttr abiValue = lowerMod->getCXXABI ().lowerDataMemberConstant (
1587
+ dataMember, layout, *typeConverter);
1588
+ rewriter.replaceOpWithNewOp <ConstantOp>(op, abiValue);
1589
+ return mlir::success ();
1608
1590
}
1609
1591
// TODO(cir): constant arrays are currently just pushed into the stack using
1610
1592
// the store instruction, instead of being stored as global variables and
@@ -2208,8 +2190,15 @@ mlir::LogicalResult CIRToLLVMGlobalOpLowering::matchAndRewrite(
2208
2190
return mlir::success ();
2209
2191
} else if (auto dataMemberAttr =
2210
2192
mlir::dyn_cast<cir::DataMemberAttr>(init.value ())) {
2211
- init = lowerDataMemberAttr (op->getParentOfType <mlir::ModuleOp>(),
2212
- dataMemberAttr, *typeConverter);
2193
+ assert (lowerMod && " lower module is not available" );
2194
+ mlir::DataLayout layout (op->getParentOfType <mlir::ModuleOp>());
2195
+ mlir::TypedAttr abiValue = lowerMod->getCXXABI ().lowerDataMemberConstant (
2196
+ dataMemberAttr, layout, *typeConverter);
2197
+ auto abiOp = mlir::cast<GlobalOp>(rewriter.clone (*op.getOperation ()));
2198
+ abiOp.setInitialValueAttr (abiValue);
2199
+ abiOp.setSymType (abiValue.getType ());
2200
+ rewriter.replaceOp (op, abiOp);
2201
+ return mlir::success ();
2213
2202
} else if (const auto structAttr =
2214
2203
mlir::dyn_cast<cir::ConstStructAttr>(init.value ())) {
2215
2204
setupRegionInitializedLLVMGlobalOp (op, rewriter);
@@ -3237,11 +3226,11 @@ mlir::LogicalResult CIRToLLVMGetMemberOpLowering::matchAndRewrite(
3237
3226
mlir::LogicalResult CIRToLLVMGetRuntimeMemberOpLowering::matchAndRewrite (
3238
3227
cir::GetRuntimeMemberOp op, OpAdaptor adaptor,
3239
3228
mlir::ConversionPatternRewriter &rewriter) const {
3240
- auto llvmResTy = getTypeConverter ()-> convertType (op. getType () );
3241
- auto llvmElementTy = mlir::IntegerType::get ( op.getContext (), 8 );
3242
-
3243
- rewriter. replaceOpWithNewOp <mlir::LLVM::GEPOp>(
3244
- op, llvmResTy, llvmElementTy, adaptor. getAddr (), adaptor. getMember () );
3229
+ assert (lowerMod && " lowering module is not available " );
3230
+ mlir::Type llvmResTy = getTypeConverter ()-> convertType ( op.getType () );
3231
+ mlir::Operation *llvmOp = lowerMod-> getCXXABI (). lowerGetRuntimeMember (
3232
+ op, llvmResTy, adaptor. getAddr (), adaptor. getMember (), rewriter);
3233
+ rewriter. replaceOp (op, llvmOp );
3245
3234
return mlir::success ();
3246
3235
}
3247
3236
@@ -3850,14 +3839,17 @@ mlir::LogicalResult CIRToLLVMSignBitOpLowering::matchAndRewrite(
3850
3839
3851
3840
void populateCIRToLLVMConversionPatterns (
3852
3841
mlir::RewritePatternSet &patterns, mlir::TypeConverter &converter,
3853
- mlir::DataLayout &dataLayout,
3842
+ mlir::DataLayout &dataLayout, cir::LowerModule *lowerModule,
3854
3843
llvm::StringMap<mlir::LLVM::GlobalOp> &stringGlobalsMap,
3855
3844
llvm::StringMap<mlir::LLVM::GlobalOp> &argStringGlobalsMap,
3856
3845
llvm::MapVector<mlir::ArrayAttr, mlir::LLVM::GlobalOp> &argsVarMap) {
3857
3846
patterns.add <CIRToLLVMReturnOpLowering>(patterns.getContext ());
3858
3847
patterns.add <CIRToLLVMAllocaOpLowering>(converter, dataLayout,
3859
3848
stringGlobalsMap, argStringGlobalsMap,
3860
3849
argsVarMap, patterns.getContext ());
3850
+ patterns.add <CIRToLLVMConstantOpLowering, CIRToLLVMGlobalOpLowering,
3851
+ CIRToLLVMGetRuntimeMemberOpLowering>(
3852
+ converter, patterns.getContext (), lowerModule);
3861
3853
patterns.add <
3862
3854
CIRToLLVMCmpOpLowering, CIRToLLVMSelectOpLowering,
3863
3855
CIRToLLVMBitClrsbOpLowering, CIRToLLVMBitClzOpLowering,
@@ -3870,28 +3862,25 @@ void populateCIRToLLVMConversionPatterns(
3870
3862
CIRToLLVMTryCallOpLowering, CIRToLLVMEhInflightOpLowering,
3871
3863
CIRToLLVMUnaryOpLowering, CIRToLLVMBinOpLowering,
3872
3864
CIRToLLVMBinOpOverflowOpLowering, CIRToLLVMShiftOpLowering,
3873
- CIRToLLVMLoadOpLowering, CIRToLLVMConstantOpLowering,
3874
- CIRToLLVMStoreOpLowering, CIRToLLVMFuncOpLowering,
3875
- CIRToLLVMCastOpLowering, CIRToLLVMGlobalOpLowering,
3865
+ CIRToLLVMLoadOpLowering, CIRToLLVMStoreOpLowering,
3866
+ CIRToLLVMFuncOpLowering, CIRToLLVMCastOpLowering,
3876
3867
CIRToLLVMGetGlobalOpLowering, CIRToLLVMComplexCreateOpLowering,
3877
3868
CIRToLLVMComplexRealOpLowering, CIRToLLVMComplexImagOpLowering,
3878
3869
CIRToLLVMComplexRealPtrOpLowering, CIRToLLVMComplexImagPtrOpLowering,
3879
3870
CIRToLLVMVAStartOpLowering, CIRToLLVMVAEndOpLowering,
3880
3871
CIRToLLVMVACopyOpLowering, CIRToLLVMVAArgOpLowering,
3881
3872
CIRToLLVMBrOpLowering, CIRToLLVMGetMemberOpLowering,
3882
- CIRToLLVMGetRuntimeMemberOpLowering, CIRToLLVMSwitchFlatOpLowering,
3883
- CIRToLLVMPtrDiffOpLowering, CIRToLLVMCopyOpLowering,
3884
- CIRToLLVMMemCpyOpLowering, CIRToLLVMMemChrOpLowering,
3885
- CIRToLLVMAbsOpLowering, CIRToLLVMExpectOpLowering,
3886
- CIRToLLVMVTableAddrPointOpLowering, CIRToLLVMVecCreateOpLowering,
3887
- CIRToLLVMVecCmpOpLowering, CIRToLLVMVecSplatOpLowering,
3888
- CIRToLLVMVecTernaryOpLowering, CIRToLLVMVecShuffleDynamicOpLowering,
3889
- CIRToLLVMVecShuffleOpLowering, CIRToLLVMStackSaveOpLowering,
3890
- CIRToLLVMUnreachableOpLowering, CIRToLLVMTrapOpLowering,
3891
- CIRToLLVMInlineAsmOpLowering, CIRToLLVMSetBitfieldOpLowering,
3892
- CIRToLLVMGetBitfieldOpLowering, CIRToLLVMPrefetchOpLowering,
3893
- CIRToLLVMObjSizeOpLowering, CIRToLLVMIsConstantOpLowering,
3894
- CIRToLLVMCmpThreeWayOpLowering, CIRToLLVMMemCpyOpLowering,
3873
+ CIRToLLVMSwitchFlatOpLowering, CIRToLLVMPtrDiffOpLowering,
3874
+ CIRToLLVMCopyOpLowering, CIRToLLVMMemCpyOpLowering,
3875
+ CIRToLLVMMemChrOpLowering, CIRToLLVMAbsOpLowering,
3876
+ CIRToLLVMExpectOpLowering, CIRToLLVMVTableAddrPointOpLowering,
3877
+ CIRToLLVMVecCreateOpLowering, CIRToLLVMVecCmpOpLowering,
3878
+ CIRToLLVMVecSplatOpLowering, CIRToLLVMVecTernaryOpLowering,
3879
+ CIRToLLVMVecShuffleDynamicOpLowering, CIRToLLVMVecShuffleOpLowering,
3880
+ CIRToLLVMStackSaveOpLowering, CIRToLLVMUnreachableOpLowering,
3881
+ CIRToLLVMTrapOpLowering, CIRToLLVMInlineAsmOpLowering,
3882
+ CIRToLLVMSetBitfieldOpLowering, CIRToLLVMGetBitfieldOpLowering,
3883
+ CIRToLLVMPrefetchOpLowering, CIRToLLVMObjSizeOpLowering,
3895
3884
CIRToLLVMIsConstantOpLowering, CIRToLLVMCmpThreeWayOpLowering,
3896
3885
CIRToLLVMReturnAddrOpLowering, CIRToLLVMClearCacheOpLowering,
3897
3886
CIRToLLVMEhTypeIdOpLowering, CIRToLLVMCatchParamOpLowering,
@@ -3901,10 +3890,9 @@ void populateCIRToLLVMConversionPatterns(
3901
3890
CIRToLLVMAssumeAlignedOpLowering, CIRToLLVMAssumeSepStorageOpLowering,
3902
3891
CIRToLLVMBaseClassAddrOpLowering, CIRToLLVMDerivedClassAddrOpLowering,
3903
3892
CIRToLLVMVTTAddrPointOpLowering, CIRToLLVMIsFPClassOpLowering,
3904
- CIRToLLVMAbsOpLowering, CIRToLLVMMemMoveOpLowering,
3905
- CIRToLLVMMemSetOpLowering, CIRToLLVMMemSetInlineOpLowering,
3906
- CIRToLLVMMemCpyInlineOpLowering, CIRToLLVMSignBitOpLowering,
3907
- CIRToLLVMPtrMaskOpLowering
3893
+ CIRToLLVMMemMoveOpLowering, CIRToLLVMMemSetOpLowering,
3894
+ CIRToLLVMMemSetInlineOpLowering, CIRToLLVMMemCpyInlineOpLowering,
3895
+ CIRToLLVMSignBitOpLowering, CIRToLLVMPtrMaskOpLowering
3908
3896
#define GET_BUILTIN_LOWERING_LIST
3909
3897
#include " clang/CIR/Dialect/IR/CIRBuiltinsLowering.inc"
3910
3898
#undef GET_BUILTIN_LOWERING_LIST
@@ -3947,9 +3935,12 @@ void prepareTypeConverter(mlir::LLVMTypeConverter &converter,
3947
3935
3948
3936
return mlir::LLVM::LLVMPointerType::get (type.getContext (), targetAS);
3949
3937
});
3950
- converter.addConversion ([&](cir::DataMemberType type) -> mlir::Type {
3951
- return mlir::IntegerType::get (type.getContext (),
3952
- dataLayout.getTypeSizeInBits (type));
3938
+ converter.addConversion ([&, lowerModule](
3939
+ cir::DataMemberType type) -> mlir::Type {
3940
+ assert (lowerModule && " CXXABI is not available" );
3941
+ mlir::Type abiType =
3942
+ lowerModule->getCXXABI ().lowerDataMemberType (type, converter);
3943
+ return converter.convertType (abiType);
3953
3944
});
3954
3945
converter.addConversion ([&](cir::ArrayType type) -> mlir::Type {
3955
3946
auto ty = converter.convertType (type.getEltType ());
@@ -4285,8 +4276,8 @@ void ConvertCIRToLLVMPass::runOnOperation() {
4285
4276
llvm::MapVector<mlir::ArrayAttr, mlir::LLVM::GlobalOp> argsVarMap;
4286
4277
4287
4278
populateCIRToLLVMConversionPatterns (patterns, converter, dataLayout,
4288
- stringGlobalsMap, argStringGlobalsMap ,
4289
- argsVarMap);
4279
+ lowerModule. get (), stringGlobalsMap ,
4280
+ argStringGlobalsMap, argsVarMap);
4290
4281
mlir::populateFuncToLLVMConversionPatterns (converter, patterns);
4291
4282
4292
4283
mlir::ConversionTarget target (getContext ());
0 commit comments