llvmbot wrote: @llvm/pr-subscribers-clang
<details> <summary>Changes</summary> This change is symmetric with the one reviewed in <https://reviews.llvm.org/D157452> and handles the exception handling specific intrinsic, which slipped through the cracks, in the same way, by inserting an address-space cast iff RTTI is in a non-default AS. -- Full diff: https://github.com/llvm/llvm-project/pull/65699.diff 2 Files Affected: - (modified) clang/lib/CodeGen/CGException.cpp (+4-1) - (added) clang/test/CodeGenCXX/try-catch-with-address-space.cpp (+25) <pre> diff --git a/clang/lib/CodeGen/CGException.cpp b/clang/lib/CodeGen/CGException.cpp index 3996f2948349cb5..49cf4ec4b84307b 100644 --- a/clang/lib/CodeGen/CGException.cpp +++ b/clang/lib/CodeGen/CGException.cpp @@ -1149,7 +1149,10 @@ static void emitCatchDispatchBlock(CodeGenFunction &CGF, assert(handler.Type.Flags == 0 && "landingpads do not support catch handler flags"); assert(typeValue && "fell into catch-all case!"); - typeValue = CGF.Builder.CreateBitCast(typeValue, CGF.Int8PtrTy); + llvm::Type *argTy = llvm_eh_typeid_for->getArg(0)->getType(); + // With opaque ptrs, only the address space can be a mismatch. + if (typeValue->getType() != argTy) + typeValue = CGF.Builder.CreateAddrSpaceCast(typeValue, argTy); // Figure out the next block. bool nextIsEnd; diff --git a/clang/test/CodeGenCXX/try-catch-with-address-space.cpp b/clang/test/CodeGenCXX/try-catch-with-address-space.cpp new file mode 100644 index 000000000000000..279d29f50fd4101 --- /dev/null +++ b/clang/test/CodeGenCXX/try-catch-with-address-space.cpp @@ -0,0 +1,25 @@ +// RUN: %clang_cc1 %s -triple=amdgcn-amd-amdhsa -emit-llvm -o - -fcxx-exceptions -fexceptions | FileCheck %s + +struct X { }; + +const X g(); + +void f() { + try { + throw g(); + // CHECK: ptr addrspace(1) @_ZTI1X + } catch (const X x) { + // CHECK: catch ptr addrspace(1) @_ZTI1X + // CHECK: call i32 @llvm.eh.typeid.for(ptr addrspacecast (ptr addrspace(1) @_ZTI1X to ptr)) + } +} + +void h() { + try { + throw "ABC"; + // CHECK: ptr addrspace(1) @_ZTIPKc + } catch (char const(&)[4]) { + // CHECK: catch ptr addrspace(1) @_ZTIA4_c + // CHECK: call i32 @llvm.eh.typeid.for(ptr addrspacecast (ptr addrspace(1) @_ZTIA4_c to ptr)) + } +} </pre> </details> https://github.com/llvm/llvm-project/pull/65699 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits