Skip to content

Commit

Permalink
[clang][CodeGen] The eh_typeid_for intrinsic needs special care too (
Browse files Browse the repository at this point in the history
…#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.
  • Loading branch information
AlexVlx committed Sep 20, 2023
1 parent 0de0b6d commit de018f5
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 1 deletion.
8 changes: 7 additions & 1 deletion clang/lib/CodeGen/CGException.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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;
Expand Down
25 changes: 25 additions & 0 deletions clang/test/CodeGenCXX/try-catch-with-address-space.cpp
Original file line number Diff line number Diff line change
@@ -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))
}
}

0 comments on commit de018f5

Please sign in to comment.