https://github.com/im-lunex updated 
https://github.com/llvm/llvm-project/pull/224680

From 1f39fd518ea82aef0f20086329151e975b4c6464 Mon Sep 17 00:00:00 2001
From: im-lunex <[email protected]>
Date: Fri, 18 Sep 2026 23:01:46 +0600
Subject: [PATCH] add test for the rest of the cases

---
 clang/lib/CodeGen/ItaniumCXXABI.cpp           | 11 ++++---
 .../CodeGenCXX/exception-addrspace-ms.cpp     | 31 +++++++++++++++++++
 clang/test/CodeGenCXX/exceptions.cpp          | 12 +++++++
 3 files changed, 49 insertions(+), 5 deletions(-)
 create mode 100644 clang/test/CodeGenCXX/exception-addrspace-ms.cpp

diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp 
b/clang/lib/CodeGen/ItaniumCXXABI.cpp
index c17813140b10f..5c3832d915ac0 100644
--- a/clang/lib/CodeGen/ItaniumCXXABI.cpp
+++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp
@@ -5032,7 +5032,8 @@ static void InitCatchParam(CodeGenFunction &CGF,
         // Create the temporary and write the adjusted pointer into it.
         Address ExnPtrTmp =
           CGF.CreateTempAlloca(PtrTy, CGF.getPointerAlign(), "exn.byref.tmp");
-        llvm::Value *Casted = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy);
+        llvm::Value *Casted =
+            CGF.Builder.CreatePointerBitCastOrAddrSpaceCast(AdjustedExn, 
PtrTy);
         CGF.Builder.CreateStore(Casted, ExnPtrTmp);
 
         // Bind the reference to the temporary.
@@ -5040,8 +5041,8 @@ static void InitCatchParam(CodeGenFunction &CGF,
       }
     }
 
-    llvm::Value *ExnCast =
-      CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.byref");
+    llvm::Value *ExnCast = CGF.Builder.CreatePointerBitCastOrAddrSpaceCast(
+        AdjustedExn, LLVMCatchTy, "exn.byref");
     CGF.Builder.CreateStore(ExnCast, ParamAddr);
     return;
   }
@@ -5054,8 +5055,8 @@ static void InitCatchParam(CodeGenFunction &CGF,
     // If the catch type is a pointer type, __cxa_begin_catch returns
     // the pointer by value.
     if (CatchType->hasPointerRepresentation()) {
-      llvm::Value *CastExn =
-        CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.casted");
+      llvm::Value *CastExn = CGF.Builder.CreatePointerBitCastOrAddrSpaceCast(
+          AdjustedExn, LLVMCatchTy, "exn.casted");
 
       switch (CatchType.getQualifiers().getObjCLifetime()) {
       case Qualifiers::OCL_Strong:
diff --git a/clang/test/CodeGenCXX/exception-addrspace-ms.cpp 
b/clang/test/CodeGenCXX/exception-addrspace-ms.cpp
new file mode 100644
index 0000000000000..0130abe32e977
--- /dev/null
+++ b/clang/test/CodeGenCXX/exception-addrspace-ms.cpp
@@ -0,0 +1,31 @@
+// Test for issue - (https://github.com/llvm/llvm-project/issues/222931)
+// RUN: %clang_cc1 -no-enable-noundef-analysis %s -triple=x86_64-linux-gnu 
-emit-llvm -std=c++11 -o - -fcxx-exceptions -fexceptions -fms-extensions | 
FileCheck -check-prefix=CHECK-PTR32 %s
+// RUN: %clang_cc1 -no-enable-noundef-analysis %s -triple=x86_64-linux-gnu 
-emit-llvm -std=c++11 -o - -fcxx-exceptions -fexceptions -fms-extensions | 
FileCheck -check-prefix=CHECK-AS270-BYREF %s
+// RUN: %clang_cc1 -no-enable-noundef-analysis %s -triple=x86_64-linux-gnu 
-emit-llvm -std=c++11 -o - -fcxx-exceptions -fexceptions -fms-extensions | 
FileCheck -check-prefix=CHECK-AS270-REF %s
+
+void sink_ptr32(int);
+
+void test_ptr32() {
+  try { throw (int * __ptr32)0; } catch (int * __ptr32 p) { sink_ptr32(*p); }
+}
+
+// CHECK-PTR32: %exn.casted = addrspacecast ptr %{{.*}} to ptr addrspace(270)
+
+typedef int __attribute__((address_space(270))) as270_int;
+void sink_as270(as270_int &);
+
+void test_byref() {
+  try { throw (as270_int)0; } catch (as270_int &p) { sink_as270(p); }
+}
+
+// CHECK-AS270-BYREF: %exn.byref = addrspacecast ptr {{.*}} to ptr 
addrspace(270)
+
+struct S2 {};
+typedef S2 __attribute__((address_space(270))) *PtrRec;
+void sink_ptrrec(PtrRec &);
+
+void test_ptrrec() {
+  try { throw (PtrRec)0; } catch (PtrRec &p) { sink_ptrrec(p); }
+}
+
+// CHECK-AS270-REF: store ptr addrspace(270) %{{.*}}, ptr %exn.byref.tmp, 
align 8
\ No newline at end of file
diff --git a/clang/test/CodeGenCXX/exceptions.cpp 
b/clang/test/CodeGenCXX/exceptions.cpp
index 6c920d7186709..7986aefb1eafd 100644
--- a/clang/test/CodeGenCXX/exceptions.cpp
+++ b/clang/test/CodeGenCXX/exceptions.cpp
@@ -623,3 +623,15 @@ void test(int c) {
 }
 
 // CHECK98: attributes [[NI_NR_NUW]] = { noinline noreturn nounwind {{.*}} }
+
+// Test for issue - (https://github.com/llvm/llvm-project/issues/222931)
+// RUN: %clang_cc1 -no-enable-noundef-analysis %s -triple=x86_64-linux-gnu 
-emit-llvm -std=c++11 -o - -fcxx-exceptions -fexceptions | FileCheck 
-check-prefix=CHECK-AS1 %s
+
+typedef int __attribute__((address_space(1))) *as1_int_ptr;
+void sink_as1(int);
+
+void test_as1() {
+  try { throw (as1_int_ptr)0; } catch (as1_int_ptr p) { sink_as1(*p); }
+}
+
+// CHECK-AS1: %exn.casted = addrspacecast ptr %{{.*}} to ptr addrspace(1)

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

Reply via email to