@@ -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
// clang-format off
3863
3855
CIRToLLVMAbsOpLowering,
@@ -3891,7 +3883,6 @@ void populateCIRToLLVMConversionPatterns(
3891
3883
CIRToLLVMComplexImagPtrOpLowering,
3892
3884
CIRToLLVMComplexRealOpLowering,
3893
3885
CIRToLLVMComplexRealPtrOpLowering,
3894
- CIRToLLVMConstantOpLowering,
3895
3886
CIRToLLVMCopyOpLowering,
3896
3887
CIRToLLVMDerivedClassAddrOpLowering,
3897
3888
CIRToLLVMEhInflightOpLowering,
@@ -3902,8 +3893,6 @@ void populateCIRToLLVMConversionPatterns(
3902
3893
CIRToLLVMGetBitfieldOpLowering,
3903
3894
CIRToLLVMGetGlobalOpLowering,
3904
3895
CIRToLLVMGetMemberOpLowering,
3905
- CIRToLLVMGetRuntimeMemberOpLowering,
3906
- CIRToLLVMGlobalOpLowering,
3907
3896
CIRToLLVMInlineAsmOpLowering,
3908
3897
CIRToLLVMIsConstantOpLowering,
3909
3898
CIRToLLVMIsFPClassOpLowering,
@@ -3990,10 +3979,13 @@ void prepareTypeConverter(mlir::LLVMTypeConverter &converter,
3990
3979
3991
3980
return mlir::LLVM::LLVMPointerType::get (type.getContext (), targetAS);
3992
3981
});
3993
- converter.addConversion ([&](cir::DataMemberType type) -> mlir::Type {
3994
- return mlir::IntegerType::get (type.getContext (),
3995
- dataLayout.getTypeSizeInBits (type));
3996
- });
3982
+ converter.addConversion (
3983
+ [&, lowerModule](cir::DataMemberType type) -> mlir::Type {
3984
+ assert (lowerModule && " CXXABI is not available" );
3985
+ mlir::Type abiType =
3986
+ lowerModule->getCXXABI ().lowerDataMemberType (type, converter);
3987
+ return converter.convertType (abiType);
3988
+ });
3997
3989
converter.addConversion ([&](cir::ArrayType type) -> mlir::Type {
3998
3990
auto ty = converter.convertType (type.getEltType ());
3999
3991
return mlir::LLVM::LLVMArrayType::get (ty, type.getSize ());
@@ -4328,8 +4320,8 @@ void ConvertCIRToLLVMPass::runOnOperation() {
4328
4320
llvm::MapVector<mlir::ArrayAttr, mlir::LLVM::GlobalOp> argsVarMap;
4329
4321
4330
4322
populateCIRToLLVMConversionPatterns (patterns, converter, dataLayout,
4331
- stringGlobalsMap, argStringGlobalsMap ,
4332
- argsVarMap);
4323
+ lowerModule. get (), stringGlobalsMap ,
4324
+ argStringGlobalsMap, argsVarMap);
4333
4325
mlir::populateFuncToLLVMConversionPatterns (converter, patterns);
4334
4326
4335
4327
mlir::ConversionTarget target (getContext ());
0 commit comments