4949#include " llvm/ADT/Sequence.h"
5050#include " llvm/ADT/SmallVector.h"
5151#include " llvm/Support/Casting.h"
52+ #include " llvm/Support/ErrorHandling.h"
5253#include < optional>
5354
5455using namespace cir ;
@@ -544,6 +545,66 @@ class CIRConstantLowering
544545 }
545546};
546547
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+
547608class CIRFuncLowering : public mlir ::OpConversionPattern<mlir::cir::FuncOp> {
548609public:
549610 using OpConversionPattern<mlir::cir::FuncOp>::OpConversionPattern;
@@ -997,7 +1058,8 @@ void populateCIRToLLVMConversionPatterns(mlir::RewritePatternSet &patterns,
9971058 CIRBinOpLowering, CIRLoadLowering, CIRConstantLowering,
9981059 CIRStoreLowering, CIRAllocaLowering, CIRFuncLowering,
9991060 CIRScopeOpLowering, CIRCastOpLowering, CIRIfLowering,
1000- CIRGlobalOpLowering, CIRGetGlobalOpLowering>(
1061+ CIRGlobalOpLowering, CIRGetGlobalOpLowering, CIRVAStartLowering,
1062+ CIRVAEndLowering, CIRVACopyLowering, CIRVAArgLowering>(
10011063 converter, patterns.getContext ());
10021064}
10031065
@@ -1018,6 +1080,16 @@ void prepareTypeConverter(mlir::LLVMTypeConverter &converter) {
10181080 // LLVM doesn't work with signed types, so we drop the CIR signs here.
10191081 return mlir::IntegerType::get (type.getContext (), type.getWidth ());
10201082 });
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+ });
10211093}
10221094} // namespace
10231095
0 commit comments