Skip to content

Commit 15b1a81

Browse files
committed
Address corentin comments
1 parent 3190a52 commit 15b1a81

File tree

2 files changed

+22
-26
lines changed

2 files changed

+22
-26
lines changed

clang/include/clang/AST/ASTContext.h

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -635,14 +635,14 @@ class ASTContext : public RefCountedBase<ASTContext> {
635635
/// implicitly authenticated values like vtable pointers, as well as
636636
/// explicitly qualified fields.
637637
bool containsAddressDiscriminatedPointerAuth(QualType T);
638-
639-
private:
640638
// A simple helper function to short circuit pointer auth checks.
639+
641640
bool isPointerAuthenticationAvailable() const {
642641
return LangOpts.PointerAuthCalls || LangOpts.PointerAuthIntrinsics ||
643642
LangOpts.PointerAuthVTPtrAddressDiscrimination;
644643
}
645644

645+
private:
646646
llvm::DenseMap<const CXXRecordDecl *, CXXRecordDeclRelocationInfo>
647647
RelocatableClasses;
648648

@@ -3686,12 +3686,6 @@ OPT_LIST(V)
36863686
const CXXRecordDecl *
36873687
baseForVTableAuthentication(const CXXRecordDecl *ThisClass);
36883688

3689-
/// If this class is polymorphic, returns true if any of this class's
3690-
/// vtable pointers have an address discriminated pointer authentication
3691-
/// schema.
3692-
/// This does not check fields of the class or base classes.
3693-
bool hasAddressDiscriminatedVTableAuthentication(const CXXRecordDecl *Class);
3694-
36953689
bool useAbbreviatedThunkName(GlobalDecl VirtualMethodDecl,
36963690
StringRef MangledName);
36973691

clang/lib/AST/ASTContext.cpp

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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

17081724
bool 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-
1517515177
bool ASTContext::useAbbreviatedThunkName(GlobalDecl VirtualMethodDecl,
1517615178
StringRef MangledName) {
1517715179
auto *Method = cast<CXXMethodDecl>(VirtualMethodDecl.getDecl());

0 commit comments

Comments
 (0)