[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 01:01:25 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:

Do we care about the C case at all? (ie, the case where a RecordDecl is not a CXXRecord decl?)
C support so far is not something I considered

https://github.com/llvm/llvm-project/pull/143796


More information about the cfe-commits mailing list