https://github.com/ojhunt updated https://github.com/llvm/llvm-project/pull/135562
>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 1/4] [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), >From 8db3653794797eb6f2b2e18d6e06441f64fa6b7d Mon Sep 17 00:00:00 2001 From: Oliver Hunt <oli...@apple.com> Date: Tue, 3 Jun 2025 19:26:30 -0700 Subject: [PATCH 2/4] Switch to Schema addSignedPointer API, remove the exploded version, and add more tests --- clang/include/clang/CodeGen/ConstantInitBuilder.h | 3 --- clang/lib/CodeGen/CGObjCMac.cpp | 12 +++--------- clang/lib/CodeGen/ConstantInitBuilder.cpp | 12 ------------ clang/test/CodeGenObjC/ptrauth-attr-exception.m | 6 ++++-- 4 files changed, 7 insertions(+), 26 deletions(-) diff --git a/clang/include/clang/CodeGen/ConstantInitBuilder.h b/clang/include/clang/CodeGen/ConstantInitBuilder.h index a7424abbc07eb..28d4764b6d60b 100644 --- a/clang/include/clang/CodeGen/ConstantInitBuilder.h +++ b/clang/include/clang/CodeGen/ConstantInitBuilder.h @@ -206,9 +206,6 @@ 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 ca50a67396042..0810dde380621 100644 --- a/clang/lib/CodeGen/CGObjCMac.cpp +++ b/clang/lib/CodeGen/CGObjCMac.cpp @@ -7684,15 +7684,9 @@ CGObjCNonFragileABIMac::GetInterfaceEHType(const ObjCInterfaceDecl *ID, 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)); + assert(!Schema.hasOtherDiscrimination() || + Schema.getOtherDiscrimination() == PointerAuthSchema::Discrimination::Constant); + values.addSignedPointer(VTablePtr, Schema, GlobalDecl(), QualType()); } else { values.add(VTablePtr); } diff --git a/clang/lib/CodeGen/ConstantInitBuilder.cpp b/clang/lib/CodeGen/ConstantInitBuilder.cpp index c5b1ad3a07235..ce1fe137c1919 100644 --- a/clang/lib/CodeGen/ConstantInitBuilder.cpp +++ b/clang/lib/CodeGen/ConstantInitBuilder.cpp @@ -314,15 +314,3 @@ 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 index 1a17828b927da..145c14b20a65c 100644 --- a/clang/test/CodeGenObjC/ptrauth-attr-exception.m +++ b/clang/test/CodeGenObjC/ptrauth-attr-exception.m @@ -1,4 +1,5 @@ -// RUN: %clang_cc1 -triple arm64-apple-ios -fptrauth-calls -emit-llvm -fexceptions -fobjc-exceptions -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple arm64-apple-ios -fptrauth-calls -emit-llvm -fexceptions -fobjc-exceptions -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple arm64-apple-ios -fptrauth-type-info-vtable-pointer-discrimination -fptrauth-calls -emit-llvm -fexceptions -fobjc-exceptions -o - %s | FileCheck --check-prefix=TYPEDISC_TYPEINFO %s __attribute__((objc_root_class)) @interface Root { @@ -13,4 +14,5 @@ @interface A : Root @implementation A @end -// CHECK: @"OBJC_EHTYPE_$_A" = global {{%.*}} { ptr ptrauth (ptr getelementptr inbounds (ptr, ptr @objc_ehtype_vtable, i32 2), i32 2), + // CHECK: @"OBJC_EHTYPE_$_A" = global {{%.*}} { ptr ptrauth (ptr getelementptr inbounds (ptr, ptr @objc_ehtype_vtable, i32 2), i32 2), +// TYPEDISC_TYPEINFO: @"OBJC_EHTYPE_$_A" = global {{%.*}} { ptr ptrauth (ptr getelementptr inbounds (ptr, ptr @objc_ehtype_vtable, i32 2), i32 2, i64 45546, ptr @"OBJC_EHTYPE_$_A"), >From 252ff4d187b8b75933ef60530dbd7b5ce8b042e5 Mon Sep 17 00:00:00 2001 From: Oliver Hunt <oli...@apple.com> Date: Tue, 3 Jun 2025 19:31:34 -0700 Subject: [PATCH 3/4] reformatting --- clang/lib/CodeGen/CGObjCMac.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp index 0810dde380621..b587606936e58 100644 --- a/clang/lib/CodeGen/CGObjCMac.cpp +++ b/clang/lib/CodeGen/CGObjCMac.cpp @@ -7684,8 +7684,9 @@ CGObjCNonFragileABIMac::GetInterfaceEHType(const ObjCInterfaceDecl *ID, if (auto &Schema = CGM.getCodeGenOpts().PointerAuth.CXXTypeInfoVTablePointer) { - assert(!Schema.hasOtherDiscrimination() || - Schema.getOtherDiscrimination() == PointerAuthSchema::Discrimination::Constant); + assert(!Schema.hasOtherDiscrimination() || + Schema.getOtherDiscrimination() == + PointerAuthSchema::Discrimination::Constant); values.addSignedPointer(VTablePtr, Schema, GlobalDecl(), QualType()); } else { values.add(VTablePtr); >From 86a6d7f33d9465ef9ca608665cc1d8f2ad4d59c8 Mon Sep 17 00:00:00 2001 From: Oliver Hunt <oli...@apple.com> Date: Wed, 4 Jun 2025 12:16:26 -0700 Subject: [PATCH 4/4] Update clang/docs/ReleaseNotes.rst Co-authored-by: John McCall <rjmcc...@apple.com> --- clang/docs/ReleaseNotes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 5f69ef8b865c1..95fc8a7d5c979 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -317,7 +317,7 @@ Non-comprehensive list of changes in this release ``sizeof`` or ``typeof`` expression. (#GH138444) - Deprecation warning is emitted for the deprecated ``__reference_binds_to_temporary`` intrinsic. ``__reference_constructs_from_temporary`` should be used instead. (#GH44056) -- Support authenticated ``type_info`` vtable pointers in Objective-C++ +- Support pointer authentication for Objective-C exception `type_info` objects New Compiler Flags ------------------ _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits