[clang] [PAC][clang] Implement address/type discrimination for VTT vtable pointers (PR #205808)
Oliver Hunt via cfe-commits
cfe-commits at lists.llvm.org
Fri Jul 10 11:48:01 PDT 2026
================
@@ -2221,13 +2222,19 @@ llvm::Value *ItaniumCXXABI::getVTableAddressPointInStructorWithVTT(
CGF.Builder.CreateAlignedLoad(CGF.GlobalsVoidPtrTy, VTT,
CGF.getPointerAlign());
- if (auto &Schema = CGF.CGM.getCodeGenOpts().PointerAuth.CXXVTTVTablePointers) {
- CGPointerAuthInfo PointerAuth = CGF.EmitPointerAuthInfo(Schema, VTT,
- GlobalDecl(),
- QualType());
+ if (auto &Schema = CGM.getCodeGenOpts().PointerAuth.CXXVTTVTablePointers) {
+ llvm::ConstantInt *TypeDesc = nullptr;
+ if (Schema.getOtherDiscrimination() ==
+ PointerAuthSchema::Discrimination::Type)
+ TypeDesc = llvm::ConstantInt::get(
+ CGM.IntPtrTy,
+ CGM.getContext().getPointerAuthVTablePointerDiscriminator(
----------------
ojhunt wrote:
Sorry, I wasn't clear here, and you're correct that per vtable encoding would indeed break things.
What I was actually trying to say was to semi-generalize the existing `getPointerAuthVTablePointerDiscriminator` to provide discriminators for the non-function primary base specific entries, e.g
```cpp
enum class VTableEnumWithGoodName { VTable, VTT, ... };
std::optional<PointerAuthQualifier> computeVTPointerAuthentication(const CXXRecordDecl *ThisClass, VTableEnumWithGoodName SlotKind) {
...
Discriminator = Context.getPointerAuthVTablePointerDiscriminator(PrimaryBase, SlotKind);
...
uint16_t getPointerAuthVTablePointerDiscriminator(const CXXRecordDecl *RD, SlotKind) {
...
switch (SlotKind) {
case vtable: mangleCXXVTable(RD);
case vtt: mangleCXXVTT(RD);
...
}
```
Or something to that effect.
https://github.com/llvm/llvm-project/pull/205808
More information about the cfe-commits
mailing list