https://github.com/AmrDeveloper created 
https://github.com/llvm/llvm-project/pull/173736

Implement support for ComplexType in CatchParam

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

>From baf95784757a2b7bc4fa66a6d14fbac4f73f8115 Mon Sep 17 00:00:00 2001
From: Amr Hesham <[email protected]>
Date: Sat, 27 Dec 2025 18:29:57 +0100
Subject: [PATCH] [CIR] Implement support for ComplexType in CatchParam

---
 clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp |  7 +-
 clang/test/CIR/CodeGen/try-catch-tmp.cpp      | 70 ++++++++++++++++++-
 2 files changed, 72 insertions(+), 5 deletions(-)

diff --git a/clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp 
b/clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp
index 0d0d6c34a255a..25d2d9f615542 100644
--- a/clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp
@@ -2351,6 +2351,7 @@ static void initCatchParam(CIRGenFunction &cgf, const 
VarDecl &catchParam,
       return;
     }
 
+    // Otherwise, it returns a pointer into the exception object.
     mlir::Type cirCatchTy = cgf.convertTypeForMem(catchType);
     mlir::Value catchParam =
         callBeginCatch(cgf, cgf.getBuilder().getPointerTo(cirCatchTy), false);
@@ -2358,11 +2359,12 @@ static void initCatchParam(CIRGenFunction &cgf, const 
VarDecl &catchParam,
     LValue destLV = cgf.makeAddrLValue(paramAddr, catchType);
     switch (tek) {
     case cir::TEK_Complex: {
-      cgf.cgm.errorNYI(loc, "initCatchParam: cir::TEK_Complex");
+      mlir::Value load = cgf.emitLoadOfComplex(srcLV, loc);
+      cgf.emitStoreOfComplex(cgf.getLoc(loc), load, destLV, /*isInit=*/true);
       return;
     }
     case cir::TEK_Scalar: {
-      auto exnLoad = cgf.emitLoadOfScalar(srcLV, loc);
+      mlir::Value exnLoad = cgf.emitLoadOfScalar(srcLV, loc);
       cgf.emitStoreOfScalar(exnLoad, destLV, /*isInit=*/true);
       return;
     }
@@ -2370,7 +2372,6 @@ static void initCatchParam(CIRGenFunction &cgf, const 
VarDecl &catchParam,
       llvm_unreachable("evaluation kind filtered out!");
     }
 
-    // Otherwise, it returns a pointer into the exception object.
     llvm_unreachable("bad evaluation kind");
   }
 
diff --git a/clang/test/CIR/CodeGen/try-catch-tmp.cpp 
b/clang/test/CIR/CodeGen/try-catch-tmp.cpp
index 78d8567e0760f..c98f5d5c5fa28 100644
--- a/clang/test/CIR/CodeGen/try-catch-tmp.cpp
+++ b/clang/test/CIR/CodeGen/try-catch-tmp.cpp
@@ -77,7 +77,7 @@ void call_function_inside_try_catch_with_exception_type() {
 // OGCG:   %[[CALL:.*]] = invoke noundef i32 @_Z8divisionv()
 // OGCG:           to label %[[INVOKE_NORMAL:.*]] unwind label 
%[[INVOKE_UNWIND:.*]]
 // OGCG: [[INVOKE_NORMAL]]:
-// OGCG:   br label %try.cont
+// OGCG:   br label %[[TRY_CONT:.*]]
 // OGCG: [[INVOKE_UNWIND]]:
 // OGCG:   %[[LANDING_PAD:.*]] = landingpad { ptr, i32 }
 // OGCG:           catch ptr @_ZTIi
@@ -97,7 +97,73 @@ void call_function_inside_try_catch_with_exception_type() {
 // OGCG:   %[[TMP_BEGIN_CATCH:.*]] = load i32, ptr %[[BEGIN_CATCH]], align 4
 // OGCG:   store i32 %[[TMP_BEGIN_CATCH]], ptr %[[E_ADDR]], align 4
 // OGCG:   call void @__cxa_end_catch()
-// OGCG:   br label %[[TRY_CONT:.*]]
+// OGCG:   br label %[[TRY_CONT]]
+// OGCG: [[TRY_CONT]]:
+// OGCG:   ret void
+// OGCG: [[EH_RESUME]]:
+// OGCG:   %[[TMP_EXCEPTION:.*]] = load ptr, ptr %[[EXCEPTION_ADDR]], align 8
+// OGCG:   %[[TMP_EH_TYPE_ID:.*]] = load i32, ptr %[[EH_TYPE_ID_ADDR]], align 4
+// OGCG:   %[[TMP_EXCEPTION_INFO:.*]] = insertvalue { ptr, i32 } poison, ptr 
%[[TMP_EXCEPTION]], 0
+// OGCG:   %[[EXCEPTION_INFO:.*]] = insertvalue { ptr, i32 } 
%[[TMP_EXCEPTION_INFO]], i32 %[[TMP_EH_TYPE_ID]], 1
+// OGCG:   resume { ptr, i32 } %[[EXCEPTION_INFO]]
+
+void call_function_inside_try_catch_with_complex_exception_type() {
+  try {
+    division();
+  } catch (int _Complex e) {
+  }
+}
+
+// CIR: cir.func {{.*}} 
@_Z58call_function_inside_try_catch_with_complex_exception_typev() 
personality(@__gxx_personality_v0)
+// CIR: cir.scope {
+// CIR:   %[[EXCEPTION_ADDR:.*]] = cir.alloca !cir.complex<!s32i>, 
!cir.ptr<!cir.complex<!s32i>>, ["e"]
+// CIR:   cir.try {
+// CIR:     %[[CALL:.*]] = cir.call @_Z8divisionv() : () -> !s32i
+// CIR:     cir.yield
+// CIR:   } catch [type #cir.global_view<@_ZTICi> : !cir.ptr<!u8i>] {
+// CIR:     %[[CATCH_PARAM:.*]] = cir.catch_param : 
!cir.ptr<!cir.complex<!s32i>>
+// CIR:     %[[TMP_CATCH_PARAM:.*]] = cir.load {{.*}} %[[CATCH_PARAM]] : 
!cir.ptr<!cir.complex<!s32i>>, !cir.complex<!s32i>
+// CIR:     cir.store {{.*}} %[[TMP_CATCH_PARAM]], %[[EXCEPTION_ADDR]] : 
!cir.complex<!s32i>, !cir.ptr<!cir.complex<!s32i>>
+// CIR:     cir.yield
+// CIR:   } unwind {
+// CIR:     cir.resume
+// CIR:   }
+// CIR: }
+
+// OGCG: define {{.*}} void 
@_Z58call_function_inside_try_catch_with_complex_exception_typev() #0 
personality ptr @__gxx_personality_v0
+// OGCG:   %[[EXCEPTION_ADDR:.*]] = alloca ptr, align 8
+// OGCG:   %[[EH_TYPE_ID_ADDR:.*]] = alloca i32, align 4
+// OGCG:   %[[E_ADDR:.*]] = alloca { i32, i32 }, align 4
+// OGCG:   %[[CALL:.*]] = invoke noundef i32 @_Z8divisionv()
+// OGCG:           to label %[[INVOKE_NORMAL:.*]] unwind label 
%[[INVOKE_UNWIND:.*]]
+// OGCG: [[INVOKE_NORMAL]]:
+// OGCG:    br label %[[TRY_CONT:.*]]
+// OGCG: [[INVOKE_UNWIND]]:
+// OGCG:   %[[LANDING_PAD:.*]] = landingpad { ptr, i32 }
+// OGCG:           catch ptr @_ZTICi
+// OGCG:   %[[EXCEPTION:.*]] = extractvalue { ptr, i32 } %[[LANDING_PAD]], 0
+// OGCG:   store ptr %[[EXCEPTION]], ptr %[[EXCEPTION_ADDR]], align 8
+// OGCG:   %[[EH_TYPE_ID:.*]] = extractvalue { ptr, i32 } %[[LANDING_PAD]], 1
+// OGCG:   store i32 %[[EH_TYPE_ID]], ptr %[[EH_TYPE_ID_ADDR]], align 4
+// OGCG:   br label %[[CATCH_DISPATCH:.*]]
+// OGCG: [[CATCH_DISPATCH]]:
+// OGCG:   %[[TMP_EH_TYPE_ID:.*]] = load i32, ptr %[[EH_TYPE_ID_ADDR]], align 4
+// OGCG:   %[[EH_TYPE_ID:.*]] = call i32 @llvm.eh.typeid.for.p0(ptr @_ZTICi)
+// OGCG:   %[[TYPE_ID_EQ:.*]] = icmp eq i32 %[[TMP_EH_TYPE_ID]], 
%[[EH_TYPE_ID]]
+// OGCG:   br i1 %[[TYPE_ID_EQ]], label %[[CATCH_EXCEPTION:.*]], label 
%[[EH_RESUME:.*]]
+// OGCG: [[CATCH_EXCEPTION]]:
+// OGCG:   %[[TMP_EXCEPTION:.*]] = load ptr, ptr %[[EXCEPTION_ADDR]], align 8
+// OGCG:   %[[BEGIN_CATCH:.*]] = call ptr @__cxa_begin_catch(ptr 
%[[TMP_EXCEPTION]])
+// OGCG:   %[[EXCEPTION_REAL_PTR:.*]] = getelementptr inbounds nuw { i32, i32 
}, ptr %[[BEGIN_CATCH]], i32 0, i32 0
+// OGCG:   %[[EXCEPTION_REAL:.*]] = load i32, ptr %[[EXCEPTION_REAL_PTR]], 
align 4
+// OGCG:   %[[EXCEPTION_IMAG_PTR:.*]] = getelementptr inbounds nuw { i32, i32 
}, ptr %[[BEGIN_CATCH]], i32 0, i32 1
+// OGCG:   %[[EXCEPTION_IMAG:.*]] = load i32, ptr %[[EXCEPTION_IMAG_PTR]], 
align 4
+// OGCG:   %[[E_REAL_PTR:.*]] = getelementptr inbounds nuw { i32, i32 }, ptr 
%[[E_ADDR]], i32 0, i32 0
+// OGCG:   %[[E_IMAG_PTR:.*]] = getelementptr inbounds nuw { i32, i32 }, ptr 
%[[E_ADDR]], i32 0, i32 1
+// OGCG:   store i32 %[[EXCEPTION_REAL]], ptr %[[E_REAL_PTR]], align 4
+// OGCG:   store i32 %[[EXCEPTION_IMAG]], ptr %[[E_IMAG_PTR]], align 4
+// OGCG:   call void @__cxa_end_catch()
+// OGCG:   br label %[[TRY_CONT]]
 // OGCG: [[TRY_CONT]]:
 // OGCG:   ret void
 // OGCG: [[EH_RESUME]]:

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

Reply via email to