https://github.com/AmrDeveloper updated 
https://github.com/llvm/llvm-project/pull/172713

>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 1/2] [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: }
+
+}

>From 1ee7305897de57704087ec27fd5489da45166d99 Mon Sep 17 00:00:00 2001
From: Amr Hesham <[email protected]>
Date: Wed, 17 Dec 2025 21:03:58 +0100
Subject: [PATCH 2/2] Improve op docs

---
 clang/include/clang/CIR/Dialect/IR/CIROps.td | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td 
b/clang/include/clang/CIR/Dialect/IR/CIROps.td
index d26afca3efc64..4d43f0ce42ecb 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIROps.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td
@@ -5389,7 +5389,7 @@ def CIR_CatchParamFlatOp : CIR_Op<"catch_param.flat"> {
 
     Examples:
     ```mlir
-    cir.catch_param.flat begin %exception_ptr -> !cir.ptr<!s32i>
+    %exception = cir.catch_param.flat begin %exception_ptr -> !cir.ptr<!s32i>
     cir.catch_param.flat end
     ```
   }];

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to