llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Amr Hesham (AmrDeveloper)

<details>
<summary>Changes</summary>

Add flattened version of CatchParamOp

Issue https://github.com/llvm/llvm-project/issues/154992

---
Full diff: https://github.com/llvm/llvm-project/pull/172713.diff


4 Files Affected:

- (modified) clang/include/clang/CIR/Dialect/IR/CIROps.td (+42) 
- (modified) clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp (+24) 
- (added) clang/test/CIR/IR/catch-param-flat.cir (+22) 
- (added) clang/test/CIR/Lowering/catch-param-flat.cir (+25) 


``````````diff
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: }
+
+}

``````````

</details>


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

Reply via email to