[clang] [clang][CGObjC] Sign the v-table pointer in ObjC exception RTTI. (PR #135562)
via cfe-commits
cfe-commits at lists.llvm.org
Sun Apr 13 13:42:27 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Oliver Hunt (ojhunt)
<details>
<summary>Changes</summary>
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++.
---
Full diff: https://github.com/llvm/llvm-project/pull/135562.diff
5 Files Affected:
- (modified) clang/docs/ReleaseNotes.rst (+1)
- (modified) clang/include/clang/CodeGen/ConstantInitBuilder.h (+3)
- (modified) clang/lib/CodeGen/CGObjCMac.cpp (+18-2)
- (modified) clang/lib/CodeGen/ConstantInitBuilder.cpp (+12)
- (added) clang/test/CodeGenObjC/ptrauth-attr-exception.m (+16)
``````````diff
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))
+ at interface Root {
+ Class isa;
+}
+ at end
+
+__attribute__((objc_exception))
+ at interface A : Root
+ at end
+
+ at implementation A
+ at end
+
+// CHECK: @"OBJC_EHTYPE_$_A" = global {{%.*}} { ptr ptrauth (ptr getelementptr inbounds (ptr, ptr @objc_ehtype_vtable, i32 2), i32 2),
``````````
</details>
https://github.com/llvm/llvm-project/pull/135562
More information about the cfe-commits
mailing list