Skip to content

Commit 908da16

Browse files
committed
Support [[clang::ptrauth_vtable_pointer(...)]] attribute
1 parent b540ebc commit 908da16

File tree

2 files changed

+83
-0
lines changed

2 files changed

+83
-0
lines changed

clang/lib/CodeGen/CGDebugInfo.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2432,6 +2432,47 @@ void CGDebugInfo::CollectVTableInfo(const CXXRecordDecl *RD, llvm::DIFile *Unit,
24322432
if (!VPtrTy)
24332433
VPtrTy = getOrCreateVTablePtrType(Unit);
24342434

2435+
if (auto *VptrAuthAttr = RD->getAttr<VTablePointerAuthenticationAttr>()) {
2436+
unsigned TypedDiscriminator =
2437+
CGM.getContext().getPointerAuthVTablePointerDiscriminator(RD);
2438+
auto &LangOpts = CGM.getContext().getLangOpts();
2439+
2440+
unsigned Key = VptrAuthAttr->getKey();
2441+
2442+
bool HasAddressDiscrimination =
2443+
LangOpts.PointerAuthVTPtrAddressDiscrimination;
2444+
if (VptrAuthAttr->getAddressDiscrimination() !=
2445+
VTablePointerAuthenticationAttr::DefaultAddressDiscrimination) {
2446+
HasAddressDiscrimination =
2447+
(VptrAuthAttr->getAddressDiscrimination() ==
2448+
VTablePointerAuthenticationAttr::AddressDiscrimination);
2449+
}
2450+
2451+
unsigned ExtraDiscriminator = 0;
2452+
2453+
switch (VptrAuthAttr->getExtraDiscrimination()) {
2454+
case VTablePointerAuthenticationAttr::DefaultExtraDiscrimination:
2455+
if (LangOpts.PointerAuthVTPtrTypeDiscrimination)
2456+
ExtraDiscriminator = TypedDiscriminator;
2457+
break;
2458+
case VTablePointerAuthenticationAttr::TypeDiscrimination:
2459+
ExtraDiscriminator = TypedDiscriminator;
2460+
break;
2461+
case VTablePointerAuthenticationAttr::CustomDiscrimination:
2462+
ExtraDiscriminator = VptrAuthAttr->getCustomDiscriminationValue();
2463+
break;
2464+
case VTablePointerAuthenticationAttr::NoExtraDiscrimination:
2465+
break;
2466+
}
2467+
2468+
// See CodeGenModule::computeVTPointerAuthentication:
2469+
// isIsaPointer and authenticatesNullValues are always false.
2470+
VPtrTy = DBuilder.createPtrAuthQualifiedType(
2471+
VPtrTy, Key, HasAddressDiscrimination, ExtraDiscriminator,
2472+
/* isIsaPointer */ false,
2473+
/* authenticatesNullValues */ false);
2474+
}
2475+
24352476
unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy);
24362477
llvm::DIType *VPtrMember =
24372478
DBuilder.createMemberType(Unit, getVTableName(RD), Unit, 0, Size, 0, 0,

lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1842,6 +1842,48 @@ DWARFASTParserClang::ParseStructureLikeDIE(const SymbolContext &sc,
18421842
attrs.name.GetCString(), tag_decl_kind, attrs.class_language,
18431843
&metadata, attrs.exports_symbols);
18441844
}
1845+
1846+
if (metadata.GetIsDynamicCXXType()) {
1847+
clang::RecordDecl *record_decl = m_ast.GetAsRecordDecl(clang_type);
1848+
DWARFDIE vptr_type_die =
1849+
die.GetFirstChild().GetAttributeValueAsReferenceDIE(DW_AT_type);
1850+
if (vptr_type_die.Tag() == DW_TAG_LLVM_ptrauth_type) {
1851+
unsigned key = vptr_type_die.GetAttributeValueAsUnsigned(
1852+
DW_AT_LLVM_ptrauth_key, -1);
1853+
unsigned discriminator = vptr_type_die.GetAttributeValueAsUnsigned(
1854+
DW_AT_LLVM_ptrauth_extra_discriminator, -1);
1855+
unsigned has_addr_discr = vptr_type_die.GetAttributeValueAsUnsigned(
1856+
DW_AT_LLVM_ptrauth_address_discriminated, -1);
1857+
1858+
auto error_missing = [&vptr_type_die](const dw_attr_t attr) {
1859+
vptr_type_die.GetDWARF()->GetObjectFile()->GetModule()->ReportError(
1860+
"[{0:x16}]: missing attribute {1:x4} ({2}) required for signed "
1861+
"vtable pointer",
1862+
vptr_type_die.GetOffset(), attr, DW_AT_value_to_name(attr));
1863+
};
1864+
1865+
if (key == unsigned(-1))
1866+
error_missing(DW_AT_LLVM_ptrauth_key);
1867+
if (discriminator == unsigned(-1))
1868+
error_missing(DW_AT_LLVM_ptrauth_extra_discriminator);
1869+
if (has_addr_discr == unsigned(-1))
1870+
error_missing(DW_AT_LLVM_ptrauth_extra_discriminator);
1871+
1872+
record_decl->addAttr(
1873+
clang::VTablePointerAuthenticationAttr::CreateImplicit(
1874+
m_ast.getASTContext(),
1875+
key == 2
1876+
? clang::VTablePointerAuthenticationAttr::ProcessDependent
1877+
: clang::VTablePointerAuthenticationAttr::
1878+
ProcessIndependent,
1879+
has_addr_discr ? clang::VTablePointerAuthenticationAttr::
1880+
AddressDiscrimination
1881+
: clang::VTablePointerAuthenticationAttr::
1882+
NoAddressDiscrimination,
1883+
clang::VTablePointerAuthenticationAttr::CustomDiscrimination,
1884+
discriminator));
1885+
}
1886+
}
18451887
}
18461888

18471889
// Store a forward declaration to this class type in case any

0 commit comments

Comments
 (0)