Skip to content

Commit 4fb1072

Browse files
committed
[clang] Sign the v-table pointer in ObjC exception RTTI.
1 parent 2fe5f9c commit 4fb1072

File tree

2 files changed

+35
-3
lines changed

2 files changed

+35
-3
lines changed

clang/lib/CodeGen/CGObjCMac.cpp

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7894,11 +7894,26 @@ CGObjCNonFragileABIMac::GetInterfaceEHType(const ObjCInterfaceDecl *ID,
78947894
}
78957895

78967896
llvm::Value *VTableIdx = llvm::ConstantInt::get(CGM.Int32Ty, 2);
7897+
llvm::Constant *VTablePtr = llvm::ConstantExpr::getInBoundsGetElementPtr(
7898+
VTableGV->getValueType(), VTableGV, VTableIdx);
7899+
78977900
ConstantInitBuilder builder(CGM);
78987901
auto values = builder.beginStruct(ObjCTypes.EHTypeTy);
7899-
values.add(
7900-
llvm::ConstantExpr::getInBoundsGetElementPtr(VTableGV->getValueType(),
7901-
VTableGV, VTableIdx));
7902+
7903+
if (auto &Schema =
7904+
CGM.getCodeGenOpts().PointerAuth.CXXTypeInfoVTablePointer) {
7905+
uint32_t discrimination = 0;
7906+
if (Schema.hasOtherDiscrimination()) {
7907+
assert(Schema.getOtherDiscrimination() ==
7908+
PointerAuthSchema::Discrimination::Constant);
7909+
discrimination = Schema.getConstantDiscrimination();
7910+
}
7911+
values.addSignedPointer(
7912+
VTablePtr, Schema.getKey(), Schema.isAddressDiscriminated(),
7913+
llvm::ConstantInt::get(CGM.IntPtrTy, discrimination));
7914+
} else {
7915+
values.add(VTablePtr);
7916+
}
79027917
values.add(GetClassName(ClassName));
79037918
values.add(GetClassGlobal(ID, /*metaclass*/ false, NotForDefinition));
79047919

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// RUN: %clang_cc1 -triple arm64-apple-ios -fptrauth-calls -emit-llvm -fexceptions -fobjc-exceptions -o - %s | FileCheck %s
2+
3+
__attribute__((objc_root_class))
4+
@interface Root {
5+
Class isa;
6+
}
7+
@end
8+
9+
__attribute__((objc_exception))
10+
@interface A : Root
11+
@end
12+
13+
@implementation A
14+
@end
15+
16+
// CHECK: @objc_ehtype_vtable.ptrauth = private constant { ptr, i32, i64, i64 } { ptr getelementptr inbounds (ptr, ptr @objc_ehtype_vtable, i32 2), i32 2, i64 0, i64 0 }, section "llvm.ptrauth", align 8
17+
// CHECK: @"OBJC_EHTYPE_$_A" = global {{%.*}} { ptr @objc_ehtype_vtable.ptrauth,

0 commit comments

Comments
 (0)