https://github.com/ojhunt created https://github.com/llvm/llvm-project/pull/135562
If clang is configured to apply pointer authentication to type_info's vtable pointer we ensure that the selected schema is applied to the RTTI objects generated for objc++. >From 5dc1e5fbb57f88e412e044605d8fe30a66255a35 Mon Sep 17 00:00:00 2001 From: Oliver Hunt <oli...@apple.com> Date: Sun, 13 Apr 2025 13:21:49 -0700 Subject: [PATCH] [clang][CGObjC] Sign the v-table pointer in ObjC exception RTTI. --- clang/docs/ReleaseNotes.rst | 1 + .../clang/CodeGen/ConstantInitBuilder.h | 3 +++ clang/lib/CodeGen/CGObjCMac.cpp | 20 +++++++++++++++++-- clang/lib/CodeGen/ConstantInitBuilder.cpp | 12 +++++++++++ .../test/CodeGenObjC/ptrauth-attr-exception.m | 16 +++++++++++++++ 5 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 clang/test/CodeGenObjC/ptrauth-attr-exception.m diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 11f62bc881b03..67fef2fa0c37f 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -191,6 +191,7 @@ Non-comprehensive list of changes in this release - Support parsing the `cc` operand modifier and alias it to the `c` modifier (#GH127719). - Added `__builtin_elementwise_exp10`. - For AMDPGU targets, added `__builtin_v_cvt_off_f32_i4` that maps to the `v_cvt_off_f32_i4` instruction. +- Support authenticated ``type_info`` vtable pointers in Objective-C++ New Compiler Flags ------------------ diff --git a/clang/include/clang/CodeGen/ConstantInitBuilder.h b/clang/include/clang/CodeGen/ConstantInitBuilder.h index 28d4764b6d60b..a7424abbc07eb 100644 --- a/clang/include/clang/CodeGen/ConstantInitBuilder.h +++ b/clang/include/clang/CodeGen/ConstantInitBuilder.h @@ -206,6 +206,9 @@ class ConstantAggregateBuilderBase { void addSignedPointer(llvm::Constant *Pointer, const PointerAuthSchema &Schema, GlobalDecl CalleeDecl, QualType CalleeType); + void addSignedPointer(llvm::Constant *Pointer, unsigned Key, + bool UseAddressDiscrimination, + llvm::ConstantInt *OtherDiscriminator); /// Add a null pointer of a specific type. void addNullPointer(llvm::PointerType *ptrTy) { diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp index 1f11347b81411..e854f6b5920c8 100644 --- a/clang/lib/CodeGen/CGObjCMac.cpp +++ b/clang/lib/CodeGen/CGObjCMac.cpp @@ -7676,10 +7676,26 @@ CGObjCNonFragileABIMac::GetInterfaceEHType(const ObjCInterfaceDecl *ID, } llvm::Value *VTableIdx = llvm::ConstantInt::get(CGM.Int32Ty, 2); + llvm::Constant *VTablePtr = llvm::ConstantExpr::getInBoundsGetElementPtr( + VTableGV->getValueType(), VTableGV, VTableIdx); + ConstantInitBuilder builder(CGM); auto values = builder.beginStruct(ObjCTypes.EHTypeTy); - values.add(llvm::ConstantExpr::getInBoundsGetElementPtr( - VTableGV->getValueType(), VTableGV, VTableIdx)); + + if (auto &Schema = + CGM.getCodeGenOpts().PointerAuth.CXXTypeInfoVTablePointer) { + uint32_t discrimination = 0; + if (Schema.hasOtherDiscrimination()) { + assert(Schema.getOtherDiscrimination() == + PointerAuthSchema::Discrimination::Constant); + discrimination = Schema.getConstantDiscrimination(); + } + values.addSignedPointer( + VTablePtr, Schema.getKey(), Schema.isAddressDiscriminated(), + llvm::ConstantInt::get(CGM.IntPtrTy, discrimination)); + } else { + values.add(VTablePtr); + } values.add(GetClassName(ClassName)); values.add(GetClassGlobal(ID, /*metaclass*/ false, NotForDefinition)); diff --git a/clang/lib/CodeGen/ConstantInitBuilder.cpp b/clang/lib/CodeGen/ConstantInitBuilder.cpp index ce1fe137c1919..c5b1ad3a07235 100644 --- a/clang/lib/CodeGen/ConstantInitBuilder.cpp +++ b/clang/lib/CodeGen/ConstantInitBuilder.cpp @@ -314,3 +314,15 @@ void ConstantAggregateBuilderBase::addSignedPointer( Pointer, Schema, StorageAddress, CalleeDecl, CalleeType); add(SignedPointer); } + +void ConstantAggregateBuilderBase::addSignedPointer( + llvm::Constant *Pointer, unsigned Key, bool UseAddressDiscrimination, + llvm::ConstantInt *OtherDiscriminator) { + llvm::Constant *StorageAddress = nullptr; + if (UseAddressDiscrimination) + StorageAddress = getAddrOfCurrentPosition(Pointer->getType()); + + llvm::Constant *SignedPointer = Builder.CGM.getConstantSignedPointer( + Pointer, Key, StorageAddress, OtherDiscriminator); + add(SignedPointer); +} diff --git a/clang/test/CodeGenObjC/ptrauth-attr-exception.m b/clang/test/CodeGenObjC/ptrauth-attr-exception.m new file mode 100644 index 0000000000000..1a17828b927da --- /dev/null +++ b/clang/test/CodeGenObjC/ptrauth-attr-exception.m @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -triple arm64-apple-ios -fptrauth-calls -emit-llvm -fexceptions -fobjc-exceptions -o - %s | FileCheck %s + +__attribute__((objc_root_class)) +@interface Root { + Class isa; +} +@end + +__attribute__((objc_exception)) +@interface A : Root +@end + +@implementation A +@end + +// CHECK: @"OBJC_EHTYPE_$_A" = global {{%.*}} { ptr ptrauth (ptr getelementptr inbounds (ptr, ptr @objc_ehtype_vtable, i32 2), i32 2), _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits