3434#include " mlir/IR/IRMapping.h"
3535#include " mlir/Pass/Pass.h"
3636#include " mlir/Pass/PassManager.h"
37+ #include " mlir/Support/LogicalResult.h"
3738#include " mlir/Target/LLVMIR/Dialect/Builtin/BuiltinToLLVMIRTranslation.h"
3839#include " mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
3940#include " mlir/Target/LLVMIR/Export.h"
4748#include " llvm/ADT/Sequence.h"
4849#include " llvm/ADT/SmallVector.h"
4950#include " llvm/Support/Casting.h"
51+ #include " llvm/Support/ErrorHandling.h"
5052#include < optional>
5153
5254using namespace cir ;
@@ -482,6 +484,66 @@ class CIRConstantLowering
482484 }
483485};
484486
487+ class CIRVAStartLowering
488+ : public mlir::OpConversionPattern<mlir::cir::VAStartOp> {
489+ public:
490+ using OpConversionPattern<mlir::cir::VAStartOp>::OpConversionPattern;
491+
492+ mlir::LogicalResult
493+ matchAndRewrite (mlir::cir::VAStartOp op, OpAdaptor adaptor,
494+ mlir::ConversionPatternRewriter &rewriter) const override {
495+ auto i8PtrTy = mlir::LLVM::LLVMPointerType::get (rewriter.getI8Type ());
496+ auto vaList = rewriter.create <mlir::LLVM::BitcastOp>(
497+ op.getLoc (), i8PtrTy, adaptor.getOperands ().front ());
498+ rewriter.replaceOpWithNewOp <mlir::LLVM::VaStartOp>(op, vaList);
499+ return mlir::success ();
500+ }
501+ };
502+
503+ class CIRVAEndLowering : public mlir ::OpConversionPattern<mlir::cir::VAEndOp> {
504+ public:
505+ using OpConversionPattern<mlir::cir::VAEndOp>::OpConversionPattern;
506+
507+ mlir::LogicalResult
508+ matchAndRewrite (mlir::cir::VAEndOp op, OpAdaptor adaptor,
509+ mlir::ConversionPatternRewriter &rewriter) const override {
510+ auto i8PtrTy = mlir::LLVM::LLVMPointerType::get (rewriter.getI8Type ());
511+ auto vaList = rewriter.create <mlir::LLVM::BitcastOp>(
512+ op.getLoc (), i8PtrTy, adaptor.getOperands ().front ());
513+ rewriter.replaceOpWithNewOp <mlir::LLVM::VaEndOp>(op, vaList);
514+ return mlir::success ();
515+ }
516+ };
517+
518+ class CIRVACopyLowering
519+ : public mlir::OpConversionPattern<mlir::cir::VACopyOp> {
520+ public:
521+ using OpConversionPattern<mlir::cir::VACopyOp>::OpConversionPattern;
522+
523+ mlir::LogicalResult
524+ matchAndRewrite (mlir::cir::VACopyOp op, OpAdaptor adaptor,
525+ mlir::ConversionPatternRewriter &rewriter) const override {
526+ auto i8PtrTy = mlir::LLVM::LLVMPointerType::get (rewriter.getI8Type ());
527+ auto dstList = rewriter.create <mlir::LLVM::BitcastOp>(
528+ op.getLoc (), i8PtrTy, adaptor.getOperands ().front ());
529+ auto srcList = rewriter.create <mlir::LLVM::BitcastOp>(
530+ op.getLoc (), i8PtrTy, adaptor.getOperands ().back ());
531+ rewriter.replaceOpWithNewOp <mlir::LLVM::VaCopyOp>(op, dstList, srcList);
532+ return mlir::success ();
533+ }
534+ };
535+
536+ class CIRVAArgLowering : public mlir ::OpConversionPattern<mlir::cir::VAArgOp> {
537+ public:
538+ using OpConversionPattern<mlir::cir::VAArgOp>::OpConversionPattern;
539+
540+ mlir::LogicalResult
541+ matchAndRewrite (mlir::cir::VAArgOp op, OpAdaptor adaptor,
542+ mlir::ConversionPatternRewriter &rewriter) const override {
543+ return op.emitError (" cir.vaarg lowering is NYI" );
544+ }
545+ };
546+
485547class CIRFuncLowering : public mlir ::OpConversionPattern<mlir::cir::FuncOp> {
486548public:
487549 using OpConversionPattern<mlir::cir::FuncOp>::OpConversionPattern;
@@ -1021,7 +1083,8 @@ void populateCIRToLLVMConversionPatterns(mlir::RewritePatternSet &patterns,
10211083 CIRBinOpLowering, CIRLoadLowering, CIRConstantLowering,
10221084 CIRStoreLowering, CIRAllocaLowering, CIRFuncLowering,
10231085 CIRScopeOpLowering, CIRCastOpLowering, CIRIfLowering,
1024- CIRGlobalOpLowering, CIRGetGlobalOpLowering>(
1086+ CIRGlobalOpLowering, CIRGetGlobalOpLowering, CIRVAStartLowering,
1087+ CIRVAEndLowering, CIRVACopyLowering, CIRVAArgLowering>(
10251088 converter, patterns.getContext ());
10261089}
10271090
@@ -1044,6 +1107,16 @@ mlir::LLVMTypeConverter prepareTypeConverter(mlir::MLIRContext *ctx) {
10441107 // LLVM doesn't work with signed types, so we drop the CIR signs here.
10451108 return mlir::IntegerType::get (type.getContext (), type.getWidth ());
10461109 });
1110+ converter.addConversion ([&](mlir::cir::StructType type) -> mlir::Type {
1111+ llvm::SmallVector<mlir::Type> llvmMembers;
1112+ for (auto ty : type.getMembers ())
1113+ llvmMembers.push_back (converter.convertType (ty));
1114+ auto llvmStruct = mlir::LLVM::LLVMStructType::getIdentified (
1115+ type.getContext (), type.getTypeName ());
1116+ if (llvmStruct.setBody (llvmMembers, /* isPacked=*/ type.getPacked ()).failed ())
1117+ llvm_unreachable (" Failed to set body of struct" );
1118+ return llvmStruct;
1119+ });
10471120
10481121 return converter;
10491122}
0 commit comments