[clang] [clang] Fix PointerAuth semantics of cpp_trivially_relocatable (PR #143796)
Corentin Jabot via cfe-commits
cfe-commits at lists.llvm.org
Thu Jun 12 02:04:34 PDT 2025
================
@@ -1698,13 +1698,47 @@ ASTContext::getRelocationInfoForCXXRecord(const CXXRecordDecl *RD) const {
}
void ASTContext::setRelocationInfoForCXXRecord(
- const CXXRecordDecl *RD, CXXRecordDeclRelocationInfo Info) {
+ const CXXRecordDecl *RD, const CXXRecordDeclRelocationInfo &Info) {
assert(RD);
CXXRecordDecl *D = RD->getDefinition();
assert(RelocatableClasses.find(D) == RelocatableClasses.end());
RelocatableClasses.insert({D, Info});
}
+bool ASTContext::containsAddressDiscriminatedPointerAuth(QualType T) {
+ if (!LangOpts.PointerAuthCalls && !LangOpts.PointerAuthIntrinsics)
+ return false;
+
+ T = T.getCanonicalType();
+ if (T.hasAddressDiscriminatedPointerAuth())
+ return true;
+ const RecordDecl *RD = T->getAsRecordDecl();
+ if (!RD)
+ return false;
+
+ auto SaveReturn = [this, RD](bool Result) {
+ RecordContainsAddressDiscriminatedPointerAuth.insert({RD, Result});
+ return Result;
+ };
+ if (auto Existing = RecordContainsAddressDiscriminatedPointerAuth.find(RD);
+ Existing != RecordContainsAddressDiscriminatedPointerAuth.end())
+ return Existing->second;
+ if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
+ if (CXXRD->isPolymorphic() &&
+ hasAddressDiscriminatedVTableAuthentication(CXXRD))
+ return SaveReturn(true);
+ for (auto Base : CXXRD->bases()) {
+ if (containsAddressDiscriminatedPointerAuth(Base.getType()))
+ return SaveReturn(true);
+ }
+ }
+ for (auto *FieldDecl : RD->fields()) {
+ if (containsAddressDiscriminatedPointerAuth(FieldDecl->getType()))
+ return SaveReturn(true);
+ }
----------------
cor3ntin wrote:
I think it's reasonable to cache the result in a map, and optimize later.
Maybe we can make it work for C++ now, and open an issue for C ?
https://github.com/llvm/llvm-project/pull/143796
More information about the cfe-commits
mailing list