================ @@ -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:
Establishing relocatability needs to do lookups, so it's expensive - this is why we only compute it on demand. However, for "containsAddressDiscriminatedPointerAuth", maybe that's something we can establish as we build the class, and have the result stored in DefinitionData. Is that something you considered? https://github.com/llvm/llvm-project/pull/143796 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits