@@ -1704,6 +1704,22 @@ void ASTContext::setRelocationInfoForCXXRecord(
17041704 assert(RelocatableClasses.find(D) == RelocatableClasses.end());
17051705 RelocatableClasses.insert({D, Info});
17061706}
1707+ static bool
1708+ hasAddressDiscriminatedVTableAuthentication(ASTContext &Context,
1709+ const CXXRecordDecl *Class) {
1710+ if (!Context.isPointerAuthenticationAvailable() || !Class->isPolymorphic())
1711+ return false;
1712+ const CXXRecordDecl *BaseType = Context.baseForVTableAuthentication(Class);
1713+ using AuthAttr = VTablePointerAuthenticationAttr;
1714+ const AuthAttr *ExplicitAuth = BaseType->getAttr<AuthAttr>();
1715+ if (!ExplicitAuth)
1716+ return Context.getLangOpts().PointerAuthVTPtrAddressDiscrimination;
1717+ AuthAttr::AddressDiscriminationMode AddressDiscrimination =
1718+ ExplicitAuth->getAddressDiscrimination();
1719+ if (AddressDiscrimination == AuthAttr::DefaultAddressDiscrimination)
1720+ return Context.getLangOpts().PointerAuthVTPtrAddressDiscrimination;
1721+ return AddressDiscrimination == AuthAttr::AddressDiscrimination;
1722+ }
17071723
17081724bool ASTContext::containsAddressDiscriminatedPointerAuth(QualType T) {
17091725 if (!isPointerAuthenticationAvailable())
@@ -1721,12 +1737,14 @@ bool ASTContext::containsAddressDiscriminatedPointerAuth(QualType T) {
17211737 return Existing->second;
17221738
17231739 auto SaveReturn = [this, RD](bool Result) {
1724- RecordContainsAddressDiscriminatedPointerAuth.insert({RD, Result});
1740+ auto __unused[ResultIter, DidAdd] =
1741+ RecordContainsAddressDiscriminatedPointerAuth.try_emplace(RD, Result);
1742+ assert(DidAdd);
17251743 return Result;
17261744 };
17271745 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
17281746 if (CXXRD->isPolymorphic() &&
1729- hasAddressDiscriminatedVTableAuthentication(CXXRD))
1747+ hasAddressDiscriminatedVTableAuthentication(*this, CXXRD))
17301748 return SaveReturn(true);
17311749 for (auto Base : CXXRD->bases()) {
17321750 if (containsAddressDiscriminatedPointerAuth(Base.getType()))
@@ -15156,22 +15174,6 @@ ASTContext::baseForVTableAuthentication(const CXXRecordDecl *ThisClass) {
1515615174 return PrimaryBase;
1515715175}
1515815176
15159- bool ASTContext::hasAddressDiscriminatedVTableAuthentication(
15160- const CXXRecordDecl *Class) {
15161- if (!isPointerAuthenticationAvailable() || !Class->isPolymorphic())
15162- return false;
15163- const CXXRecordDecl *BaseType = baseForVTableAuthentication(Class);
15164- using AuthAttr = VTablePointerAuthenticationAttr;
15165- const AuthAttr *ExplicitAuth = BaseType->getAttr<AuthAttr>();
15166- if (!ExplicitAuth)
15167- return LangOpts.PointerAuthVTPtrAddressDiscrimination;
15168- AuthAttr::AddressDiscriminationMode AddressDiscrimination =
15169- ExplicitAuth->getAddressDiscrimination();
15170- if (AddressDiscrimination == AuthAttr::DefaultAddressDiscrimination)
15171- return LangOpts.PointerAuthVTPtrAddressDiscrimination;
15172- return AddressDiscrimination == AuthAttr::AddressDiscrimination;
15173- }
15174-
1517515177bool ASTContext::useAbbreviatedThunkName(GlobalDecl VirtualMethodDecl,
1517615178 StringRef MangledName) {
1517715179 auto *Method = cast<CXXMethodDecl>(VirtualMethodDecl.getDecl());
0 commit comments