https://github.com/AmrDeveloper created https://github.com/llvm/llvm-project/pull/172713
Add flattened version of CatchParamOp Issue https://github.com/llvm/llvm-project/issues/154992 >From 28570e94a508f05bda7f532032ba4fbcf3dbd9f4 Mon Sep 17 00:00:00 2001 From: Amr Hesham <[email protected]> Date: Wed, 17 Dec 2025 19:43:27 +0100 Subject: [PATCH] [CIR] Add flattened version of CatchParamOp --- clang/include/clang/CIR/Dialect/IR/CIROps.td | 42 +++++++++++++++++++ .../CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp | 24 +++++++++++ clang/test/CIR/IR/catch-param-flat.cir | 22 ++++++++++ clang/test/CIR/Lowering/catch-param-flat.cir | 25 +++++++++++ 4 files changed, 113 insertions(+) create mode 100644 clang/test/CIR/IR/catch-param-flat.cir create mode 100644 clang/test/CIR/Lowering/catch-param-flat.cir diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td index 0e91d008dc52d..d26afca3efc64 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIROps.td +++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td @@ -5366,6 +5366,48 @@ def CIR_CatchParamOp : CIR_Op<"catch_param", [HasParent<"cir::TryOp">]> { let hasLLVMLowering = false; } +//===----------------------------------------------------------------------===// +// CatchParamFlatOp +//===----------------------------------------------------------------------===// + +def CIR_FlatCatchParamKind : CIR_I32EnumAttr< + "FlatCatchParamKind", "Designate limits for begin/end of catch param handling", [ + I32EnumAttrCase<"Begin", 0, "begin">, + I32EnumAttrCase<"End", 1, "end"> +]>; + +def CIR_CatchParamFlatOp : CIR_Op<"catch_param.flat"> { + let summary = "A flattened version of `cir.catch_param`"; + let description = [{ + The `cir.catch_param.flat` operation is a region-less and simplified + version of the `cir.catch_param`. + + Its representation is closer to LLVM IR dialect + than the C/C++ language feature. + + This operation is used only after the CFG flatterning pass. + + Examples: + ```mlir + cir.catch_param.flat begin %exception_ptr -> !cir.ptr<!s32i> + cir.catch_param.flat end + ``` + }]; + + let arguments = (ins + Optional<CIR_VoidPtrType>:$exception_ptr, + CIR_FlatCatchParamKind:$kind + ); + + let results = (outs Optional<CIR_AnyType>:$param); + let assemblyFormat = [{ + $kind + ($exception_ptr^)? + (`->` qualified(type($param))^)? + attr-dict + }]; +} + //===----------------------------------------------------------------------===// // Exception related: EhInflightOp //===----------------------------------------------------------------------===// diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp index 7c9cf8e2c2e2d..c28915cd04f53 100644 --- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp +++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp @@ -3418,6 +3418,30 @@ mlir::LogicalResult CIRToLLVMEhInflightOpLowering::matchAndRewrite( return mlir::success(); } +mlir::LogicalResult CIRToLLVMCatchParamFlatOpLowering::matchAndRewrite( + cir::CatchParamFlatOp op, OpAdaptor adaptor, + mlir::ConversionPatternRewriter &rewriter) const { + if (op.getKind() == cir::FlatCatchParamKind::Begin) { + StringRef fnName = "__cxa_begin_catch"; + auto llvmPtrTy = mlir::LLVM::LLVMPointerType::get(rewriter.getContext()); + auto fnTy = mlir::LLVM::LLVMFunctionType::get(llvmPtrTy, {llvmPtrTy}); + createLLVMFuncOpIfNotExist(rewriter, op, fnName, fnTy); + rewriter.replaceOpWithNewOp<mlir::LLVM::CallOp>( + op, mlir::TypeRange{llvmPtrTy}, fnName, + mlir::ValueRange{adaptor.getExceptionPtr()}); + return mlir::success(); + } + + assert(op.getKind() == cir::FlatCatchParamKind::End); + StringRef fnName = "__cxa_end_catch"; + auto fnTy = mlir::LLVM::LLVMFunctionType::get( + mlir::LLVM::LLVMVoidType::get(rewriter.getContext()), {}); + createLLVMFuncOpIfNotExist(rewriter, op, fnName, fnTy); + rewriter.replaceOpWithNewOp<mlir::LLVM::CallOp>(op, mlir::TypeRange{}, fnName, + mlir::ValueRange{}); + return mlir::success(); +} + mlir::LogicalResult CIRToLLVMTrapOpLowering::matchAndRewrite( cir::TrapOp op, OpAdaptor adaptor, mlir::ConversionPatternRewriter &rewriter) const { diff --git a/clang/test/CIR/IR/catch-param-flat.cir b/clang/test/CIR/IR/catch-param-flat.cir new file mode 100644 index 0000000000000..3a3b10a25c216 --- /dev/null +++ b/clang/test/CIR/IR/catch-param-flat.cir @@ -0,0 +1,22 @@ +// RUN: cir-opt %s --verify-roundtrip | FileCheck %s + +!s32i = !cir.int<s, 32> +!void = !cir.void + +module { + +cir.func dso_local @catch_param_flat() personality(@__gxx_personality_v0) { + %exception_ptr, %type_id = cir.eh.inflight_exception + %exception = cir.catch_param.flat begin %exception_ptr -> !cir.ptr<!s32i> + cir.catch_param.flat end + cir.return +} + +// CHECK: cir.func dso_local @catch_param_flat() personality(@__gxx_personality_v0) { +// CHECK: %[[EXCEPTION_PTR:.*]], %[[TYPE_ID:.*]] = cir.eh.inflight_exception +// CHECK: %[[EXCEPTION:.*]] = cir.catch_param.flat begin %[[EXCEPTION_PTR]] -> !cir.ptr<!s32i> +// CHECK: cir.catch_param.flat end +// CHECK: cir.return +// CHECK: } + +} diff --git a/clang/test/CIR/Lowering/catch-param-flat.cir b/clang/test/CIR/Lowering/catch-param-flat.cir new file mode 100644 index 0000000000000..a7307d7cf98eb --- /dev/null +++ b/clang/test/CIR/Lowering/catch-param-flat.cir @@ -0,0 +1,25 @@ +// RUN: cir-opt %s -cir-to-llvm -o %t.cir + +!s32i = !cir.int<s, 32> +!void = !cir.void + +module { + +cir.func dso_local @catch_param_flat() personality(@__gxx_personality_v0) { + %exception_ptr, %type_id = cir.eh.inflight_exception + %exception = cir.catch_param.flat begin %exception_ptr -> !cir.ptr<!s32i> + cir.catch_param.flat end + cir.return +} + +// CHECK: llvm.func @catch_param_flat() attributes {dso_local, personality = @__gxx_personality_v0} { +// CHECK: %[[CONST_0:.*]] = llvm.mlir.zero : !llvm.ptr +// CHECK: %[[LANDING_PAD:.*]] = llvm.landingpad (catch %[[CONST_0]] : !llvm.ptr) : !llvm.struct<(ptr, i32)> +// CHECK: %[[EXCEPTION_PTR:.*]] = llvm.extractvalue %[[LANDING_PAD]][0] : !llvm.struct<(ptr, i32)> +// CHECK: %[[TYPE_ID:.*]] = llvm.extractvalue %[[LANDING_PAD]][1] : !llvm.struct<(ptr, i32)> +// CHECK: %[[EXCEPTION:.*]] = llvm.call @__cxa_begin_catch(%[[EXCEPTION_PTR]]) : (!llvm.ptr) -> !llvm.ptr +// CHECK: llvm.call @__cxa_end_catch() : () -> () +// CHECK: llvm.return +// CHECK: } + +} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
