https://github.com/AlexVlx created https://github.com/llvm/llvm-project/pull/65699:
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. >From f4271e03667b64c8d10d7e4de16e78b37e845229 Mon Sep 17 00:00:00 2001 From: Alex Voicu <alexandru.vo...@amd.com> Date: Fri, 8 Sep 2023 00:21:59 +0100 Subject: [PATCH] AS_cast the argument to `eh_typeid_for` iff typeinfo is not in the default AS. --- clang/lib/CodeGen/CGException.cpp | 5 +++- .../try-catch-with-address-space.cpp | 25 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 clang/test/CodeGenCXX/try-catch-with-address-space.cpp 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)) + } +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits