49
49
#include " llvm/ADT/Sequence.h"
50
50
#include " llvm/ADT/SmallVector.h"
51
51
#include " llvm/Support/Casting.h"
52
+ #include " llvm/Support/ErrorHandling.h"
52
53
#include < optional>
53
54
54
55
using namespace cir ;
@@ -544,6 +545,66 @@ class CIRConstantLowering
544
545
}
545
546
};
546
547
548
+ class CIRVAStartLowering
549
+ : public mlir::OpConversionPattern<mlir::cir::VAStartOp> {
550
+ public:
551
+ using OpConversionPattern<mlir::cir::VAStartOp>::OpConversionPattern;
552
+
553
+ mlir::LogicalResult
554
+ matchAndRewrite (mlir::cir::VAStartOp op, OpAdaptor adaptor,
555
+ mlir::ConversionPatternRewriter &rewriter) const override {
556
+ auto i8PtrTy = mlir::LLVM::LLVMPointerType::get (getContext ());
557
+ auto vaList = rewriter.create <mlir::LLVM::BitcastOp>(
558
+ op.getLoc (), i8PtrTy, adaptor.getOperands ().front ());
559
+ rewriter.replaceOpWithNewOp <mlir::LLVM::VaStartOp>(op, vaList);
560
+ return mlir::success ();
561
+ }
562
+ };
563
+
564
+ class CIRVAEndLowering : public mlir ::OpConversionPattern<mlir::cir::VAEndOp> {
565
+ public:
566
+ using OpConversionPattern<mlir::cir::VAEndOp>::OpConversionPattern;
567
+
568
+ mlir::LogicalResult
569
+ matchAndRewrite (mlir::cir::VAEndOp op, OpAdaptor adaptor,
570
+ mlir::ConversionPatternRewriter &rewriter) const override {
571
+ auto i8PtrTy = mlir::LLVM::LLVMPointerType::get (getContext ());
572
+ auto vaList = rewriter.create <mlir::LLVM::BitcastOp>(
573
+ op.getLoc (), i8PtrTy, adaptor.getOperands ().front ());
574
+ rewriter.replaceOpWithNewOp <mlir::LLVM::VaEndOp>(op, vaList);
575
+ return mlir::success ();
576
+ }
577
+ };
578
+
579
+ class CIRVACopyLowering
580
+ : public mlir::OpConversionPattern<mlir::cir::VACopyOp> {
581
+ public:
582
+ using OpConversionPattern<mlir::cir::VACopyOp>::OpConversionPattern;
583
+
584
+ mlir::LogicalResult
585
+ matchAndRewrite (mlir::cir::VACopyOp op, OpAdaptor adaptor,
586
+ mlir::ConversionPatternRewriter &rewriter) const override {
587
+ auto i8PtrTy = mlir::LLVM::LLVMPointerType::get (getContext ());
588
+ auto dstList = rewriter.create <mlir::LLVM::BitcastOp>(
589
+ op.getLoc (), i8PtrTy, adaptor.getOperands ().front ());
590
+ auto srcList = rewriter.create <mlir::LLVM::BitcastOp>(
591
+ op.getLoc (), i8PtrTy, adaptor.getOperands ().back ());
592
+ rewriter.replaceOpWithNewOp <mlir::LLVM::VaCopyOp>(op, dstList, srcList);
593
+ return mlir::success ();
594
+ }
595
+ };
596
+
597
+ class CIRVAArgLowering : public mlir ::OpConversionPattern<mlir::cir::VAArgOp> {
598
+ public:
599
+ using OpConversionPattern<mlir::cir::VAArgOp>::OpConversionPattern;
600
+
601
+ mlir::LogicalResult
602
+ matchAndRewrite (mlir::cir::VAArgOp op, OpAdaptor adaptor,
603
+ mlir::ConversionPatternRewriter &rewriter) const override {
604
+ return op.emitError (" cir.vaarg lowering is NYI" );
605
+ }
606
+ };
607
+
547
608
class CIRFuncLowering : public mlir ::OpConversionPattern<mlir::cir::FuncOp> {
548
609
public:
549
610
using OpConversionPattern<mlir::cir::FuncOp>::OpConversionPattern;
@@ -997,7 +1058,8 @@ void populateCIRToLLVMConversionPatterns(mlir::RewritePatternSet &patterns,
997
1058
CIRBinOpLowering, CIRLoadLowering, CIRConstantLowering,
998
1059
CIRStoreLowering, CIRAllocaLowering, CIRFuncLowering,
999
1060
CIRScopeOpLowering, CIRCastOpLowering, CIRIfLowering,
1000
- CIRGlobalOpLowering, CIRGetGlobalOpLowering>(
1061
+ CIRGlobalOpLowering, CIRGetGlobalOpLowering, CIRVAStartLowering,
1062
+ CIRVAEndLowering, CIRVACopyLowering, CIRVAArgLowering>(
1001
1063
converter, patterns.getContext ());
1002
1064
}
1003
1065
@@ -1018,6 +1080,16 @@ void prepareTypeConverter(mlir::LLVMTypeConverter &converter) {
1018
1080
// LLVM doesn't work with signed types, so we drop the CIR signs here.
1019
1081
return mlir::IntegerType::get (type.getContext (), type.getWidth ());
1020
1082
});
1083
+ converter.addConversion ([&](mlir::cir::StructType type) -> mlir::Type {
1084
+ llvm::SmallVector<mlir::Type> llvmMembers;
1085
+ for (auto ty : type.getMembers ())
1086
+ llvmMembers.push_back (converter.convertType (ty));
1087
+ auto llvmStruct = mlir::LLVM::LLVMStructType::getIdentified (
1088
+ type.getContext (), type.getTypeName ());
1089
+ if (llvmStruct.setBody (llvmMembers, /* isPacked=*/ type.getPacked ()).failed ())
1090
+ llvm_unreachable (" Failed to set body of struct" );
1091
+ return llvmStruct;
1092
+ });
1021
1093
}
1022
1094
} // namespace
1023
1095
0 commit comments