diff --git a/clang/lib/CodeGen/CGException.cpp b/clang/lib/CodeGen/CGException.cpp index 3996f2948349c..87594f71b26ec 100644 --- a/clang/lib/CodeGen/CGException.cpp +++ b/clang/lib/CodeGen/CGException.cpp @@ -1136,6 +1136,8 @@ static void emitCatchDispatchBlock(CodeGenFunction &CGF, // Select the right handler. llvm::Function *llvm_eh_typeid_for = CGF.CGM.getIntrinsic(llvm::Intrinsic::eh_typeid_for); + llvm::Type *argTy = llvm_eh_typeid_for->getArg(0)->getType(); + LangAS globAS = CGF.CGM.GetGlobalVarAddressSpace(nullptr); // Load the selector value. llvm::Value *selector = CGF.getSelectorFromSlot(); @@ -1149,7 +1151,11 @@ 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); + // With opaque ptrs, only the address space can be a mismatch. + if (typeValue->getType() != argTy) + typeValue = + CGF.getTargetHooks().performAddrSpaceCast(CGF, typeValue, globAS, + LangAS::Default, 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 0000000000000..279d29f50fd41 --- /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)) + } +}