Skip to content

Fix ptrauth after merge #8651

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Apr 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions clang/lib/CodeGen/CGCXXABI.h
Original file line number Diff line number Diff line change
Expand Up @@ -471,6 +471,12 @@ class CGCXXABI {
BaseSubobject Base,
const CXXRecordDecl *NearestVBase) = 0;

/// Get the address point of the vtable for the given base subobject while
/// building a constexpr.
virtual llvm::Constant *
getVTableAddressPointForConstExpr(BaseSubobject Base,
const CXXRecordDecl *VTableClass) = 0;

/// Get the address of the vtable for the given record decl which should be
/// used for the vptr at the given offset in RD.
virtual llvm::GlobalVariable *getAddrOfVTable(const CXXRecordDecl *RD,
Expand Down
4 changes: 2 additions & 2 deletions clang/lib/CodeGen/CGExprConstant.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -801,8 +801,8 @@ bool ConstStructBuilder::Build(const APValue &Val, const RecordDecl *RD,
// Add a vtable pointer, if we need one and it hasn't already been added.
if (Layout.hasOwnVFPtr()) {
llvm::Constant *VTableAddressPoint =
CGM.getCXXABI().getVTableAddressPoint(BaseSubobject(CD, Offset),
VTableClass);
CGM.getCXXABI().getVTableAddressPointForConstExpr(
BaseSubobject(CD, Offset), VTableClass);
if (!AppendBytes(Offset, VTableAddressPoint))
return false;
}
Expand Down
16 changes: 16 additions & 0 deletions clang/lib/CodeGen/ItaniumCXXABI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,10 @@ class ItaniumCXXABI : public CodeGen::CGCXXABI {
CodeGenFunction &CGF, const CXXRecordDecl *VTableClass,
BaseSubobject Base, const CXXRecordDecl *NearestVBase);

llvm::Constant *
getVTableAddressPointForConstExpr(BaseSubobject Base,
const CXXRecordDecl *VTableClass) override;

llvm::GlobalVariable *getAddrOfVTable(const CXXRecordDecl *RD,
CharUnits VPtrOffset) override;

Expand Down Expand Up @@ -2088,6 +2092,18 @@ llvm::Value *ItaniumCXXABI::getVTableAddressPointInStructorWithVTT(
return AP;
}

llvm::Constant *
ItaniumCXXABI::getVTableAddressPointForConstExpr(BaseSubobject Base,
const CXXRecordDecl *VTableClass) {
auto AP = getVTableAddressPoint(Base, VTableClass);

if (auto &Schema = CGM.getCodeGenOpts().PointerAuth.CXXVTablePointers)
AP = CGM.getConstantSignedPointer(AP, Schema, nullptr, GlobalDecl(),
QualType());

return AP;
}

llvm::GlobalVariable *ItaniumCXXABI::getAddrOfVTable(const CXXRecordDecl *RD,
CharUnits VPtrOffset) {
assert(VPtrOffset.isZero() && "Itanium ABI only supports zero vptr offsets");
Expand Down
11 changes: 11 additions & 0 deletions clang/lib/CodeGen/MicrosoftCXXABI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,10 @@ class MicrosoftCXXABI : public CGCXXABI {
CodeGenFunction &CGF, const CXXRecordDecl *VTableClass,
BaseSubobject Base, const CXXRecordDecl *NearestVBase) override;

llvm::Constant *
getVTableAddressPointForConstExpr(BaseSubobject Base,
const CXXRecordDecl *VTableClass) override;

llvm::GlobalVariable *getAddrOfVTable(const CXXRecordDecl *RD,
CharUnits VPtrOffset) override;

Expand Down Expand Up @@ -1788,6 +1792,13 @@ MicrosoftCXXABI::getVTableAddressPoint(BaseSubobject Base,
return VFTablesMap[ID];
}

llvm::Constant *MicrosoftCXXABI::getVTableAddressPointForConstExpr(
BaseSubobject Base, const CXXRecordDecl *VTableClass) {
llvm::Constant *VFTable = getVTableAddressPoint(Base, VTableClass);
assert(VFTable && "Couldn't find a vftable for the given base?");
return VFTable;
}

llvm::GlobalVariable *MicrosoftCXXABI::getAddrOfVTable(const CXXRecordDecl *RD,
CharUnits VPtrOffset) {
// getAddrOfVTable may return 0 if asked to get an address of a vtable which
Expand Down
4 changes: 2 additions & 2 deletions clang/test/CodeGen/ptrauth-debuginfo.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ extern int external_int;
// CHECK: !DIDerivedType(tag: DW_TAG_LLVM_ptrauth_type,
// CHECK-SAME: ptrAuthKey: 1,
// CHECK-SAME: ptrAuthIsAddressDiscriminated: false,
// CHECK-SAME: ptrAuthExtraDiscriminator: 1234)
// CHECK-SAME: ptrAuthExtraDiscriminator: 1234,
int * __ptrauth(1,0,1234) g1 = &external_int;

struct A {
Expand All @@ -23,4 +23,4 @@ void f() {
// CHECK: !DIDerivedType(tag: DW_TAG_LLVM_ptrauth_type,
// CHECK-SAME: ptrAuthKey: 1,
// CHECK-SAME: ptrAuthIsAddressDiscriminated: true,
// CHECK-SAME: ptrAuthExtraDiscriminator: 1)
// CHECK-SAME: ptrAuthExtraDiscriminator: 1,